pocketsphinx - 如何从关键字定位切换到语法模式

时间:2016-08-21 23:08:50

标签: speech-recognition speech-to-text cmusphinx pocketsphinx

我正在使用pocketphinx和raspberry pi进行家庭自动化。我用支持的命令编写了一个简单的JSGF语法文件。现在,我想在命令之前使用诸如“嘿计算机”之类的激活短语,以避免错误检测,并且只有在说出激活短语后才执行语音识别。

如果我没有弄错,pocketphinx支持两种语音识别模式:关键字定位模式和语言模型/ JSGF语法模式。

pocketsphinx FAQ解决如何拒绝语法外语的问题时,它说:

  

如果要识别多个命令,可以使用关键字   发现模式或关键字激活模式与切换相结合   语法来执行实际操作。

我的问题是,这种从关键字定位模式到语法模式的“切换”究竟是如何实现的? (我该怎么做才能实现它?)。与此相关,“关键字定位模式”和“关键字激活模式”之间有什么区别?

谢谢!

1 个答案:

答案 0 :(得分:4)

来自tutorial的引用:

开发人员可以使用不同的语法和语言模型配置多个“搜索”对象,并在运行时切换它们,为用户提供交互式体验。

有不同的搜索模式:

  • keyword - 有效地查找关键短语并忽略其他语音。 允许配置检测阈值
  • 语法 - 识别语音 根据JSGF语法。与关键词语法搜索不同 忽略不在语法中但试图识别它们的单词。
  • ngram / lm - 用语言模型识别自然语音。
  • allphone - 使用语音模式识别音素。

每个搜索都有一个名称,可以通过名称引用,名称是特定于应用程序的。函数ps_set_search允许激活先前通过名称添加的搜索。

要添加搜索,需要指向描述搜索的语法/语言模型。语法的位置特定于应用程序。如果只需要简单的识别,只需添加一个搜索或仅使用配置选项配置所需的模式即可。

搜索的确切设计取决于您的应用程序。例如,您可能希望首先侦听激活关键字,一旦识别出关键字,请切换到ngram搜索以识别实际命令。一旦您识别出该命令,您就可以切换到语法搜索以识别确认,然后切换回关键字监听模式以等待另一个命令。

在Python中切换搜索的代码如下所示:

# Init decoder
config = Decoder.default_config()
config.set_string('-hmm', path.join(MODELDIR, 'en-us/en-us'))
config.set_string('-dict', path.join(MODELDIR, 'en-us/cmudict-en-us.dict'))
decoder = Decoder(config)

# Add searches
decoder.set_kws('keyword', 'keyword.list')
decoder.set_lm_file('lm', 'query.lm')
decoder.set_search('keyword')

import pyaudio
p = pyaudio.PyAudio()
stream = p.open(format=pyaudio.paInt16, channels=1, rate=16000, input=True, frames_per_buffer=1024)
stream.start_stream()

in_speech_bf = False
decoder.start_utt()
while True:
    buf = stream.read(1024)
    if buf:
        decoder.process_raw(buf, False, False)
        if decoder.get_in_speech() != in_speech_bf:
            in_speech_bf = decoder.get_in_speech()
            if not in_speech_bf:
                decoder.end_utt()

                # Print hypothesis and switch search to another mode
                print 'Result:', decoder.hyp().hypstr

                if decoder.get_search() == 'keyword':
                     decoder.set_search('lm')
                else:
                     decoder.set_search('keyword')

                decoder.start_utt()
    else:
        break
decoder.end_utt()