Python实现麦克风连续基音检测遇问题,求简易方案及报错解决
修复pitch库音频检测错误 + 麦克风实时基音检测简易实现
一、解决ValueError: object too deep for desired array错误
这个错误几乎都是因为你的音频文件是双声道(立体声),而pitch库仅支持单声道输入。用以下代码处理音频文件即可:
import wave import numpy as np import pitch # 读取音频文件 with wave.open('sample.wav', 'rb') as wf: channels = wf.getnchannels() sample_rate = wf.getframerate() frames = wf.readframes(wf.getnframes()) # 转成numpy数组,双声道则取单通道数据 audio_data = np.frombuffer(frames, dtype=np.int16) if channels == 2: audio_data = audio_data[::2] # 检测基音 p = pitch.find_pitch(audio_data, sample_rate) print('pitch =', p)
二、麦克风实时连续基音检测实现
用sounddevice获取实时麦克风输入,结合pitch库实现连续检测,步骤简单:
1. 安装依赖
pip install sounddevice numpy pitch
2. 实时检测代码
import sounddevice as sd import numpy as np import pitch # 配置参数 sample_rate = 44100 # 音频采样率 block_size = 1024 # 每次检测的音频片段长度 def detect_pitch(indata, frames, time, status): # 把多通道数据转成一维单声道数组 audio_data = indata.flatten().astype(np.int16) try: current_pitch = pitch.find_pitch(audio_data, sample_rate) if current_pitch: print(f"当前基音: {current_pitch:.1f} Hz") except: pass # 忽略检测失败的情况 # 启动麦克风流,持续检测 with sd.InputStream(samplerate=sample_rate, blocksize=block_size, channels=1, callback=detect_pitch): print("正在检测基音,按Ctrl+C停止...") while True: pass
注意事项
- 环境噪音大时,可调整
block_size(比如改为2048)提升检测稳定性 - 该方法基于自相关算法,对人声、乐器等基音明显的信号效果较好
内容的提问来源于stack exchange,提问作者Kabir Agarwal
相关产品推荐
相关产品推荐

