Как определить из словарного запаса в CMU Sphinx

131
6

У меня возникла проблема с библиотекой распознавания голоса Sphinx для Java. Я использую его для ввода и обработки. В грамматическом файле я написал вот так:

#JSGF V1.0;

grammar hello;

public <sentence> = (play | pause | next | previous);

Моя грамматика проста, просто включает в себя 4 слова: "играть", "пауза", "следующий", "предыдущий". Я использовал Sphinx, чтобы обнаружить их успешно. Но я хочу, чтобы мое приложение показывало сообщение типа "непризнанное слово", когда я говорю несколько слов, которые не принадлежат грамматике. В настоящее время, например, если я говорю с микрофоном, не относится к грамматике, например: "stop", она все еще показывает слово, что оно обнаруживает, что это ближайший результат.

Мой код выглядит так:

public class SphinxDemo {

static int i = 1;
static String resultText;

public static void main(String[] args) {
try {
URL url;
if (args.length > 0) {
url = new File(args[0]).toURI().toURL();
} else {
url = SphinxDemo.class.getResource("helloworld.config.xml");
}

System.out.println("Loading...");

ConfigurationManager cm = new ConfigurationManager(url);

Recognizer recognizer = (Recognizer) cm.lookup("recognizer");
Microphone microphone = (Microphone) cm.lookup("microphone");

/* allocate the resource necessary for the recognizer */
recognizer.allocate();

/* the microphone will keep recording until the program exits */

if (microphone.startRecording()) {
System.out
.println("Say: play|pause|previous|next");

while (true) {

System.out
.println("Start speaking. Press Ctrl-C to quit.\n");

Result result = recognizer.recognize();
if (result != null) {

System.out.println("Enter your choise" + "\n");
resultText = result.getBestFinalResultNoFiller();
System.out.println("You said: " + resultText + "\n");
}

if(!(resultText.equalsIgnoreCase("play") || resultText.equalsIgnoreCase("previous") || resultText.equalsIgnoreCase("pause")||resultText.equalsIgnoreCase("next"))){
System.out.println("Unrecognized word\n");
}

}
} else {
System.out.println("Cannot start microphone.");
recognizer.deallocate();
System.exit(1);
}

} catch (IOException e) {
System.err.println("Problem when loading SphinxDemo: " + e);
e.printStackTrace();
} catch (PropertyException e) {
System.err.println("Problem configuring SphinxDemo: " + e);
e.printStackTrace();
} catch (InstantiationException e) {
System.err.println("Problem creating SphinxDemo: " + e);
e.printStackTrace();
}

}
}

Я попытался добавить что-то подобное, чтобы обнаружить непризнанное слово, но оно не работает:

  if(!(resultText.equalsIgnoreCase("play") || resultText.equalsIgnoreCase("previous") || resultText.equalsIgnoreCase("pause")||resultText.equalsIgnoreCase("next"))){
System.out.println("Unrecognized word\n");
}

спросил(а) 2021-01-28T00:35:56+03:00 4 месяца, 3 недели назад
1
Решение
63

Если вы используете последний cmusphinx, он будет возвращать <unk>, когда слово не в грамматике.

ответил(а) 2021-01-28T00:35:56+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема