在python SpeechRecognition库中设置Snowboy hotword检测的问题

2024-10-01 19:20:24 发布

您现在位置:Python中文网/ 问答频道 /正文

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

最初,我将其设置为这样的方式:Snowboy的回调函数将启动SpeechRecognition的listen函数,以便在检测到hotword之后接收音频。但是,这两个库在创建各自的实例时似乎都会锁定对麦克风的访问。因此,这段代码会从PyAudio抛出一个错误,抱怨SpeechRecognition试图访问已经在使用的麦克风(由Snowboy使用)。在

我尝试了几种方法来解决这个问题,包括使用多线程/多处理,在使用完每个麦克风实例后立即删除它们,然后在需要时重新创建它们(相当难看)。不过,我在这些解决办法上一点运气都没有。在

我最近的一次尝试是使用SpeechRecognition内置的Snowboy hotword实现。我知道这个特性,但直到现在我还是避免了,因为我更喜欢控制hotword检测和STT翻译之间发生的事情。这样做让我摆脱了在两个图书馆之间共用一个麦克风的问题,但是现在我从Snowboy网站训练出来的hotword模型似乎并没有达到应有的效果,甚至根本没有达到应有的效果。我试着用不同的麦克风创建不同的模型,并调整灵敏度设置,但都没有用。在

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

有几点需要注意:

  • 树莓树莓
  • 我当前的代码可以找到here
  • 雪人图书馆直接复制到回购。它的实现可以找到here
  • Snowboy hotword的语音识别实现可以找到here

如果有人想看日志,错误输出等,让我知道。在

谢谢你的帮助。在


Tags: 项目实例方法函数代码模型here图书馆
2条回答

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

做这个改变立即修复了我遇到的问题,并使我能够继续我的项目。在

希望这对其他可能陷入困境的人有所帮助。在

你可以将snowboy hotword检测与google助手api结合起来。下面是一个收听连接到google助手(运行在raspberry pi4上,带有来自https://github.com/google/aiyprojects-raspbian/releases/tag/v20191113)的AIY语音图像的hotwords的工作示例

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()

相关问题 更多 >

    热门问题