首页 > 编程问答 >豪猪中的唤醒词检测

豪猪中的唤醒词检测

时间:2024-07-21 14:34:22浏览次数:11  
标签:python python-3.x ubuntu-20.04

我正在尝试在 python 中实现豪猪唤醒词,并按照 此处

的说明进行操作,我有以下代码:

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() 函数返回 None ,而不是音频帧。 pvporcupine.create().process() 方法需要一个表示音频帧的数值数组作为输入。该错误发生是因为试图获取 None (Python 中的“无值”)的长度。

需要用获取音频帧的实际实现替换 get_next_audio_frame() 函数中的 pass 。这将取决于的音频源。以下是一个使用 sounddevice 库从麦克风获取音频帧的示例:

import pvporcupine
import sounddevice as sd

# 豪猪唤醒词
handle = pvporcupine.create(keywords=['computer', 'jarvis'])

# 音频配置
RATE = 16000  # 豪猪所需的采样率
CHUNK = handle.frame_length  # 豪猪所需的帧长度

def get_next_audio_frame():
    """从麦克风获取音频帧。"""
    audio_data = sd.rec(frames=CHUNK, samplerate=RATE, channels=1, dtype='int16', blocking=True)
    sd.wait()  # 等待录制完成
    return audio_data.flatten().astype('float32')  # 返回展平后的 float32 数组

while True:
    keyword_index = handle.process(get_next_audio_frame())
    if keyword_index >= 0:
        # 在此处插入检测事件回调
        print('Yes sir?')

此代码首先使用 sounddevice.rec() 函数从麦克风录制音频帧。然后,它使用 sd.wait() 等待录制完成。最后,它返回一个包含音频数据的展平的 float32 数组。此数组是传递给 handle.process() 函数的输入。

请记住:

  • 确保已安装 sounddevice 库 ( pip install sounddevice )。
  • 可能需要根据的音频源和豪猪配置调整音频配置(采样率、帧长度)。
  • 如果使用的是不同的音频源,请调整 get_next_audio_frame() 函数以正确读取音频数据。

标签:python,python-3.x,ubuntu-20.04
From: 65725739

相关文章