代码之家  ›  专栏  ›  技术社区  ›  user3303504

在SpeechRecognition包中使用语法时出现运行时错误

  •  1
  • user3303504  · 技术社区  · 7 年前

    所以我试着用语法 speech_recognition.recognize_sphinx() 但是,我得到以下错误:

    RuntimeError: Decoder_set_fsg returned -1
    

    这是我的代码:

    主要的py公司

    # Dependencies:
    import speech_recognition as sr
    
    # Collect audio sample
    r = sr.Recognizer()
    print('Please say "perquisition":')
    with sr.Microphone() as source:
        audio_en = r.listen(source)
    print('Processing...')
    
    # Attempt to convert the speech to text
    try:
        print(r.recognize_sphinx(audio_en, grammar='perquisition.gram'))
    except sr.UnknownValueError:
        print("Sphinx could not understand audio")
    except sr.RequestError as e:
        print("Sphinx error; {0}".format(e))
    

    特权。克

    #JSGF V1.0;
    grammar perquisition;
    // Grammar rule names should be [a-zA-Z0-9] only!
    public <perquisition> = ( perquisition );
    

    有什么想法吗?

    1 回复  |  直到 7 年前
        1
  •  1
  •   user3303504    7 年前

    这里有一些事情掩盖了潜在的bug。 speech_recognition.recognize_sphinx() 只是几个CMUsphinx命令的包装器,可以找到 here 第746行。这个问题有点混乱,因此我们将重点关注下面的代码片段:

    # Dependencies
    import speech_recognition as sr
    import os
    import pocketsphinx as ps
    
    # Manually point to the grammar file
    grammar = 'search.gram'
    try:
        # Point to the model files
        language_directory = os.path.join(os.path.dirname(os.path.realpath(__file__)), "pocketsphinx-data", "en-US")
        acoustic_parameters_directory = os.path.join(language_directory, "acoustic-model")
        language_model_file = os.path.join(language_directory, "language-model.lm.bin")
        phoneme_dictionary_file = os.path.join(language_directory, "pronounciation-dictionary.dict")
    
        # Create a decoder object with our custom parameters
        config = ps.Decoder.default_config()
        config.set_string("-hmm",
                          acoustic_parameters_directory)  # set the path of the hidden Markov model (HMM) parameter files
        config.set_string("-lm", language_model_file)
        config.set_string("-dict", phoneme_dictionary_file)
        config.set_string("-logfn", os.devnull)  # <--- Prevents you from seeing the actual bug!!!
        decoder = ps.Decoder(config)
    
        # Convert grammar
        grammar_path = os.path.abspath(os.path.dirname(grammar))
        grammar_name = os.path.splitext(os.path.basename(grammar))[0]
        fsg_path = "{0}/{1}.fsg".format(grammar_path, grammar_name)
        if not os.path.exists(fsg_path):  # create FSG grammar if not available
            jsgf = ps.Jsgf(grammar)
            rule = jsgf.get_rule("{0}.{0}".format(grammar_name))
            fsg = jsgf.build_fsg(rule, decoder.get_logmath(), 7.5)
            fsg.writefile(fsg_path)
            print('Successful JSFG to FSG conversion!!!')
    
        # Pass the fsg file into the decoder
        decoder.set_fsg(grammar_name, fsg)  # <--- BUG IS HERE!!!
    
    except Exception as e:
        print('Ach no! {0}'.format(e))
    finally:
        os.remove('search.fsg')  # Remove again to help prove that the grammar to fsg conversion isn't at fault
    

    运行该代码时,我们会发现错误出现了,但日志信息也被关闭了!打开后,大量文本会被丢弃到终端中,这可能会造成麻烦。在这种情况下,将其重新打开以发现。。。

    ...
    ERROR: "fsg_search.c", line 141: The word 'perquisition' is missing in the dictionary
    ...
    

    现在我们有进展了。这给我们留下了两个选择之一。首先我们可以扫描字典( pocketsphinx.get_model_path()+'/cmudict-en-us.dict' 或类似的)来确定一个单词是否存在。然后我们可以决定是忽略这个词,还是将它添加到字典中。

    添加到字典不一定是直接的。。。这取决于它与词典中其他单词的相似程度,你可能会侥幸逃脱。否则,您还必须重新培训模型。关于如何做到这一点,可以找到更好的解释 here 享受