【问题标题】:Wake word detection in porcupine豪猪中的唤醒词检测
【发布时间】:2021-04-19 20:54:37
【问题描述】:

我正在尝试在 python 中实现 porcupine wakeword,并已按照 here 的说明进行操作

我有以下代码:

import pvporcupine

### Porcupine wakeword
handle = pvporcupine.create(keywords=['computer', 'jarvis'])

def get_next_audio_frame():
    pass

while True:
    keyword_index = handle.process(get_next_audio_frame())
    if keyword_index >= 0:
        # Insert detection event callback here
        print('Yes sir?')
        pass

但我收到以下错误:

❯ python3 porcupine.py Traceback (most recent call last):   File "porcupine.py", line 10, in <module>
    keyword_index = handle.process(get_next_audio_frame())   File "/home/rupstar/Computer/lib/python3.8/site-packages/pvporcupine/porcupine.py", line 129, in process
    if len(pcm) != self.frame_length: TypeError: object of type 'NoneType' has no len()

【问题讨论】:

  • 您将get_next_audio_frame 定义为只是pass,这意味着None 被返回。那么为什么你期望handle.process(None) 工作呢?根据source codepcm 参数应该是“一帧音频样本”,而不是None。该示例在get_next_audio_frame 中有pass 的原因仅仅是因为它是一个示例。你应该真正做点什么,而不仅仅是pass
  • 谢谢@RandomDavis...我对此很陌生,所以您的评论对我学习非常有用。所以基本上我必须告诉它听一段时间的声音然后重复直到它听到唤醒词?然后我必须让我的语音助手听命令……我想我可以轻松地整合第二位,但我会在第一位上挣扎……至少我现在有方向了。再次感谢!
  • 这根本不是我要说的。我不知道pvporcupine 究竟做了什么或它是如何工作的。我只是说get_next_audio_frame 必须返回音频,这意味着您必须从某个地方捕获它。网上可能有关于如何将 pvporcupine 与其他捕获音频的库结合使用的示例。
  • @RandomDavis 感谢您的指导,这正是我所需要的!我现在已经捕获了音频并将其成功应用到我的语音助手中,所以当我说“Jarvis”或“计算机”时,现在没有 pvporcupine(这是一个唤醒词检测器)听到我的声音,然后我可以给它发出命令来做事我的 Windows 10 电脑;例如打开应用程序,返回 wikipedia 条目,告诉我时间、日期、基于位置的天气、笑话等,等等……所有这些都来自在 WSL2 上运行的 ubuntu 命令行!
  • 酷,很高兴有帮助。您可以发布您的解决方案作为答案,如果需要,可以接受。

标签: python python-3.x ubuntu-20.04


【解决方案1】:

这可能并不完美(并非如此),但它展示了我如何在 Windows 10 机器上运行 Ubuntu 20.04 的 WSL2 上使用 python 创建个人语音助手。语音助手响应唤醒词(Jarvis 或计算机),然后执行命令。 与这篇文章相关的是如何调用 porcupine:

#!/usr/bin/env python3
#Porcupine wakeword includes
import struct
import pyaudio
import pvporcupine

porcupine = None
pa = None
audio_stream = None

try:
    porcupine = pvporcupine.create(keywords=["computer", "jarvis"])

    pa = pyaudio.PyAudio()

    audio_stream = pa.open(
                    rate=porcupine.sample_rate,
                    channels=1,
                    format=pyaudio.paInt16,
                    input=True,
                    frames_per_buffer=porcupine.frame_length)

    while True:
        pcm = audio_stream.read(porcupine.frame_length)
        pcm = struct.unpack_from("h" * porcupine.frame_length, pcm)

        keyword_index = porcupine.process(pcm)

        if keyword_index >= 0:
            print("Hotword Detected")
            speak("Computer online")

【讨论】:

  • 考虑只发布与 OP 问题相关的代码,并解释该部分。您仍然可以链接其余部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-21
  • 2011-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多