与 python SpeechRecognition 库一起设置 Snowboy 热词检测的问题

Issue setting up Snowboy hotword detection alongside python SpeechRecognition library

我想在 python 项目中同时使用 Snowboy 热词检测库和 SpeechRecognition 库。然而,我遇到了很多不同的错误,试图让两者一起玩得很好。

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

我尝试了几种方法来解决这个问题,包括使用 multithreading/multiprocessing 并在每个麦克风实例使用完毕后立即删除它们,然后在再次需要它们时重新创建它们(非常难看)。不过,我对这些解决方法都没有任何运气。

我最近的尝试是使用 SpeechRecognition 的内置 Snowboy 热词实现。我早就知道这个功能,但直到现在才避免使用它,因为我更喜欢能够控制热词检测和 STT 翻译之间发生的事情。这样做让我解决了在两个库之间共享麦克风的问题,但现在我从 Snowboy 的网站训练的热词模型似乎根本无法正常工作。我试过用不同的麦克风创建不同的模型并调整灵敏度设置都无济于事。

在这一点上,我考虑重新考虑 deleting/recreating 麦克风实例的想法,回到使用 Snowboy 的库进行热词检测,而不是 SpeechRecognition 中的内置实现,因为我觉得这两种方法完全不同导致我当前的模型问题。在切换 SpeechRecognition 的实现之前,热词检测的效果要好得多。

有几点需要注意:

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

感谢所有帮助。

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

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

希望这对其他可能卡在这个问题上的人有所帮助。

您可以将 snowboy 热词检测与 google-assistant-api 结合使用。下面是收听连接到 google 助手的一些热词的工作示例(运行 在 raspberry pi 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()