周虎
摘要:該文通過微信小程序中的錄音功能,將生成的MP3格式文件上傳到服務(wù)器端并轉(zhuǎn)換成PCM格式的音頻文件,然后將該音頻文件發(fā)送到百度語音識別接口進(jìn)行語音識別,將識別結(jié)果返回到微信小程序,實(shí)現(xiàn)了在微信小程序中的用戶語音輸入功能?;谖⑿判〕绦虻恼Z音輸入功能大大提高了微信小程序中用戶輸入信息的速度和用戶體驗(yàn)。
關(guān)鍵詞:微信小程序;語音識別;語音輸入;MP3;PCM
中圖分類號:TP393? ? 文獻(xiàn)標(biāo)識碼:A? ? ?文章編號:1009-3044(2018)31-0104-02
1 背景
隨著人工智能的不斷發(fā)展,語音識別技術(shù)取得了顯著進(jìn)步,已經(jīng)開始逐步走向市場,尤其在語音輸入應(yīng)用上,文字識別準(zhǔn)確率達(dá)到90%以上[1],大大提高了用戶文字輸入的速度。微信小程序是基于微信平臺一種新的開放能力,可以在微信平臺內(nèi)被便捷地獲取和傳播,用戶不需要下載安裝即可使用的應(yīng)用,具有出色的使用體驗(yàn)[2]。在一些游記或記事本類的小程序中,需要用戶大量輸入文字信息,該文將在微信小程序中通過調(diào)用微信平臺的錄音功能,結(jié)合遠(yuǎn)程的語音識別,共同實(shí)現(xiàn)了語音輸入功能,大大提高了用戶信息的輸入速度。
2 微信小程序語音輸入功能簡介
微信小程序是基于微信給用戶提供二次開發(fā)的應(yīng)用平臺,用戶可以通過微信小程序開發(fā)工具開發(fā)自己的應(yīng)用。雖然微信平臺可以提供語音輸入,但是在小程序中目前只是提供錄音功能,并沒有提供語音輸入功能。雖然目前語音輸入技術(shù)已經(jīng)很成熟,但是針對小程序的特殊性,要實(shí)現(xiàn)基于小程序的語音輸入功能,只能通過遠(yuǎn)程調(diào)用語音識別接口的方式來實(shí)現(xiàn),所以借助小程序的錄音功能,將錄音的音頻文件發(fā)送到遠(yuǎn)程調(diào)用語音識別接口,并返回識別結(jié)果。
基于微信小程序語音輸入功能主要包括錄音MP3格式文件的生成,服務(wù)器端音頻文件的格式轉(zhuǎn)換和調(diào)用百度語音識別接口并返回識別結(jié)果,具體時(shí)序圖如圖1所示。
在音頻轉(zhuǎn)換過程中,由于百度開放語音平臺接受原始 PCM 的錄音參數(shù)必須符合 8k/16k 采樣率、16bit 位深、單聲道,而微信小程序在錄音過程中生成的音頻格式采樣率為8k/16k/44k,生成的音頻格式為aac/mp3,存在音頻格式不同的障礙,所以必須在服務(wù)器端要有一個(gè)音頻轉(zhuǎn)換功能。
3 微信小程序語音輸入功能的實(shí)現(xiàn)
微信小程序語音輸入功能主要分為音頻采集和上傳、音頻文件格式轉(zhuǎn)換和調(diào)用遠(yuǎn)程語音識別接口并返回結(jié)果三個(gè)部分。
3.1 音頻采集和上傳
在微信小程序中,提供了調(diào)用系統(tǒng)錄音功能的接口,通過錄音參數(shù)設(shè)置,指定相關(guān)參數(shù),如程序1所示[3]。
const options = {
duration: 30000,//指定錄音的時(shí)長,單位 ms
sampleRate: 16000,//采樣率
numberOfChannels: 1,//錄音通道數(shù)
encodeBitRate: 96000,//編碼碼率
format: 'mp3',//音頻格式,有效值 aac/mp3
frameSize: 50,//指定幀大小,單位 KB
}
程序1? ?微信小程序錄音參數(shù)設(shè)置
設(shè)定完指定參數(shù)后,微信小程序需要進(jìn)行錄音授權(quán),如果用戶允許錄音,此時(shí)將開始錄音,錄音結(jié)束后將錄音文件保存在臨時(shí)文件夾中,并將該音頻文件上傳到服務(wù)器端,實(shí)現(xiàn)代碼如程序2所示。
wx.authorize({
scope: 'scope.record',
success() {
const recorderManager = wx.getRecorderManager()
recorderManager.onStart(() => {
console.log('recorder start')
})
recorderManager.onStop((res) => {
this.tempFilePath = res.tempFilePath;
const uploadTask = wx.uploadFile({
url: 'https://服務(wù)器地址',
filePath: tempFilePath,
name: 'file',
success: function (res) {
////等待返回結(jié)果
}
}) })}
})
程序2? ?錄音文件采集及上傳
當(dāng)錄音文件采集后,直接上傳到遠(yuǎn)程服務(wù)器,等待服務(wù)器將語音識別的結(jié)果返回,如果成功返回后,再將識別的結(jié)果顯示在視圖文本框中。
3.2 音頻格式轉(zhuǎn)換
在服務(wù)器端,接收到微信小程序發(fā)送的音頻文件后,使用Java技術(shù)結(jié)合mp3spi第三方開發(fā)包,針對mp3格式文件進(jìn)行格式轉(zhuǎn)換[4],首先獲取pcm格式音頻流,然后再寫入新的pcm格式文件,關(guān)鍵代碼如程序3所示。
File mp3 = new File(mp3filepath);
AudioInputStream audioInputStream = null;
AudioFormat targetFormat = null;
try {
AudioInputStream in = null;
MpegAudioFileReader mp = new MpegAudioFileReader();//讀取音頻文件的類
in = mp.getAudioInputStream(mp3);
AudioFormat baseFormat = in.getFormat();
//設(shè)定輸出格式為pcm格式的音頻文件
targetFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, baseFormat.getSampleRate(), 16,
baseFormat.getChannels(), baseFormat.getChannels() * 2, baseFormat.getSampleRate(), false);
//輸出到音頻
audioInputStream = AudioSystem.getAudioInputStream(targetFormat, in);
AudioSystem.write(audioInputStream, AudioFileFormat.Type.WAVE, new File(pcmfilepath)); //保存到pcm文件
} catch (Exception e) {
e.printStackTrace();
}
程序3? ?mp3音頻文件轉(zhuǎn)換為pcm格式音頻文件
在轉(zhuǎn)換音頻格式過程中,如果出現(xiàn)異常,直接返回錯(cuò)誤信息,就不需要再調(diào)用百度語音識別接口了。
3.3 調(diào)用遠(yuǎn)程語音識別接口并返回結(jié)果
在服務(wù)器端對音頻文件格式轉(zhuǎn)換成功后,就可以通過引用百度的語音識別開發(fā)包,直接將pcm格式的音頻文件發(fā)送到遠(yuǎn)程語音識別接口,等待接口返回識別的結(jié)果。當(dāng)然,用戶需要先在百度上注冊自己的APPID,得到對應(yīng)的APIKEY和SECRETKEY才可以調(diào)用。語音識別返回的結(jié)果是JSON格式,需要在服務(wù)器端對返回的結(jié)果進(jìn)行解析,具體如程序4所示。
import org.json.JSONObject;
import com.baidu.aip.*;
import com.baidu.aip.speech.AipSpeech;
public class Voice {
public static final String APP_ID = "APPID";//設(shè)置APPID/AK/SK
public static final String API_KEY = "APIKEY";
public static final String SECRET_KEY = "SECRETKEY";
public static String getVoiceTxt(String filepath){
// 初始化一個(gè)AipSpeech
AipSpeech client = new AipSpeech(APP_ID, API_KEY, SECRET_KEY);
JSONObject res = client.asr(filepath, "pcm", 16000, null);
return (res.toString(2));
}
}
程序4? ?調(diào)用遠(yuǎn)程語音識別接口并返回結(jié)果
當(dāng)服務(wù)器端獲取語音識別結(jié)果后,在將該結(jié)果通過JSON格式返回到微信小程序端的文本框中。
4 結(jié)束語
語音輸入已經(jīng)在很多應(yīng)用中得到了廣泛的使用,該文通過針對微信小程序中的語音輸入功能研究,結(jié)合微信小程序中的錄音功能、文件上傳功能、音頻格式轉(zhuǎn)換功能和遠(yuǎn)程語音識別功能共同實(shí)現(xiàn)了基于微信小程序的語音輸入功能,并在游記小程序中得到了應(yīng)用。一方面提高了用戶文字輸入的速度,同時(shí)提高了用戶體驗(yàn),當(dāng)然,這種語音輸入技術(shù)也有需要進(jìn)一步改進(jìn)的地方,如果微信平臺能開放語音識別功能,就可以省去調(diào)用遠(yuǎn)程語音識別接口的步驟,在語音識別的速度上將得到大大的提高。
參考文獻(xiàn):
[1] 佚名. 百度語音識別[EB/OL]. http://ai.baidu.com/tech/speech/asr.
[2] 匡文波, 李芮, 任卓如. 微信小程序面面觀[J]. 新聞?wù)搲?2017(2).
[3] 佚名. 微信小程序API[EB/OL]. https://developers.weixin.qq.com/miniprogram/dev/api/getRecorderManager.html.
[4] 桑園. 淺析幾種Java播放音頻技術(shù)及實(shí)例[J]. 數(shù)字技術(shù)與應(yīng)用, 2016(4).