知識
不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價值,我們在追求其視覺表現(xiàn)的同時,更側(cè)重于功能的便捷,營銷的便利,運營的高效,讓網(wǎng)站成為營銷工具,讓軟件能切實提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序為后期升級提供便捷的支持!
您當前位置>首頁 » 新聞資訊 » 小程序相關(guān) >
基于騰訊云智能語音的實時語音識別微信小程序的開發(fā)
發(fā)表時間:2021-3-31
發(fā)布人:葵宇科技
瀏覽次數(shù):161
微信小程序的基礎(chǔ)庫升級到了 1.6.0 之后,提供了許多新的 API,其中新增了 錄音管理 的 API,不同于以前只有 wx.startRecord
和 wx.stopRecord
兩個簡單的錄音功能,新的 wx.getRecorderManager
接口提供了包括擴展時長、采樣率、錄音通道、碼率、格式等在內(nèi)的許多配置項。基于此,我們能更加輕松的控制錄音,新提供的 onFrameRecorded
的事件,甚至可以實現(xiàn)流式語音識別。
本文就介紹一下使用 Wafer Node.js SDK 提供的騰訊云智能語音識別接口來實現(xiàn)錄音轉(zhuǎn)文字的功能。請您先從 Github 下載 語音識別 Demo ,本文會根據(jù) Demo 來介紹 SDK 中語音識別接口的使用。
使用語音識別需要開通騰訊云智能語音。
打開 server/config.js
,添加上 qcloudAppId
, qcloudSecretId
, qcloudSecretKey
三個配置項,并在代碼目錄中打開 CMD,運行如下代碼:
cd server && npm i
安裝完成依賴,選擇小程序開發(fā)者工具右上角的【騰訊云】按鈕,點擊【上傳測試環(huán)境】上傳代碼到測試環(huán)境中,一鍵部署程序。你也可以自行部署代碼,部署過程同 《自行部署 Node.js Demo》 ,這里不再介紹。
最終實現(xiàn)的效果如下:
具體是如何實現(xiàn)的呢?接下來我們來分析一下 Demo 里的有關(guān)代碼。
首先查閱 SDK API 文檔可知,SDK 提供的語音識別接口是分片識別接口,原理是將語音文件切分成一個個分片,將每個分片以 buffer
格式傳入接口,最后一個分片調(diào)用接口時需要將 isEnd
參數(shù)置為 true
,最后會返回完整的識別結(jié)果,以此來流式識別語音。
由于智能語音識別只支持以下幾種編碼格式的音頻文件:
- pcm
- adpcm
- feature
- speex
- amr
- silk
- wav
所以小程序端通過 recorderManager
獲取到的錄音文件需要提前轉(zhuǎn)換為這幾種格式中的一種,然后才能識別。Demo 里選擇了將 mp3
格式轉(zhuǎn)換為 wav
格式文件的形式。
Demo 中采用了 ffmpeg
對語音文件進行轉(zhuǎn)碼,使用 ffmpeg
的前提是需要在環(huán)境中安裝 ffmpeg
,然后在 Node.js 中使用 fluent-ffmpeg
調(diào)用 ffmpeg
實現(xiàn)轉(zhuǎn)碼。
注意: ffmpeg
并沒有默認預(yù)裝在開發(fā)環(huán)境和生產(chǎn)環(huán)境中,如果您需要使用語音識別的轉(zhuǎn)碼功能,可以提交工單,我們會為您配置好環(huán)境。
打開 Demo 中的 server/controllers/recognize.js
文件,首先調(diào)用了 multiparty
從請求體中讀取出上傳上來的音頻數(shù)據(jù),接著對語音的類型進行一些判斷。
...
const { files } = await resolveUploadFileFromRequest(ctx.req);
...
if (!resultType || !['audio/mpeg', 'audio/mp3'].includes(resultType.mime)) {
throw new Error('上傳的文件格式不是 mp3')
}
...
第 46 行開始對音頻文件進行處理,首先先生成了 voiceId
, voiceId
告訴了語音識別接口每個語音分片屬于哪個語音,每個語音的 voiceId
應(yīng)當是唯一的。
接著調(diào)用了 convertMp3ToWav
函數(shù)對語音進行轉(zhuǎn)換, convertMp3ToWav
函數(shù)的實現(xiàn)如下:
/**
* mp3 轉(zhuǎn) wav
* @param {string} srcPath 源文件地址
* @param {string} newPath 新文件地址
*/
function convertMp3ToWav (srcPath, newPath) {
return new Promise((resolve, reject) => {
ffmpeg(srcPath)
.format('wav')
.on('error', reject)
.on('end', function () {
resolve(newPath)
})
.save(newPath)
})
}
由于每次識別的文件大小最好不要超過 10K byte,所以需要對音頻文件進行切片,原理就是將音頻文件讀取為 buffer,然后按每 9K byte 大小切片識別。
// 將文件讀取為 Buffer
const voiceBuffer = fs.readFileSync(newVoicePath);
const taskList = [];
let leftBufferSize = 0;
let idx = 0;
// 按 9K 大小切分分片并識別
while (leftBufferSize < voiceBuffer.length) {
const newBufferSize = leftBufferSize + 9 * 1024;
// 切分分片
const chunk = voiceBuffer.slice(
leftBufferSize,
newBufferSize > voiceBuffer.length
? voiceBuffer.length
: newBufferSize
)
// 提交每個切片去識別,并將任務(wù)推入任務(wù)列表
taskList.push(
voice.recognize(
chunk,
newBufferSize > voiceBuffer.length,
voiceId,
idx
)
);
leftBufferSize = newBufferSize;
idx++;
}
以上就是語音識別 Demo 代碼的分析,您可以直接運行 Demo,在手機端 真機調(diào)試 體驗。
注意:開發(fā)者工具的錄音接口返回的數(shù)據(jù)不是 MP3 格式,與真機行為不完全相同,所以錄音相關(guān)的測試請直接使用真機調(diào)試。
原創(chuàng)聲明,本文系作者授權(quán)云+社區(qū)-專欄發(fā)表,未經(jīng)許可,不得轉(zhuǎn)載。
如有侵權(quán),請聯(lián)系[email protected]刪除。
相關(guān)案例查看更多
相關(guān)閱讀
- 云南電商網(wǎng)站建設(shè)
- 云南網(wǎng)站建設(shè)開發(fā)
- 重慶網(wǎng)站建設(shè)公司
- 百度推廣
- 小程序開發(fā)
- 網(wǎng)站建設(shè)高手
- 網(wǎng)站建設(shè)公司網(wǎng)站
- 汽車報廢軟件
- 模版信息
- 南通小程序制作公司
- 昆明小程序開發(fā)
- 云南衛(wèi)視小程序
- 云南小程序開發(fā)哪家好
- 網(wǎng)站建設(shè)公司哪家好
- 表單
- 云南網(wǎng)站建設(shè)報價
- 出入小程序
- 云南網(wǎng)站建設(shè)服務(wù)公司
- 報廢車拆解管理系統(tǒng)
- 日歷組件
- 云南網(wǎng)站建設(shè)招商
- 網(wǎng)站建設(shè)制作
- 網(wǎng)站維護
- 汽車拆解管理系統(tǒng)
- 報廢車回收管理軟件
- 百度小程序
- 買小程序被騙
- 云南網(wǎng)站開發(fā)
- 云南網(wǎng)站建設(shè)電話
- 人口普查小程序