# 語音喚醒
[TOC]
語音喚醒(**VoiceWakeuper**)通過辨別輸入的音頻中特定的詞語(如“訊飛語點”),返回被命中(喚醒)結果,應用通過回調的結果,進行下一步的處理,如點亮屏幕,或與用戶進行語音交互等。喚醒資源中含有一個或多個資源,只要命中其中一個,即可喚醒。需下載使用對應的語音喚醒SDK。
喚醒的參數主要有:
* 喚醒資源路徑(IVW_RES_PATH)
* 喚醒類型(IVW_SST)
* 喚醒門限(IVW_THRESHOLD)
* 是否持續喚醒(KEEP_ALIVE)
~~~
// 喚醒資源路徑,需下載使用對應的語音喚醒SDK。
mIvw.setParameter( SpeechConstant.IVW_RES_PATH, ivwResPath );
// 喚醒類型
mIvw.setParameter( SpeechConstant.IVW_SST, ivwSst );
// 喚醒門限
mIvw.setParameter( SpeechConstant.IVW_THRESHOLD, threshold );
// 持續喚醒
mIvw.setParameter( SpeechConstant.KEEP_ALIVE, keepAlive );
ret = mIvw.startListening( listener );
~~~
喚醒狀態(結果和錯誤)通過 listener 的回調獲取。
## 喚醒識別
喚醒類型中,有一種類型叫“喚醒識別”(oneshot),是在說喚醒詞后,馬上說識別命令,SDK 則在喚醒的同時,對命令進行識別,如“訊飛語點,打電話給張三”,其中,“訊飛語點”是喚醒詞,“打電話給張三”是命令(語法識別中的某條規則,關于語法識別可以參考對應的章節)。從以上特點可以知道,在喚醒識別時,還需要傳入在線語法ID,或本地語法路徑。
~~~
// 設置業務類型為喚醒識別
mIvw.setParameter( SpeechConstant.IVW_SST,"oneshot" );
//設置識別引擎,只影響喚醒后的識別(喚醒本身只有離線類型)
mIvw.setParameter( SpeechConstant.ENGINE_TYPE, asrEngineType );
if( SpeechConstant.TYPE_CLOUD.equals(asrEngineType) ){
//設置在線識別的語法ID
mIvw.setParameter( SpeechConstant.CLOUD_GRAMMAR, grammarID );
}else{
// 設置本地識別資源
mIvw.setParameter( ResourceUtil.ASR_RES_PATH, asrResPath );
// 設置語法構建路徑
mIvw.setParameter( ResourceUtil.GRM_BUILD_PATH, grmPath );
}
ret = mIvw.startListening( listener );
~~~
喚醒識別時,喚醒的狀態獲取不變,而識別的結果則通過回調中的事件獲取。
## 閉環優化
閉環優化是針對開發者的喚醒資源由云端優化系統不斷優化的功能。通過開發者 APP 使用場景,本地喚醒 SDK 自動挑選音頻數據上傳至云端,進行訓練生成優化喚醒資源。開發者 APP 使用場景中,優化喚醒資源在相比原有資源在提升喚醒率及抑制誤喚醒方面有良好的表現。持續優化包含兩種網絡模式:
* 模式 0:關閉優化功能,禁止向服務端發送本地挑選數據及啟動喚醒時進行查詢下載;
* 模式 1:開啟優化功能,允許向服務端發送本地挑選數據。需要開發者自行進行優化資源的查詢下載,及對資源的使用進行管理;
~~~
// 設置開啟優化功能
mIvw.setParameter( SpeechConstant.IVW_NET_MODE, "1" );
~~~
可以每隔一段時間后查詢是否有資源更新,如每周,每月,當有資源更新時,下載新的資源以替換當前使用的資源.
~~~
// 查詢資源
mIvw.queryResource( ivwResPath, requestListener );
private RequestListener requestListener = new RequestListener() {
... // 其他回調函數
@Override
public void onBufferReceived(byte[] buffer) {
try {
String resultInfo = new String(buffer, "utf-8");
JSONTokener tokener = new JSONTokener(resultInfo);
JSONObject object = new JSONObject(tokener);
int ret = object.getInt("ret");
if(ret == 0) {
String uri = object.getString("dlurl");
String md5 = object.getString("md5");
//下載資源,下載狀態通過 wakeListener 獲取
mIvw.downloadResource( downloadUri, filePath, downloadMd5, wakeListener );
}
} catch (Exception e) {
e.printStackTrace();
}
}
};
~~~
## AIMIC喚醒
針對智能硬件,MSC SDK提供了可處理多聲道音頻,獲取音頻中有效了幾路音頻,同時進行喚醒的模式,我們稱之為AIMIC喚醒。在這種模式下,需要使用額外的音頻處理庫 libaimic.so,結合智能硬件的加密模塊,對多聲道的原始音頻處理,并在喚醒結果中,包含當前喚醒的角度等信息。
目前AIMIC喚醒為定制方案,可通過文章最后的聯系方式與我們商務同事聯系獲取SDK。
在AIMIC喚醒中,包含以下與普通喚醒不同的參數:
* 喚醒路數(IVW_CHANNEL_NUM)
* 音頻源(AUIOD_SOURCE)
* ALSA錄音卡號(IVW_ALSA_CARD)
* ALSA錄音采樣率(IVW_ALSA_RATE)
~~~
// 如果設置 AUDIO_SOURCE 為 -3,則要求項目中包含 alsa 的SDK
// 同時需要設置與麥克風硬件一致的 錄音卡號和采樣率 ,默認
// 卡號=2, 采樣率=16000。更多說明,參考《MSC Reference Manual.html》相關參數。
//mIvw.setParameter( SpeechConstant.AUDIO_SOURCE, "-3" );
//mIvw.setParameter( SpeechConstant.IVW_ALSA_CARD, X ); //X為硬件實際可用的卡號
//mIvw.setParameter( SpeechConstant.IVW_ALSA_RATE, Y ); //Y為硬件實際可用的采樣率
// 設置喚醒路數
mIvw.setParameter(SpeechConstant.IVW_CHANNEL_NUM, "3");
~~~
AIMIC喚醒成功后,除在 WakeuperListener 的onResult 函數返回結果后,還通過 onEvent 返回單聲道 16K 可用于語音識別音頻。
~~~
public void onEvent(int eventType, int arg1, int arg2, Bundle obj) {
if( SpeechEvent.EVENT_RECORD_DATA==eventType ){
//獲取用于識別的音頻
byte[] data = obj.getByteArray(SpeechEvent.KEY_EVENT_RECORD_DATA);
}
}
~~~