2019-10-06 18:22:55 qq_40808154 阅读数 687

之前在网上看到一个题目使用语音控制你的浏览器,感觉挺有意思的,就想着实现一个简单的语音识别程序,这里我选择的是百度语音识别,还有好多不错的如科大讯飞等都可以使用。

语音识别过程分为三个部分:

1)录音

2)获取参数access token,有效期为一个月(开发文档)

3)上传录音文件

1.首先你需要一个注册一个百度账号,进行登录,可以直接使用注册过的百度网盘账号进行登录,登录的网址在此处https://login.bce.baidu.com/,选择语音识别,点击创建应用,为你的应用起一个名字:

 创建完成后,如下图所示,AppID,API Key,Secret Key这三个参数需要用到

 

 然后看百度相关的技术开发文档,必要的参数一定带全。

2.由于需要进行录音,这里使用到pyaudio库,需要先进行安装,但是直接使用pip install pyaudio进行安装会出现错误,推荐使用下面的命令进行安装:
sudo apt-get install portaudio19-dev python-all-dev python3-all-dev

pip install pyaudio

安装成功后,接下来开始第1部分录音,代码中都有详细的注释,直接上代码:

import pyaudio
import wave
import requests
import json
import base64
import os


#1.录音
#用Pyaudio录制音频(该库可以进行录音,播放,生成wav文件)
def audio_record(rec_time,filename):
    """
    :param rec_time: 音频录制时间
    :param filename: 输出音频文件名
    """
    CHUNK=1024#定义数据流块
    FORMAT=pyaudio.paInt16#16bit编码格式
    CHANNELS=1#单声道
    RATE=16000#16000采样频率
    #创建一个音频对象
    p=pyaudio.PyAudio()
    #创建音频数据流
    stream=p.open(format=FORMAT,#音频流wav格式
                  channels=CHANNELS,#单声道
                  rate=RATE,#采样率16000
                  input=True,#输入
                  frames_per_buffer=CHUNK)
    print('start recording...')
    frames=list()#空列表用于保存录制的音频流
    #录制音频数据
    for i in range(0,int(RATE/CHUNK*rec_time)):
        data=stream.read(CHUNK)
        frames.append(data)
    #录制完成
    print(frames)
    #停止数据流
    stream.stop_stream()
    stream.close()
    #关闭pyaudio
    p.terminate()
    print('recording done...')
    #保存音频文件
    with wave.open(filename,'wb') as f:
        f.setnchannels(CHANNELS)#设置音频声道数
        f.setsampwidth(p.get_sample_size(FORMAT))#以字节为单位返回样本宽度
        f.setframerate(RATE)#设置取样频率

第2部分,获取参数token

#2 使用appKey secretKey 访问 https://openapi.baidu.com 换取 token
def Get_token():
    #baidu_server='https://openapi.baidu.com/oauth/2.0/token'
    grant_type = 'client_credentials'
    # API KEY
    client_id = 'PrKnhUppGEsqrG8mVG2qIq8O'
    # SECRERT KEY
    client_secret = 'Al4cRfrlRGaMCCkz3kLsd4MXOoQP28iD'

    # 拼接url
    url = 'https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&client_id={}&client_secret={}'.format(
            client_id, client_secret)
    # 发送Post请求 获取acess_token
    req = requests.post(url)
    data_dict = json.loads(req.text)  # 将json字符串转换为python字典
    print(req.text)
    print(data_dict['access_token'])

    return data_dict['access_token']


此段代码,可以单独运行下,打印token看是否能获取到,token指为如下所示:

返回的数据:scope中含有audio_voice_assistant_get 表示有语音识别能力, 注意语音服务的调用地址是https://openapi.baidu.com/oauth/2.0/token

第3部分,上传录音(有两种方式:第一种是Json方式,第二种方式是Raw方式,详细见开发文档)

#3.上传录音文件
def BaiduYuYin(file_url,token):
    try:
        RATE='16000'
        FORMAT='wav'
        CUID='wate_play'
        DEV_PID='1536' #普通话:支持简单的英文识别

        file_url=file_url
        token = token

        #以字节格式读取文件之后进行编码
        with open(file_url,'rb') as f:
            speech=base64.b64encode(f.read()).decode('utf-8')
        size = os.path.getsize(file_url)#语音文件的字节数
        headers={'Content-Type':'application/json'}#json格式post上传本地文件
        url='https://vop.baidu.com/server_api'
        data={
            "format":FORMAT,#格式
            "rate":RATE,#取样频率,固定值16000
            "dev_pid":DEV_PID,#语音识别类型
            "speech":speech,#本地语音文件的二进制数据,需要进行base64编码
            "cuid":CUID,#用户唯一标识,用来区分用户 建议填写能区分用户的机器MAC地址或IMEI码,长度为60字符以内。
            "len":size,#语音文件的字节数
            "channel":1,#声道数,仅支持单声道,固定值为1
            "token":token,
        }
        req=requests.post(url,json.dumps(data),headers)
        data_dict=json.loads(req.text)
        print(data_dict['result'][0])
        return data_dict['result'][0][::-1]
    except:
        return '识别不清楚'

