做電影網(wǎng)站怎么接廣告建網(wǎng)站的公司排名
HarmonyOS 原生智能之語音識別實戰(zhàn)
背景
公司很多業(yè)務(wù)場景使用到了語音識別功能,當(dāng)時我們的語音團(tuán)隊自研了語音識別模型,方案是云端模型加端側(cè)SDK交互,端側(cè)負(fù)責(zé)做語音采集、VAD、opus編碼,實時傳輸給云端,云端識別后返回識別結(jié)果。這些業(yè)務(wù)場景在適配鴻蒙的過程發(fā)現(xiàn)HarmonyOS 原生智能中提供了本地語音識別SDK,動手封裝一波。
場景介紹
原生語音識別能力支持兩種模式:
- 短語音模式(不超過60s)
- 長語音模式(不超過8h)
API接口介紹
1. 引擎初始化
speechRecognizer.createEngine
let asrEngine: speechRecognizer.SpeechRecognitionEngine;
// 創(chuàng)建引擎,通過callback形式返回
// 設(shè)置創(chuàng)建引擎參數(shù)
let extraParam: Record<string, Object> = {"locate": "CN", "recognizerMode": "short"};
let initParamsInfo: speechRecognizer.CreateEngineParams = {language: 'zh-CN',online: 1,extraParams: extraParam
};
// 調(diào)用createEngine方法
speechRecognizer.createEngine(initParamsInfo, (err: BusinessError, speechRecognitionEngine: speechRecognizer.SpeechRecognitionEngine) => {if (!err) {console.info('Succeeded in creating engine.');// 接收創(chuàng)建引擎的實例asrEngine = speechRecognitionEngine;} else {// 無法創(chuàng)建引擎時返回錯誤碼1002200008,原因:引擎正在銷毀中console.error(`Failed to create engine. Code: ${err.code}, message: ${err.message}.`);}
});
主要是需要構(gòu)建引擎參數(shù)speechRecognizer.CreateEngineParams:
- language:語言
- online:模式,1為離線,目前只支持離線引擎
- extraParams:區(qū)域信息等
- locate:區(qū)域信息,可選,不設(shè)置時默認(rèn)為“CN”,當(dāng)前僅支持“CN”
- recognizerMode:識別模式,包含短語音short與場語音long
回調(diào)中可以查看錯誤信息:
- 無法創(chuàng)建引擎時返回錯誤碼1002200001,原因:語種不支持、模式不支持、初始化超時、資源不存在等導(dǎo)致創(chuàng)建引擎失敗
- 無法創(chuàng)建引擎時返回錯誤碼1002200006,原因:引擎正在忙碌中,一般多個應(yīng)用同時調(diào)用語音識別引擎時觸發(fā)
- 無法創(chuàng)建引擎時返回錯誤碼1002200008,原因:引擎正在銷毀中
2、設(shè)置RecognitionListener回調(diào)
回調(diào)主要處理識別過程中的事件,最主要的就是onResult處理識別內(nèi)容,不同的對話對應(yīng)不同的sessionId:
// 創(chuàng)建回調(diào)對象
let setListener: speechRecognizer.RecognitionListener = {// 開始識別成功回調(diào)onStart(sessionId: string, eventMessage: string) {},// 事件回調(diào)onEvent(sessionId: string, eventCode: number, eventMessage: string) {},// 識別結(jié)果回調(diào),包括中間結(jié)果和最終結(jié)果onResult(sessionId: string, result: speechRecognizer.SpeechRecognitionResult) {},// 識別完成回調(diào)onComplete(sessionId: string, eventMessage: string) {},// 錯誤回調(diào),錯誤碼通過本方法返回,如:返回錯誤碼1002200006,識別引擎正忙,引擎正在識別中onError(sessionId: string, errorCode: number, errorMessage: string) {}
}
// 設(shè)置回調(diào)
asrEngine.setListener(setListener);
3、開始識別
let audioParam: speechRecognizer.AudioInfo = {audioType: 'pcm', sampleRate: 16000, soundChannel: 1, sampleBit: 16};
let extraParam: Record<string, Object> = {"vadBegin": 2000, "vadEnd": 3000, "maxAudioDuration": 40000};
let recognizerParams: speechRecognizer.StartParams = {sessionId: sessionId,audioInfo: audioParam,extraParams: extraParam
};
// 調(diào)用開始識別方法
asrEngine.startListening(recognizerParams);
主要是設(shè)置開始識別的相關(guān)參數(shù):
- sessionId:會話id,與onResult回調(diào)中的sessionId要對應(yīng)
- audioInfo:音頻配置信息,可選
- audioType:目前只支持PCM,如果要識別MP3文件等需要解碼后再傳給引擎
- sampleRate:音頻的采樣率,當(dāng)前僅支持16000采樣率
- sampleBit:音頻返回的采樣位數(shù),當(dāng)前僅支持16位
- soundChannel:音頻返回的通道數(shù)信息,當(dāng)前僅支持通道1
- extraParams:音頻的壓縮率,pcm格式音頻默認(rèn)為0
- extraParams:額外配置信息,主要包含:
- recognitionMode:實時語音識別模式(不傳時默認(rèn)為1)
- 0:實時錄音識別(需應(yīng)用開啟錄音權(quán)限:ohos.permission.MICROPHONE),若需結(jié)束錄音,則調(diào)用finish方法
- 1:實時音頻轉(zhuǎn)文字識別,開啟此模式時需要額外調(diào)用writeAudio方法,傳入待識別音頻流;
- vadBegin:Voice Activity Detection(VAD)前端點設(shè)置,參數(shù)范圍是
[500,10000]
,不傳參時默認(rèn)為10000ms - vadEnd:Voice Activity Detection(VAD)后端點設(shè)置。參數(shù)范圍是
[500,10000]
,不傳參時默認(rèn)為800ms。 - maxAudioDuration:最大支持音頻時長
- 短語音模式支持范圍
[20000-60000]
ms,不傳參時默認(rèn)20000ms。 - 長語音模式支持范圍
[20000 - 8 * 60 * 60 * 1000]
ms。
VAD作用主要是語音活動檢測,對靜音數(shù)據(jù)不進(jìn)行識別
- 短語音模式支持范圍
- recognitionMode:實時語音識別模式(不傳時默認(rèn)為1)
4、傳入音頻流
asrEngine.writeAudio(sessionId, uint8Array);
向引擎寫入音頻數(shù)據(jù),可以從麥克風(fēng)或者音頻文件中讀取音頻流。
注意:音頻流長度僅支持640或1280。
5、其他接口
- listLanguages:查詢語音識別服務(wù)支持的語種信息
- finish:結(jié)束識別
- 取消識別:cancel
- shutdown:釋放識別引起資源
最佳實踐
實時識別的場景需要從麥克風(fēng)實時讀取音頻,寫入到asrEngine,在onResult回調(diào)中獲取識別結(jié)果。
配置音頻采集參數(shù)并創(chuàng)建AudioCapturer實例:
import { audio } from '@kit.AudioKit';let audioStreamInfo: audio.AudioStreamInfo = {samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_16000, // 采樣率channels: audio.AudioChannel.CHANNEL_1, // 通道sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE, // 采樣格式encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW // 編碼格式};let audioCapturerInfo: audio.AudioCapturerInfo = {source: audio.SourceType.SOURCE_TYPE_MIC,capturerFlags: 0};let audioCapturerOptions: audio.AudioCapturerOptions = {streamInfo: audioStreamInfo,capturerInfo: audioCapturerInfo};audio.createAudioCapturer(audioCapturerOptions, (err, data) => {if (err) {console.error(`Invoke createAudioCapturer failed, code is ${err.code}, message is ${err.message}`);} else {console.info('Invoke createAudioCapturer succeeded.');let audioCapturer = data;}});
這里注意采樣率和聲道以及采樣位數(shù)要符合ASR引擎要求:16k采樣、單聲道、16位采樣位數(shù)。
接著調(diào)用on(‘readData’)方法,訂閱監(jiān)聽音頻數(shù)據(jù)讀入回調(diào):
import { BusinessError } from '@kit.BasicServicesKit';import { fileIo } from '@kit.CoreFileKit';let bufferSize: number = 0;class Options {offset?: number;length?: number;}let readDataCallback = (buffer: ArrayBuffer) => {//將buffer寫入asr引擎asrEngine.writeAudio(sessionId, new Uint8Array(buffer));}audioCapturer.on('readData', readDataCallback);
這里注意寫入buffer的大小顯示,ASR只支持640或1280。
總結(jié)
本文介紹了 HarmonyOS 官方提供的語音識別能力,詳解介紹了ASR引擎接口,最后基于麥克風(fēng)采集數(shù)據(jù)實現(xiàn)了實時麥克風(fēng)語音識別功能。