Поиск ключевых слов или фраз с помощью Sphinx4

В настоящее время я пытаюсь заставить свой java-код (используя eclipse) выполнять некоторую функцию, если сказано что-то определенное. Я использую библиотеки Sphinx4, и это то, что у меня сейчас есть:

То, что я хотел бы сделать, находится в строке, где написано:

IF (TRUE) someFunction();

состоит в том, чтобы запустить функцию, если моя речь звучит как «Привет, компьютер», «Привет, Джарвис», «Доброе утро, компьютер» или «Доброе утро, Джарвис». Или, другими словами, запустите функцию, если речь соответствует строке кода «public ‹ приветствие >» в файле .gram. Еще более конкретно, верните «приветствовать», если моя речь соответствует этому грамматическому правилу. Извините, если это не имеет смысла...

Вот мой файл listener.java:

package speechRecognition;

import java.io.File;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import edu.cmu.sphinx.frontend.util.Microphone;
import edu.cmu.sphinx.recognizer.Recognizer;
import edu.cmu.sphinx.result.Result;
import edu.cmu.sphinx.util.props.ConfigurationManager;

public class Listener {

    public void someFunction(){
        System.out.println("Did Something");
    }

    public static void main(String[] args) {
        ConfigurationManager cm;
        if (args.length > 0) { cm = new ConfigurationManager(args[0]);
        } else { cm = new ConfigurationManager(Listener.class.getResource("configurations.config.xml")); }

        Recognizer recognizer = (Recognizer) cm.lookup("recognizer");
        recognizer.allocate();

        Microphone microphone = (Microphone) cm.lookup("microphone");
        if (!microphone.startRecording()) {
            System.out.println("Cannot start microphone.");
            recognizer.deallocate();
            System.exit(1);
        }

        while (true) {
            Result result = recognizer.recognize();
            if (result != null) {
                String resultText = result.getBestFinalResultNoFiller();
                if (resultText != "" && resultText != null) {
                    IF (TRUE) someFunction();
                }
            } else {
                System.out.println("I can't hear what you said.\n");
            }
        }
    }
}

А вот и мой Dictionary.gram:

#JSGF V1.0;
grammar dictionary;

public <greet> = (Hello | Good Morning) (Jarvis | Computer);

person mray190    schedule 08.06.2013    source источник


Ответы (1)


Вы можете сделать это, но единственное, что вам нужно включить обнаружение OOG в sphinx4. В основном возьмите любой пример грамматики sphinx4 и включите OOG в соответствии с этой вики-страницей в файле конфигурации:

<component name="flatLinguist"
           type="edu.cmu.sphinx.linguist.flat.FlatLinguist">
     ....
    <property name="addOutOfGrammarBranch" value="true"/>
    <property name="outOfGrammarProbability" value="1E-20"/>
    <property name="phoneInsertionProbability" value="1E-10"/>
    <property name="phoneLoopAcousticModel" value="wsj"/>
     ...
</component>

После этого он вернет вам <unk> слова в результате, если записано просто случайное слово, и вернет вам ключевую фразу, если записано слово из вашей грамматики.

Вам нужно настроить вероятность outOfGrammar, чтобы получить надежное обнаружение. Подробнее см.

http://cmusphinx.sourceforge.net/wiki/sphinx4:rejectionhandling

person Nikolay Shmyrev    schedule 08.06.2013
comment
Возможно ли иметь OutOfGrammarBranch только для одной части грамматики, которая будет ключевым словом? - person Aubtin Samai; 14.10.2014