最后写一个调度函数run(),运行程序

#4.调度
def run(rec_time,file_name):
    #1.录音
    audio_record(rec_time,file_name)

    #2.获取token
    access_token=Get_token()

    #3.上传录音
    BaiduYuYin(file_name,access_token)


if __name__ == '__main__':
    #录音时间为5秒,文件名为'record1.wav'
    run(5,'record1.wav')

若想要你的电脑可以录音,需要提前打开麦克风,运行此程序后在五秒内说出一段话(可能需要大点声),控制台会打印出来,测试过之后发现准确率还可以,

2019-02-15 12:14:12 chen_pan_pan 阅读数 6385

小程序实现语音识别功能,通过语音的方式代替手动输入查询。经过查询微信小程序api,发现微信并没有对外提供语音识别的api,所以要另外想办法。经过多发查找资料发现了思路。

解决思路:

微信小程序提供了录音的功能,通过录音的方式,然后把录音文件传到服务器,后台服务器将语音转码,然后再调用第三方语音识别api,我这里使用的是百度的api,最后在将识别的文字返回给微信小程序。

直接上代码:

小程序端代码:

startRecord: function() {

if (this.recorderManager == null) {

this.recorderManager = wx.getRecorderManager();

this.options = {

duration: 10000,

sampleRate: 16000,

numberOfChannels: 1,

encodeBitRate: 64000,

format: 'mp3',

frameSize: 50

}

}

this.recorderManager.start(this.options);

this.recorderManager.onStop((res) => {

console.log(res)

wx.uploadFile({

url: 'https://xxxx',//将录音文件传到后台服务器

filePath: res.tempFilePath,

method:'POST',

name: 'file',

header: {

'content-type': 'multipart/form-data'

},

success: function(res) {

console.log(res);

},

fail: function() {

console.log("语音识别失败");

}

})

});

},

stopRecord: function() {

this.recorderManager.stop()

}

 

服务端代码:

