我正在尝试在 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()
函数以正确读取音频数据。