如果.wav文件持续时间很长,Sphinx4将无法识别完整语音

时间:2018-04-19 21:32:26

标签: java speech-recognition voice-recognition cmusphinx sphinx4

我们正在做一个项目,用户的答案保存为.wav文件并在之后进行评估。我们为每个问题创建了语法。有两个问题我们有识别问题。问题可能是相同的,因为用户必须对这两个问题说约7-8秒。

这是我们用于其中一个问题的语法文件;

#JSGF V1.0;grammar Question8; public <Question8> = (  one hundred | ninety three | eighty six | seventy nine | seventy two | sixty five) * ;

此处,用户必须向后计数7秒。如果说得太快,它会认出来很好。当我慢慢说话时,例如在说“一百”并等待1秒并继续这样直到六十五次之后,它只能识别一百,它将不会识别其他单词。

两个主要部分负责这些过程:

我们为麦克风创建的课程;

public final class SpeechRecorder {
static Configuration configuration = new Configuration();
static Microphone mic = new Microphone(16000, 16, 1, true, true, false, 10, true, "average", 0, "default", 6400);

public static void startMic() {
    mic.initialize();
    mic.startRecording();
    mic.getAudioFormat();
    mic.getUtterance();
    System.out.println("Audio Format is" + mic.getAudioFormat());

}

public static void stopMic(String questionName) {
    mic.stopRecording();
    Utterance u = mic.getUtterance();

    try {
        u.save("Resources/Answers/" + questionName + ".wav", AudioFileFormat.Type.WAVE);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public static String getAnswersOfSpeech(String question) throws IOException {
    Evaluation.disableLogMessages();
    configuration.setAcousticModelPath("resource:/edu/cmu/sphinx/models/en-us/en-us");
    configuration.setDictionaryPath("resource:/edu/cmu/sphinx/models/en-us/cmudict-en-us.dict");
    configuration.setGrammarPath("resource:/Grammer");
    configuration.setGrammarName(question);
    configuration.setUseGrammar(true);
    StreamSpeechRecognizer recognizer = new StreamSpeechRecognizer(configuration);
    recognizer.startRecognition(new FileInputStream("Resources/Answers/" + question + ".wav"));
    SpeechResult Result = recognizer.getResult();
    String speechWords = Result.getHypothesis();

    return speechWords;
}

public static String getSavedAnswer(int question) {

    return User.getAnswers(question);

}

}

这是我们将.wav文件的用户答案保存到我们的资源中的地方。

btn_microphone.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent e) {

            click++;
            if (click % 2 == 1) {
                SpeechRecorder.startMic();
                btn_microphone.setIcon(new ImageIcon("Resources/Images/record.png"));
            } else {
                SpeechRecorder.stopMic("Question" + Integer.toString(question));

                btn_Next.setVisible(true);
                btn_microphone.setIcon(new ImageIcon("Resources/Images/microphone.png"));

                lbl_speechAnswer.setVisible(true);
                try {
                    userAnswer = SpeechRecorder.getAnswersOfSpeech("Question" + Integer.toString(question));
                } catch (IOException e1) {
                    e1.printStackTrace();
                }

                if (userAnswer.equals("")) {
                    lbl_speechAnswer.setText(
                            "<html>No answer was given, click on microphone button to record again</html>");
                } else {
                    lbl_speechAnswer.setText("<html>Your answer is " + userAnswer
                            + ", click on microphone button to record again</html>");
                }
            }

        }

    });

我不知道如何克服这个问题。如果有人能帮助我,我将非常感激。

1 个答案:

答案 0 :(得分:0)

您需要transcriber demo中的循环:

    while ((result = recognizer.getResult()) != null) {
        System.out.format("Hypothesis: %s\n", result.getHypothesis());
    }
    recognizer.stopRecognition();