You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 14:02:06