Как обнаружить словарное слово в CMU Sphinx

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

#JSGF V1.0;

grammar hello;

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

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

Мой код такой:

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");
 }

person Si Bui    schedule 06.04.2015    source источник


Ответы (1)


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

person Nikolay Shmyrev    schedule 06.04.2015
comment
привет @Nikolay Shmyrev, спасибо за ваш ответ, но можете ли вы показать мне, как это сделать с примером кода? - person Si Bui; 06.04.2015
comment
Я не вижу, какая часть в этих учебниках показывает, какой класс нам нужно использовать, чтобы получить ‹unk›, когда слово отсутствует в грамматике. Принадлежит ли он классу Result? . Что мне нужно сделать после этого: Результат результата = распознаватель.recognize();? - person Si Bui; 07.04.2015
comment
В этом разделе stackoverflow.com/questions/16994980 /, я понял, что мы должны добавить свойство OOG в файл конфигурации. Но как мы можем проверить '‹unk'› в коде Java? Можете ли вы просто написать это здесь для меня? @Николай Шмырев - person Si Bui; 07.04.2015
comment
Тема устарела. Вам не нужно ничего менять, просто проверьте демонстрацию Dialog в последних источниках, она делает то, что вам нужно. - person Nikolay Shmyrev; 07.04.2015