我想在python项目中同时使用Snowboy热门单词检测库和SpeechRecognition库。但是,在尝试使两者完美搭配时,我遇到了许多错误。
最初,我以这样的方式进行设置:在检测到热门单词后,Snowboy的回调函数将启动SpeechRecognition的监听函数以接收音频。但是,两个库在创建它们各自的实例时似乎都锁定了对麦克风的访问。这样,这段代码将引发PyAudio的错误消息,其中抱怨SpeechRecognition试图访问已被使用的麦克风(由Snowboy使用)。
我尝试了几种方法来解决此问题,包括使用多线程/多处理以及在使用完每个麦克风实例后立即删除它们,然后在再次需要它们时重新创建它们(非常丑陋)。这些解决方法中,我都没有运气。
我最近的尝试是使用SpeechRecognition内置的Snowboy热门单词实现。我已经知道此功能,但直到现在为止都避免使用它,因为我更喜欢能够控制在热字检测和STT转换之间发生的事情。这样做使我摆脱了在两个库之间共享麦克风的问题,但是现在我从Snowboy的站点训练的热门词汇模型似乎并没有达到应有的效果,甚至根本无法发挥作用。我一起玩了,用不同的麦克风创建不同的模型,并将灵敏度设置调整为无用。
在这一点上,我考虑重新考虑删除/重新创建麦克风实例的想法,以便回到使用Snowboy的库进行热词检测,而不是使用SpeechRecognition中的内置实现,因为我觉得这两种方法的差异足以引起我的当前问题与模型。在切换SpeechRecognition的实现之前,热词检测的效果要好得多。
需要注意的几件事:
如果有人想查看日志,错误输出等,请告诉我。
感谢所有帮助。
答案 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()