【问题标题】:Issue setting up Snowboy hotword detection alongside python SpeechRecognition library在 python SpeechRecognition 库旁边设置 Snowboy 热门词检测的问题
【发布时间】:2019-11-24 03:40:42
【问题描述】:

我想在 python 项目中同时使用 Snowboy 启动词检测库和 SpeechRecognition 库。但是,我一直在尝试让两者配合得很好时遇到了许多不同的错误。

最初,我已将其设置为 Snowboy 的回调函数将启动 SpeechRecognition 的侦听函数以在检测到启动词后接收音频。但是,当创建各自的实例时,这两个库似乎都锁定了对麦克风的访问。因此,此代码会从 PyAudio 引发错误,抱怨 SpeechRecognition 试图访问已被(由 Snowboy)使用的麦克风。

我尝试了几种方法来解决此问题,包括使用多线程/多处理并在使用完每个麦克风实例后立即删除它们,然后在再次需要它们时重新创建它们(非常丑陋)。不过,我对这些变通办法都没有任何运气。

我最近的尝试是使用 SpeechRecognition 内置的 Snowboy 启动指令实现。我知道这个功能,但直到现在都没有使用它,因为我更喜欢能够控制启动指令检测和 STT 翻译之间发生的事情。这样做让我解决了在两个库之间共享麦克风的问题,但现在我从 Snowboy 的网站训练的热词模型似乎并没有达到应有的效果,甚至根本没有。我尝试使用不同的麦克风创建不同的模型并调整灵敏度设置,但无济于事。

此时,我正在考虑重新考虑删除/重新创建麦克风实例的想法,以重新使用 Snowboy 的库进行启动指令检测,而不是 SpeechRecognition 中的内置实现,因为我觉得这两种方法的不同足以导致我当前的问题与模型。在切换 SpeechRecognition 的实现之前,启动指令检测的效果要好得多。

有几点需要注意:

  • 在带有 Raspbian 的 Raspberry Pi 3 B+ 上运行
  • 我当前的代码可以在here找到
  • Snowboy 库被直接复制到 repo 中。它的实现可以在here找到
  • SpeechRecognition 的 Snowboy hotword 实现可以找到here

如果有人想查看日志、错误输出等,请告诉我。

感谢所有帮助。

【问题讨论】:

    标签: python raspberry-pi speech-recognition speech-to-text pyaudio


    【解决方案1】:

    对于可能遇到相同或类似问题的任何人,我都找到了解决方案。我尝试的所有方法最终都不起作用,但我发现我正在寻找的功能已经内置到 Snowboy 库中。但是,可直接下载的预构建二进制文件已经过时,还没有此功能。因此,要获得我描述的功能,您必须按照 Snowboy 的 GitHub 存储库上的 README 中的说明编译您自己的自定义二进制文件。

    进行此更改立即解决了我遇到的问题,并使我能够继续我的项目。

    希望这可以帮助其他可能陷入困境的人。

    【讨论】:

      【解决方案2】:

      您可以将 snowboy 启动指令检测与 google-assistant-api 结合使用。下面是一个收听连接到谷歌助手的一些热词的工作示例(在树莓派 4 上运行,带有来自https://github.com/google/aiyprojects-raspbian/releases/tag/v20191113 的 AIY VOICE IMAGE)

      import locale
      import logging
      import signal
      from aiy.assistant.grpc import AssistantServiceClientWithLed
      from aiy.board import Board
      import mod.snowboydecoder as snowboydecoder
      
      models = ['/home/pi/snowboy/resources/wake_word1.umdl',
            '/home/pi/snowboy/resources/wake_word12.umdl']
      
      def main():
          logging.basicConfig(level=logging.DEBUG)
          signal.signal(signal.SIGTERM, lambda signum, frame: sys.exit(0))
      
          detector = snowboydecoder.HotwordDetector(models, sensitivity=0.5)
          with Board() as board:
              assistant = AssistantServiceClientWithLed(
                  board=board,
                  volume_percentage=100,
                  language_code=locale.getdefaultlocale())
              while True:
                  logging.info('say any of your pre-defined hotwords to start the     assisteant')
                  detector.start()
                  logging.info('assistant is now listening :)')
                  assistant.conversation()
      
      if __name__ == '__main__':
          main()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-29
        • 1970-01-01
        • 2010-10-30
        • 2020-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-14
        相关资源
        最近更新 更多