Я пытаюсь создать аудио-интерфейс для редактирования текста и в настоящее время использую PocketSphinx, чтобы попытаться создать v1 проекта. (Я понимаю, что есть другие решения, которые могут решить эту задачу, и я, вероятно, попробую другие для V2.) Я строю демонстрационное приложение, которое включено в материалы карманного сфинкса здесь: https://github.com/cmusphinx/pocketsphinx-android-demo
Я могу использовать режим поиска по ключевым словам и распознать мою команду: «создать файл», которая создает пустой документ. Как только новый файл будет открыт, я хочу, чтобы распознаватель затем переключился в режим GrammarSearch и, используя небольшой список слов, который я ввел, прослушивал в течение 5 секунд и обновлял заголовок, затем прослушивал в течение 10 секунд и обновлял тело документа.
До сих пор я пытался адаптировать PocketSphinxActivity, представленный в демонстрационном приложении, с ограниченным успехом. Вот мои текущие настройки распознавателя:
private void setupRecognizer(java.io.File assetsDir) throws IOException {
// The recognizer can be configured to perform multiple searches
// of different kind and switch between them
recognizer = SpeechRecognizerSetup.defaultSetup()
.setAcousticModel(new java.io.File(assetsDir, "en-us-ptm"))
.setDictionary(new java.io.File(assetsDir, "cmudict-en-us.dict"))
//.setRawLogDir(assetsDir) // To disable logging of raw audio comment out this call (takes a lot of space on the device)
.getRecognizer();
recognizer.addListener(this);
/* In your application you might not need to add all those searches.
They are added here for demonstration. You can leave just one.
*/
//Create keyword-activation search.
recognizer.addKeyphraseSearch(KWS_SEARCH, KEYPHRASE);
//Create grammar-based search for selection between demos
java.io.File menuGrammar = new java.io.File(assetsDir, "drivemenu.gram");
recognizer.addGrammarSearch(MENU_SEARCH, menuGrammar);
java.io.File menuCreate = new java.io.File(assetsDir, "presentation_commands.gram");
recognizer.addGrammarSearch(CREATE_DOC, menuCreate);
}
, где команды представления:
#JSGF V1.0;
grammar presentation_commands;
<presentation_command> = welcome |
to |
my |
presentation |
everybody |
november |
demonstration |
file;
public <presentation_commands> = <presentation_command>+;
(Просто несколько тестовых слов, которые я буду использовать для заполнения моего простого демонстрационного файла.)
Я могу сказать, что могу сказать: «Создать файл», и мой новый файл будет создан, однако именно в этот момент я хочу, чтобы следующее было счастливым, но я не смог его достичь: Прослушать в течение 3 секунд и взять данный текст в качестве имени файла, заполнить мой файл заголовком EditText элемента. Прослушайте в течение 10 секунд и используйте данный текст в качестве текста для моего элемента Body EditText.
Вот что я сейчас пытаюсь сделать:
@Override
public void onPartialResult(Hypothesis hypothesis) {
if (hypothesis == null)
return;
String text = hypothesis.getHypstr();
//Toast.makeText(this, text, Toast.LENGTH_SHORT).show();
if (text.equals(KEYPHRASE)) {
//Toast.makeText(this, "Hit Keyphrase in if", Toast.LENGTH_SHORT).show();
recognizer.stop();
recognizer.startListening(MENU_SEARCH);
} else if (text.equals(CREATE_FILE)) {
recognizer.stop();
createFile();
populateFileName();
Toast.makeText(this, "Created File", Toast.LENGTH_SHORT).show();
}
// } else if (file_name_bool){
// fillTitle(text);
// } else if (file_body_bool) {
// fillBody(text);
// }
else {
((TextView) findViewById(R.id.update_text)).setText(text);
}
}
Я могу поразить блок «text.equals (CREATE_FILE)» надежно, и моя функция createFile () не работает с распознавателем, а только с API Google Drive. Моей целью было отключить прослушивание и заполнение с помощью функции populateFileName ():
public void populateFileName() {
file_name_bool = true;
recognizer.startListening(CREATE_DOC, 5000);
}
public void fillTitle(String text) {
recognizer.stop();
file_name_bool = false;
file_body_bool = true;
mFileTitleEditText.setText(text);
recognizer.startListening(CREATE_DOC, 10000);
}
public void fillBody(String text) {
recognizer.stop();
file_body_bool = false;
mDocContentEditText.setText(text);
recognizer.startListening(KWS_SEARCH);
}
Первоначально я думал, что, как только я переключусь в режим CREATE_DOC, приложение просто будет ждать, пока оно не достигнет моей функции onResult:
@Override
public void onResult(Hypothesis hypothesis) {
Toast.makeText(this, "in onResult", Toast.LENGTH_SHORT).show();
((TextView) findViewById(R.id.update_text)).setText("");
if (hypothesis != null) {
String text = hypothesis.getHypstr();
if (file_name_bool)
fillTitle(text);
else if (file_body_bool)
fillBody(text);
else
makeText(getApplicationContext(), text, Toast.LENGTH_SHORT).show();
}
}
Тем не менее, я, кажется, не нажимаю на мою функцию onResult (). Вместо этого поведение, которое я получаю, является блоком else моего onPartialResult (), который просто обновляет editText моей речью. (Одна хорошая новость заключается в том, что обновляемая речь извлекает правильный словарный запас из моего файла грамматики, так что это небольшая победа). К сожалению, я никогда не могу обновить заголовок файла или тело файла, и я не уверен, почему.
Когда я пытаюсь раскомментировать блоки моего onPartialResult () для проверки логических значений, я могу обновить свое имя файла и тело файла, однако я могу получить только одно слово, поскольку мой распознаватель немедленно останавливается. По этой причине я хотел бы найти способ не использовать onPartialResult, а вместо этого просто использовать onResult, чтобы он мог добавить полный речевой ввод.
Заранее спасибо и извинения, если это основной вопрос. Я также просматривал этого урока , но не смог его успешно адаптировать.