一害碾、簡(jiǎn)介
1.1喻括、PocketSphinx是啥楞泼?
PocketSphinx 是一個(gè)計(jì)算量
和 體積
都很小的語(yǔ)音識(shí)別引擎。是第一個(gè)開(kāi)源
的面向嵌入式
的中等詞匯量連續(xù)語(yǔ)音識(shí)別項(xiàng)目庶诡。
1.2虾标、Pocketsphinx on Android
- AndroidStudio 版Demo:點(diǎn)我。
- 官方介紹:點(diǎn)這里。
ps:
網(wǎng)上大多的資料都還是停留在02-14年璧函,如果應(yīng)用到Android上面還需要自己去使用NDK去編譯。但是基显,使用最新的版本蘸吓,已不需要開(kāi)發(fā)者自己去編譯了。推薦使用撩幽。
二库继、使用
2.1、資源準(zhǔn)備
-
JAR/AAR
Github 上面只提供了AAR文件窜醉,需要JAR包的宪萄,點(diǎn)這里。 -
聲學(xué)模型 和 語(yǔ)言模型
官方給的Demo里面只能識(shí)別英文榨惰,如果想要識(shí)別中文拜英,需要下載中文的聲學(xué)模型和語(yǔ)言模型。還是點(diǎn)這里琅催。(不保證為最新版)
2.2居凶、導(dǎo)入依賴包,不說(shuō)了藤抡。
2.3侠碧、添加識(shí)別相關(guān)資源
包括聲學(xué)模型
、語(yǔ)言模型
缠黍、字典文件
弄兜、語(yǔ)法文件
。
目錄結(jié)構(gòu)參考以下兩張圖片:
2.4瓷式、修改語(yǔ)法文件和字典文件
-
2.4.1替饿、建立語(yǔ)音模型
本文不進(jìn)行語(yǔ)法的講解,這里給出參考鏈接(英文版):https://cmusphinx.github.io/wiki/tutoriallm/ -
2.4.2蒿往、添加字典
按照之前下載的字典文件盛垦,一個(gè)個(gè)和你自己的進(jìn)行對(duì)照,沒(méi)有其他方法瓤漏。
2.5腾夯、調(diào)試代碼
- 2.5.1、復(fù)制資源文件到手機(jī)本地
RecognizerSetupTask recognizerSetupTask = new RecognizerSetupTask(new RecognizerSetupListener() {
@Override
public void onRecognizerAlreadySetup() {
}
@Override
public Exception doInBackGround() {
try {
File assetDir = assets.syncAssets(); //復(fù)制資源文件
setupRecognizer(assetDir); //初始化SpeechRecognizer
} catch (IOException e) {
return e;
}
return null;
}
@Override
public void onRecognizerPrepareError() {
}
@Override
public void onRecognizerPrepareSuccess() {
isInit = true;
}
});
recognizerSetupTask.execute();
- 2.5.2蔬充、SpeechRecognizer
private void setupRecognizer(File assetsDir) throws IOException {
SpeechRecognizerSetup setup = SpeechRecognizerSetup.defaultSetup();
if (setup == null) {
Log.e(TAG, "SpeechRecognizerSetup is null");
return;
}
setup.setKeywordThreshold(1e10f)
.setBoolean("-allphone_ci", true)
// .setString("-keyphrase","backward") // forward ;
// setup.setSampleRate(24000);
File file = new File(assetsDir, "zh-ptm");
if (!file.exists()) {
Log.e(TAG, "zh-ptm not found");
return;
}
setup.setAcousticModel(file);
file = new File(assetsDir, "voice.dic");
if (!file.exists()) {
Log.e(TAG, "voice.dic not found");
return;
}
setup.setDictionary(file);
recognizer = setup.getRecognizer();
if (recognizer == null) {
Log.e(TAG, "SpeechRecognizer1 is null");
return;
}
// recognizer.addKeywordSearch();
File menuGrammar = new File(assetsDir, "zh_test.gram");
recognizer.addGrammarSearch(PocketListener.SEARCH, menuGrammar);
}
- 2.5.3蝶俱、開(kāi)始錄音
recognizer.startListening("zh_test");
recognizer.addListener(recognitionListener);
RecognitionListener recognitionListener = new RecognitionListener() {
@Override
public void onBeginningOfSpeech() {
Log.e(TAG, "onBeginningOfSpeech()");
}
@Override
public void onEndOfSpeech() {
String searchName = recognizer.getSearchName();
Log.e(TAG, "onEndOfSpeech()" + searchName);
}
@Override
public void onPartialResult(Hypothesis hypothesis) {
if (hypothesis == null) {
Log.e(TAG, "onPartialResult() hypothesis is null ");
return;
}
Log.e(TAG, "onPartialResult()" + hypothesis.getHypstr());
}
@Override
public void onResult(Hypothesis hypothesis) {
if (hypothesis == null) {
Log.e(TAG, "onResult() hypothesis is null ");
return;
}
Log.e(TAG, "onResult()" + hypothesis.getHypstr());
String string = hypothesis.getHypstr();
}
@Override
public void onError(Exception e) {
Log.e(TAG, "onError()" + e.toString());
}
@Override
public void onTimeout() {
Log.e(TAG, "onTimeout()");
}
};
到這里PocketSphinx語(yǔ)音識(shí)別的Android版本,核心的東西都已經(jīng)在這里饥漫。后續(xù)會(huì)把我自己的Demo 分享到 PocketSphinxDemo項(xiàng)目中榨呆。歡迎提出意見(jiàn)和建議。