通过查询阿里官方文档,《实时语音识别》需要通过服务器中转实现,这里希望简单一点,直接客户端搞定,然后确定使用《一句话识别》中的RESTful API的方式。
实现语音识别分以下几个步骤:
1、小程序录音生成临时录音文件(阿里识别要求pcm编码);
音频格式:PCM编码、16bit采样位数、单声道(mono)。 音频采样率:8000Hz/16000Hz。 //参数 format: 音频编码格式。支持格式:PCM/OPUS。默认:PCM。
2、连接阿里服务器,把录音文件作为请求参数,返回识别的文字;
3、清除临时文件。
实现
1、生成录音文件
首先想到的是wx.startRecord,但是测试发现生成的是silk文件,还需要转换,放弃。
然后微信还提供了另一个录音的api:wx.getRecorderManager(),支持直接录制pcm格式
于是:
/** * 开始录音 */ _startRecord(){ console.log(TAG_NAME, '_startRecord') const options = { duration: 60000, //指定录音的时长,单位 ms,最大为10分钟(600000),默认为1分钟(60000) sampleRate: 16000, //采样率 numberOfChannels: 1, //录音通道数 encodeBitRate: 96000, //编码码率 format: 'pcm', //音频格式,有效值 aac/mp3 frameSize: 50, //指定帧大小,单位 KB } //开始录音计时 //that.recordingTimer(); //开始录音 recorderManager.start(options); recorderManager.onStart(() => { console.log(TAG_NAME, '...recorderManager onStart...') }); //错误回调 recorderManager.onError((res) => { console.log(TAG_NAME, res); }) }
结束录音后,开启语音识别:
/** * 结束录音 */ _stopRecord(){ console.log(TAG_NAME, '_stopRecord') recorderManager.stop(); recorderManager.onStop((res) => { console.log(TAG_NAME, '...recorderManager onStop...', res.tempFilePath) this.setData({tempAudioFilePath: res.tempFilePath}) //结束录音计时 //clearInterval(that.data.setInter); //开始asr语音识别 this._startAsr() }) }
识别比较简单:
先获取token,然后
wx.request({ url: app.globalData.aliAsrServerUrl, method: 'POST', header:{ 'X-NLS-Token':tokenData.token, 'Content-type':'application/octet-stream', 'Host':'nls-gateway.cn-shanghai.aliyuncs.com' }, data: fs.readFileSync(audioFilePath), success: (res) =>{ console.log(TAG_NAME, 'asr success:', res) //删除临时文件 fs.removeSavedFile() wx.showToast({ icon: 'none', title: res.data.result, }) this.setData({messageContent: res.data.result}) this._chat() }, fail: (res) =>{ console.error(TAG_NAME, 'asr fail:', res) } })
搞定。
参考资料
https://www.cnblogs.com/westwin/p/11277449.html