同时播放录制20kHz/10kHz音频失败,仅能录制人声求助
问题分析与解决方案
核心原因排查
你遇到的问题主要由以下几点导致:
硬件频率响应限制
- 多数笔记本扬声器的有效输出上限在16kHz-18kHz左右,20kHz信号根本无法被播放出来;10kHz虽在理论范围内,但消费级麦克风的高频拾音灵敏度会大幅下降,加上笔记本内部音频回路可能存在低通滤波,最终导致录制不到信号。
- 人声频率集中在200Hz-8kHz,刚好落在硬件最优响应区间,因此能正常录制。
信号格式不匹配
sd.playrec默认期望输入float32类型的音频信号,而你生成的audio_signal是float64类型,可能引发播放异常或录制失败。同步缓冲设置不足
默认缓冲参数下,高频信号的播放与录制同步容易出现偏差,导致录制失效。
修正后的代码
针对上述问题调整后的代码如下:
import numpy as np import sounddevice as sd import librosa import librosa.display import matplotlib.pyplot as plt SAMPLE_RATE = 44100 FREQUENCY = 10000 DURATION = 5 AMPLITUDE = 0.5 def play_record_stereo(chirp_signal, sample_rate): # 设置缓冲块大小,优化同步稳定性 recording = sd.playrec( chirp_signal, samplerate=sample_rate, channels=1, dtype='float32', # 匹配sounddevice默认格式 blocksize=1024 ) sd.wait() return recording[:, 0] # 生成float32格式的音频信号 t = np.linspace(0, DURATION, SAMPLE_RATE * DURATION, False, dtype=np.float32) audio_signal = AMPLITUDE * np.sin(FREQUENCY * 2 * np.pi * t).astype(np.float32) # 播放并录制 recording1 = play_record_stereo(audio_signal, SAMPLE_RATE) x = recording1 # 波形与频谱可视化 plt.figure(figsize=(14,5)) librosa.display.waveshow(x, sr=SAMPLE_RATE) plt.title('录制波形') X = librosa.stft(x) Xdb = librosa.amplitude_to_db(abs(X)) plt.figure(figsize=(14,5)) librosa.display.specshow(Xdb, sr=SAMPLE_RATE, x_axis='time', y_axis='hz') plt.colorbar() plt.title('线性刻度频谱图') plt.figure(figsize=(14, 5)) librosa.display.specshow(Xdb, sr=SAMPLE_RATE, x_axis='time', y_axis='log') plt.colorbar() plt.title('对数刻度频谱图') plt.show()
额外调试建议
- 单独测试播放:用
sd.play(audio_signal, SAMPLE_RATE),同时用手机音频分析APP(如Audio Analyzer)检测是否有高频信号输出。 - 查看设备信息:运行
print(sd.query_devices()),确认输入输出设备的支持格式与频率响应。 - 降频测试:将频率降到8kHz以内,验证硬件能否正常处理该频段信号。
- 尝试软件内录:开启系统内录功能(捕获系统输出而非麦克风输入),避免硬件拾音限制。
内容的提问来源于stack exchange,提问作者alireza
相关产品推荐
相关产品推荐

