树莓派Zero上PvRecorder读取速度不足问题求助
在树莓派Zero上使用Picovoice(Rhino语音转意图+PvRecorder)的缓冲区溢出问题
我在树莓派Zero上使用Picovoice的Rhino语音转意图工具和PvRecorder录音模块,代码如下:
from pvrecorder import PvRecorder import pvrhino # 我的Picovoice密钥 key='my_access_key' # 已移除实际密钥 # 创建Rhino实例 rhino = pvrhino.create( access_key=key, context_path='/home/aashvikt/Desktop/MiniMate/Contexts/Mini-Mate-Commands_en_raspberry-pi_v2_1_0.rhn' ) # 创建录音器 recorder = PvRecorder(device_index=-1,frame_length=512) recorder.start() def getNextAudioFrame(): return recorder.read() while True: audioFrame = getNextAudioFrame() isFinalized = rhino.process(audioFrame) if isFinalized: inference = rhino.get_inference() if inference.is_understood: recorder.stop() intent = inference.intent slots = inference.slots print(f"intent: {intent}\nslots: {slots}") recorder.start() else: print('无法识别') rhino.delete()
运行代码时出现警告:[WARN]- Overflow: Reader not reading fast enough,使用的是USB麦克风,请问可能是什么问题?
可能的原因及解决办法
1. 树莓派Zero性能瓶颈
树莓派Zero的CPU性能较弱,rhino.process()处理音频帧的速度跟不上录音器采集音频的节奏,导致音频缓冲区数据堆积溢出。
解决措施:
- 降低
frame_length参数值,比如从512调整为256,减少单次处理的数据量,降低CPU单次计算负载 - 移除循环中不必要的录音启停操作:代码里的
recorder.stop()和recorder.start()会额外消耗系统资源,保持录音持续运行即可,只在程序退出时停止录音
2. 采样率不匹配
Rhino默认使用16kHz采样率,如果USB麦克风的采样率与此不符,PvRecorder需要额外进行采样率转换,进一步消耗CPU资源。
解决措施:
- 用
arecord --dump-hw-params命令查看USB麦克风的硬件采样率 - 创建PvRecorder时显式指定16kHz采样率:
recorder = PvRecorder(device_index=-1, frame_length=512, sample_rate=16000)
3. 系统音频缓冲区配置不合理
树莓派默认的ALSA音频缓冲区可能过小,导致录音数据来不及处理就溢出。
解决措施:
- 修改
/etc/asound.conf配置文件,增大缓冲区大小(替换card 1为你的USB麦克风设备编号):
pcm.!default { type hw card 1 } ctl.!default { type hw card 1 } pcm.dmixer { type dmix ipc_key 1024 ipc_perm 0666 slave { pcm "hw:1,0" period_time 0 period_size 1024 buffer_size 4096 rate 16000 } }
- 重启树莓派使配置生效
4. 后台进程占用CPU资源
树莓派Zero本身性能有限,若后台运行其他高CPU占用程序,会导致音频处理线程无法及时读取音频帧。
解决措施:
- 用
top命令查看CPU占用情况,关闭不必要的后台进程 - 给Python脚本设置更高优先级,比如用
nice -n -10 python3 your_script.py运行(替换your_script.py为你的脚本文件名)
内容的提问来源于stack exchange,提问作者aashvikt
相关产品推荐
相关产品推荐

