Мотивация и история (Не нужно читать дополнительно):
У меня был рабочий кусок кода, который использовал бы карманный sphynix и распознаватель Google вместе, чтобы поддерживать как голосовую навигацию на основе меню, так и непрерывную передачу текста.
Поэтому код пользователя перемещается по приложению по голосу, если слова, которые они использовали, соответствуют элементу меню, например:
"Хорошо, атом, начни х"
"Хорошо, атом, останови х"
"Ок, атом, делай г"
Примечание: PocketSphinx обнаружил триггерную фразу "Ok atom", затем убитый PocketSphinx был отменен, а голос Google использовался для более длинных фраз из-за большей точности.
Также, если распознаватель не совпадал, он начал бы непрерывную речь к тексту, который был отправлен бэкенду как чат-бот (обрабатывается google voice):
"Привет, меня зовут доктор Грин палец.
"Что за ужин сегодня вечером ..."
Если в течение 10 секунд было тихо, голос Google был бы отменен, и PocketSphinx был бы снова запущен для ключевого слова / wakeword trigger = "Ok atom"
** Все было хорошо, пока мне не нужны фактические необработанные аудио-байты также для бэкэнд-приложения. У меня есть поиск по всему стеку, и ни одно из решений не работает и не является реалистичным для моего проекта.
Затем я обнаружил, что PocketSphinx может вернуть вам необработанные данные, поэтому мне пришлось выделить Google Voice и использовать ТОЛЬКО PocketSphinx **
Актуальная проблема:
Однако после рефакторинга / удаления распознавателя голоса Google и использования только PocketSphinx, поскольку мне требуется легкий доступ к «необработанным аудио-байтам» распознавания, PocketSphinx продолжает слышать свое триггерное слово «ok atom», а не любые другие слова / голос до или после этого триггерного слова !!!
Независимо от того, что я говорю, например, "привет", "привет", "1,2,3" и т. Д. ... он слышит только триггер "атом атома", см. Мой соответствующий фрагмент кода :
Фрагмент кода AsynTask, который устанавливает карманного сфинкса:
@Override
protected Exception doInBackground(Void... params) {
try {
SpeechRecognitionService speechService = serviceReference.get();
Assets assets = new Assets(speechService);
File assetDir = assets.syncAssets();
speechService.pocketSphinxRecognizer = defaultSetup()
.setAcousticModel(new File(assetDir, "en-us-ptm"))
.setDictionary(new File(assetDir, "cmudict-en-us.dict"))
// threshold to balance between false +/- (higher is less sensitive, was 1e-45f)
.setKeywordThreshold(1e-30f)
.getRecognizer();
speechService.pocketSphinxRecognizer.addListener(listener);
// create keyword-activation search
speechService.pocketSphinxRecognizer.addKeyphraseSearch(KWS_SEARCH, KEYPHRASE);
} catch (IOException e) {
return e;
}
return null;
}
Фрагмент кода для методов жизненного цикла карманного сфинкса:
private String KWS_SEARCH = "ok atom";
private void switchSearch(String searchName) {
pocketSphinxRecognizer.stop();
if (searchName.equals(KWS_SEARCH))
pocketSphinxRecognizer.startListening(searchName);
else
pocketSphinxRecognizer.startListening(searchName, 10000);
}
private class PocketSphinxRecognitionListener implements edu.cmu.pocketsphinx.RecognitionListener {
@Override
public void onPartialResult(Hypothesis hypothesis) {
try {
if (hypothesis != null) {
String cmd = hypothesis.getHypstr();
Log.d(TAG, "onPartialResult:" + cmd);
if (cmd.equalsIgnoreCase(KWS_SEARCH))
{
handleResults(cmd);
}
else
{
sendToBacknedForProcessing(cmd);
}
}
}
catch (NullPointerException exc)
{
exc.printStackTrace();
}
}
@Override
public void onBeginningOfSpeech() {}
@Override
public void onEndOfSpeech() {
if (!pocketSphinxRecognizer.getSearchName().equals(KWS_SEARCH))
{
switchSearch(KWS_SEARCH);
}
}
@Override
public void onResult(Hypothesis hypothesis) {
if (hypothesis != null) {
String cmd = hypothesis.getHypstr();
Log.d(TAG, "onResult:" + cmd);
sendToBacknedForProcessing(cmd);
}
}
@Override
public void onError(Exception e) {
Log.e(TAG, "Pocketsphinx encounted an exception: " + e.getMessage());
}
@Override
public void onTimeout() {
switchSearch(KWS_SEARCH);
}
}
Я действительно следил за этой популярной статьей (https://www.guidearea.com/pocketsphinx-continuous-speech-recognition-android-tutorial/) шаг за шагом, но все еще нет правильных результатов.
То, что я хочу сделать, - это поддерживать режимы голосовой навигации, если правильные слова распознаются, или непрерывное отображение текста, отправляемого на сервер.
Спасибо за миллион!