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

时间:2018-10-30 22:03:27

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

我想在python项目中同时使用Snowboy热门单词检测库和SpeechRecognition库。但是,在尝试使两者完美搭配时,我遇到了许多错误。

最初,我以这样的方式进行设置:在检测到热门单词后,Snowboy的回调函数将启动SpeechRecognition的监听函数以接收音频。但是,两个库在创建它们各自的实例时似乎都锁定了对麦克风的访问。这样,这段代码将引发PyAudio的错误消息,其中抱怨SpeechRecognition试图访问已被使用的麦克风(由Snowboy使用)。

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

我最近的尝试是使用SpeechRecognition内置的Snowboy热门单词实现。我已经知道此功能,但直到现在为止都避免使用它,因为我更喜欢能够控制在热字检测和STT转换之间发生的事情。这样做使我摆脱了在两个库之间共享麦克风的问题,但是现在我从Snowboy的站点训练的热门词汇模型似乎并没有达到应有的效果,甚至根本无法发挥作用。我一起玩了,用不同的麦克风创建不同的模型,并将灵敏度设置调整为无用。

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

需要注意的几件事:

  • 在具有Raspbian的Raspberry Pi 3 B +上运行
  • 可以找到我当前的代码here
  • Snowboy库直接复制到存储库中。可以找到它的实现here
  • Snowboy热门单词的语音识别实现here

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

感谢所有帮助。

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

您可以将snowboy热门单词检测与google-assistant-api结合使用。以下是一个有效的示例,可收听连接到Google助手的多个热词(使用https://github.com/google/aiyprojects-raspbian/releases/tag/v20191113上的AIY VOICE IMAGE在树莓派4上运行)

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