注意:需要使用mp3plugin.jar包,网上可以下载到。

    // 百度语音识别
    public static final String APP_ID = "xxx";
    public static final String API_KEY = "xxx";
    public static final String SECRET_KEY = "xxx";

    /**
     * @Description TODO
     * @return
     */
    @RequestMapping(value = "speechRecognition", method = RequestMethod.POST)
    @ResponseBody
    public Object speechReco(HttpServletRequest request) {
        MultipartFile file = ((MultipartHttpServletRequest) request).getFile("file");
        try {
            byte[] pcmBytes = mp3Convertpcm(file.getInputStream());
            org.json.JSONObject resultJson = speechBdApi(pcmBytes);
            System.out.println(resultJson.toString());
            if (null != resultJson && resultJson.getInt("err_no") == 0) {
                return resultJson.getJSONArray("result").get(0).toString().split(",")[0];
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return "";
    }

    /**
     * @Description MP3转换pcm
     * @param mp3Stream
     *            原始文件流
     * @return 转换后的二进制
     * @throws Exception
     */
    public byte[] mp3Convertpcm(InputStream mp3Stream) throws Exception {
        // 原MP3文件转AudioInputStream
        BufferedInputStream zipTest=new BufferedInputStream(mp3Stream);
        //重新包装一层,不然会报错。
        AudioInputStream mp3audioStream = AudioSystem.getAudioInputStream(zipTest);
        // 将AudioInputStream MP3文件 转换为PCM AudioInputStream
        AudioInputStream pcmaudioStream = AudioSystem.getAudioInputStream(AudioFormat.Encoding.PCM_SIGNED,
                mp3audioStream);
        byte[] pcmBytes = IOUtils.toByteArray(pcmaudioStream);
        pcmaudioStream.close();
        mp3audioStream.close();
        return pcmBytes;
    }

    /**
     * @Description 调用百度语音识别API
     * @param pcmBytes
     * @return
     */
    public static org.json.JSONObject speechBdApi(byte[] pcmBytes) {
        // 初始化一个AipSpeech
        AipSpeech client = new AipSpeech(APP_ID, API_KEY, SECRET_KEY);
        // 可选:设置网络连接参数
        client.setConnectionTimeoutInMillis(2000);
        client.setSocketTimeoutInMillis(60000);
        // 调用接口
        org.json.JSONObject res = client.asr(pcmBytes, "pcm", 16000, null);
        return res;
    }

 

如果我的文章帮助到了大家,减少大家的弯路,愿意打赏的请扫下面的二维码。也可留言。

 

2019-10-11 20:42:34 Change_xiao 阅读数 245

微信前台录入语音PHP后台调用百度AI进行语音识别

先去百度AI下载 PHP sdk
目录如下
在这里插入图片描述
**

由于微信小程序暂且支持真机调试才会出现效果
所以真机调试的设备必须与js中发起请求的url在同一网络下

**

微信前台代码
.html

<button type='primary' bindtouchstart='startrecorderHandel' bindtouchend="sendrecorderHandel">点击录音</button>
<view>
  你说的话是:
  <view>
    {{msg}}
  </view>
</view>

.js

// 录音对象
const recorderManager = wx.getRecorderManager();

function sendRecord(src) {
  var obj = {
    url: "http://49.122.47.146/php-yuyin/yuyin.php",
    filePath: src,
    name: "recordFile",
    header: {
      'Content-Type': 'application/json'
    },
    success: function (result) {
      var data = JSON.parse(result.data);
      // msg 为最终语音识别的字符串
      var msg = data.result;
      // 获取当前页面对象
      var page = getCurrentPages()[0];
      page.setData({ msg: msg });
    },
    fail: function (err) {
      console.log(err);
    }
  };
  wx.uploadFile(obj)
}

// 结束录音的时候触发 
recorderManager.onStop((res) => {
  // 获取文件路径-提交到后台-后台发送到百度
  sendRecord(res.tempFilePath);
})

recorderManager.onError ((res) => {
  console.log("error", res);
});

Page({

  /**
   * 页面的初始数据
   */
  data: {
    msg: ""
  },
  // 按下按钮的时候触发
  startrecorderHandel() {
    // 开始录音
    recorderManager.start({
    });
  },
  // 松开按钮的时候触发-发送录音
  sendrecorderHandel() {
    // 结束录音
    recorderManager.stop();
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    wx.authorize({
      scope: 'record'
    })
  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady: function () {

  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function () {

  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide: function () {

  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload: function () {

  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh: function () {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom: function () {

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage: function () {

  }
})

PHP后台代码

<?php
/**
 * 调用百度AI识别语音
 */
require_once "aip-speech-php-sdk-1.6.0/AipSpeech.php";

$name = "./upload/".$_FILES['recordFile']['name'];
if(move_uploaded_file($_FILES['recordFile']['tmp_name'],$name)){

    $APP_ID = '你的$APP_ID';//你的$APP_ID
    $API_KEY = '你的$API_KEY';//你的$API_KEY
    $SECRET_KEY = '你的$SECRET_KEY';//你的$SECRET_KEY

    $client = new AipSpeech($APP_ID, $API_KEY, $SECRET_KEY);
    $res = $client->asr(file_get_contents($name), 'm4a', 16000, array(
        'dev_pid' => 1536,
    ));
    echo json_encode($res);
    die();
}else{
    echo "上传失败";
}

die();
2010-08-03 13:26:00 xieyan0811 阅读数 4497

 

 

 

1.     说明
以下例程功能为:在应用程序中使用intent来调出语言识别界面,录音并识别后将识别的字串返回给应用程序。注意:使用前需要安装语音识别程序如语音搜索。

2.     本例参考自android例程:
development/samples/ApiDemos/src/com/example/android/apis/app/VoiceRecognition.java

3.     可从此处下载可独立运行的代码:
http://download.csdn.net/source/2591401

4.     核心代码及说明

package com.android.mystt1;

 

import android.app.Activity;

import android.content.Intent;

import android.content.pm.PackageManager;

import android.content.pm.ResolveInfo;

import android.os.Bundle;

import android.speech.RecognizerIntent;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.ArrayAdapter;

import android.widget.Button;

import android.widget.ListView;

 

import java.util.ArrayList;

import java.util.List;

 

public class MyStt1Activity extends Activity implements OnClickListener {

       private static final int VOICE_RECOGNITION_REQUEST_CODE = 1234;

       private ListView mList;          // 显示识别后字串的list控件

 

       @Override

       public void onCreate(Bundle savedInstanceState) {

                super.onCreate(savedInstanceState);

                setContentView(R.layout.main);

                Button speakButton = (Button) findViewById(R.id.btn_speak); // 识别按钮

                 mList = (ListView) findViewById(R.id.list);

                PackageManager pm = getPackageManager();

                List activities = pm.queryIntentActivities(

                          new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0); //本地识别程序

//                       new Intent(RecognizerIntent.ACTION_WEB_SEARCH), 0); // 网络识别程序

                if (activities.size() != 0) {

                         speakButton.setOnClickListener(this);

                } else {                 // 若检测不到语音识别程序在本机安装,测将扭铵置灰

                         speakButton.setEnabled(false);

                         speakButton.setText("Recognizer not present");

                }

       }

 

       public void onClick(View v) {

                if (v.getId() == R.id.btn_speak) {

                         startMysttActivityActivity();

                }

       }

 

       private void startMysttActivityActivity() {          // 开始识别

                Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);

                intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,

                                   RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);

                intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Speech recognition demo");

                startActivityForResult(intent, VOICE_RECOGNITION_REQUEST_CODE);
                //
调出识别界面

    }

 

       @Override

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

                if (requestCode == VOICE_RECOGNITION_REQUEST_CODE && resultCode == RESULT_OK) {

                         // Fill the list view with the strings the recognizer thought it could have heard

                         ArrayList matches = data.getStringArrayListExtra(

                                            RecognizerIntent.EXTRA_RESULTS);

                         mList.setAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_1,

                                            matches));

                }

                // 语音识别后的回调,将识别的字串在list中显示

                super.onActivityResult(requestCode, resultCode, data);

       }

}

(转载请注明出处: http://xy0811.spaces.live.com/) 

2010-08-03 13:28:00 xieyan0811 阅读数 4189

 

 

1.     说明
以下例程功能为:在应用程序中使用通于访问service调用语言识别功能,录音并识别后将识别的字串通过Listener返回给应用程序。注意:使用前需要安装语音识别服务,如编译安装源码中的development/samples/VoiceRecogitionService

2.     本例参考自android源码

a)          后台服务
参见development/samples/VoiceRecognitionService/*
此处实现了一个模拟的后台服务它并未实现真的语音识别而只是一个框架以示例编译并安装它即可在设置的语音输入与输出中看到它它包含了一个设置界面当连接这个Service如果设置了Letters则直接返回abc如果设置了Numbers则直接返回
123
你可以自己实现用于连接android源码自带的识别引擎srec.

b)         前台程序
参见frameworks/base/core/java/android/speech/Recognition*
与后台Service交互此段代码实现在应用程序界面中

3.     可从此处下载可独立运行的代码(前台程序)
http://download.csdn.net/source/2591401

4.     核心代码及说明

package com.android.mystt3;

 

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.speech.RecognitionListener;

import android.speech.RecognizerIntent;

import android.speech.SpeechRecognizer;

import android.widget.Button;

import android.widget.TextView;

import java.util.ArrayList;

import android.util.Log;

 

public class MyStt3Activity extends Activity implements OnClickListener {

       private TextView mText;

       private SpeechRecognizer sr;

       private static final String TAG = "MyStt3Activity";

 

       @Override

       public void onCreate(Bundle savedInstanceState) {

                super.onCreate(savedInstanceState);

                setContentView(R.layout.main);

                Button speakButton = (Button) findViewById(R.id.btn_speak);     // 识别按钮

                mText = (TextView) findViewById(R.id.text);      // 显示识别字串

                speakButton.setOnClickListener(this);

                sr = SpeechRecognizer.createSpeechRecognizer(this);        // 初始化识别工具,得到句柄

                sr.setRecognitionListener(new listener());         // 注册回调类及函数

       }

 

       class listener implements RecognitionListener            // 回调类的实现

       {

                public void onReadyForSpeech(Bundle params)

                {

                         Log.d(TAG, "onReadyForSpeech");

                }

                public void onBeginningOfSpeech()

                {

                         Log.d(TAG, "onBeginningOfSpeech");

                }

                public void onRmsChanged(float rmsdB)

                {

                         Log.d(TAG, "onRmsChanged");

                }

                public void onBufferReceived(byte[] buffer)

                {

                         Log.d(TAG, "onBufferReceived");

                }

                public void onEndOfSpeech()

                {

                         Log.d(TAG, "onEndofSpeech");

                }

                public void onError(int error)

                {

                         Log.d(TAG,  "error " +  error);

                         mText.setText("error " + error);

                }

                public void onResults(Bundle results)     // 返回识别到的数据

                {

                         String str = new String();

                         Log.d(TAG, "onResults " + results);

                         ArrayList data = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);

                         for (int i = 0; i < data.size(); i++)

                         {

                                   Log.d(TAG, "result " + data.get(i));

                                   str += data.get(i);

                         }

                         mText.setText(str);        // 显示被识别的数据

                }

                public void onPartialResults(Bundle partialResults)

                {

                         Log.d(TAG, "onPartialResults");

                }

                public void onEvent(int eventType, Bundle params)

                {

                         Log.d(TAG, "onEvent " + eventType);

                }

       }

 

       public void onClick(View v) {

                if (v.getId() == R.id.btn_speak) {

                         sr.startListening(new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH));

                }

       }

}

 

(转载请注明出处: http://xy0811.spaces.live.com/)

 

微信小程序 语音识别开发

博文 来自: ckzhouzhe
没有更多推荐了,返回首页