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

Speech recognition pocketsphinx-如何从关键字定位切换到语法模式,speech-recognition,speech-to-text,cmusphinx,pocketsphinx,Speech Recognition,Speech To Text,Cmusphinx,Pocketsphinx,我正在使用Pocketsphenx和覆盆子pi实现家庭自动化。我已经用支持的命令编写了一个简单的JSGF语法文件。现在,我想在命令之前使用一个激活短语,如“hey computer”,以避免错误检测,并且只在激活短语被说出后执行语音识别 如果我没有弄错的话,pocketsphinx支持两种语音识别模式:关键字定位模式和语言模式/JSGF语法模式 在谈到如何拒绝语法外的单词时,它说: 如果要识别多个命令,可以使用关键字 定位模式或关键字激活模式结合切换到 执行实际操作的语法 我的问题是,这种从关键

我正在使用Pocketsphenx和覆盆子pi实现家庭自动化。我已经用支持的命令编写了一个简单的JSGF语法文件。现在,我想在命令之前使用一个激活短语,如“hey computer”,以避免错误检测,并且只在激活短语被说出后执行语音识别

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

在谈到如何拒绝语法外的单词时,它说:

如果要识别多个命令,可以使用关键字 定位模式或关键字激活模式结合切换到 执行实际操作的语法

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

谢谢

引用自:

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

可能有不同的搜索模式:

  • 关键字-高效地查找关键字短语并忽略其他语音。 允许配置检测阈值
  • 语法-识别语音 根据JSGF语法。与关键字短语不同,语法搜索不需要 忽略语法中没有的单词,但试着识别它们
  • ngram/lm-使用语言模型识别自然语音
  • allphone-使用语音语言模型识别音素
每个搜索都有一个名称,可以由名称引用,名称是特定于应用程序的。功能
ps\u set\u 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()

谢谢你,尼古拉!我试试看。你知道,作为一般性的评论,我已经看到越来越多的人,包括我自己,尝试使用
pocketsphinx\u continuous
可执行文件做任何事情,就好像它是pocketsphinx的“瑞士军刀”。但我看到的是,它只是一个示例程序,应该被视为示例程序,如果你想做更高级的事情,你应该使用sphinx库/API/等编写自己的软件。我的评价正确吗?这是正确的,这绝对不是瑞士军刀。@NikolayShmyrev我知道这个问题有点老了,但你能帮我提个问题吗?我有一些C++代码,我很难从脚本中运行这个脚本,想知道这个脚本是否有C++版本?”MarcoNeves您可以从应用程序中的
src/programs/continue.c
复制pocketsphinx_continuous中的粘贴代码,它会工作的。@NikolayShmyrev我找到了该文件,但我不确定您所说的将代码复制/越过我的应用程序是什么意思。你是说在我的工作区内复制一份吗?在我的程序中如何称呼它?