Android PocketSphinx離線語音識別整合總結
關於Android的離線語音識別的技術,遍觀若干廠家唯有科大訊飛和百度有離線的語音識別功能,但是科大訊飛是收費的,百度的離線語音識別就是關鍵詞喚醒,但是隻接受3個自定義的喚醒詞,而且必須經過評定3分以上喚醒詞才可以成功提交,內容限制和數量限制都是很大的侷限,可用性很低,大公司的開源技術全部Pass掉了。這個pocketSphinx經過實踐準確率還是很不錯的,根本上講實際操作還是關鍵詞喚醒識別,但是能利用pocketSphinx其自定義的語音模型和聲音模型的特性,隨心所欲的定製想識別的關鍵詞。
關於PocketSphinx的學習主要是根據這篇文章來的,整合方面很詳細很具體:
最重要的一點:dic檔案中文字和拼音之間相隔2個空格,字母之間間隔是一個空格,間距不對很可能也不能如預期所願。
自己做了個Demo,裡面有4個自定義的喚醒詞:“下一個介面”,“下一個頁面”,“設定介面”,“設定頁面”, 畫了2個Layout:紅色的下一個介面和白色的設定介面, 當說前兩個喚醒詞,識別之後跳轉到紅色的介面,當說後兩個喚醒詞,識別之後跳轉到白色的介面,效果如下:
實際操作其實便是中規中矩的整合,整合進PocketSphinx後換成自己的字典模型和語言模型,僅僅替換dic和lm兩個檔案,然後在按鈕的長按監聽中開啟語音識別引擎,在識別後的回撥中關閉引擎並根據內容跳轉
public AudioRecordButton(final Context context, AttributeSet attrs) {
super(context, attrs);
dialogManager = new AudioRecordDialog(getContext());
setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
//開啟語音識別引擎
PocketSphinxUtil.get(context).start();
isReady = true;
dialogManager.showDialog();
isSpeaking = true;
return false;
}
});
}
@Override
public void onPartialResults(String b) {
//一次識別之後,停止語音引擎,下次長按再開啟
PocketSphinxUtil.get(context).stop();
if(b.contains("下一個介面")||b.contains("下一個頁面"))
{
Intent intent = new Intent(context,NextActivity.class);
startActivity(intent);
}else if(b.contains("設定介面")||b.contains("設定頁面"))
{
Intent intent = new Intent(context,SettingActivity.class);
startActivity(intent);
}
}
Demo已上傳:https://download.csdn.net/download/crystal_xing/10843721