录音初始阶段音频振幅出现大幅波动的原因探究
关于Stereo Mix录制初始阶段随机振幅波动的问题
我使用PyAudio录制扬声器输出并写入WAV文件,随后绘制该文件的声波图,代码如下:
import pyaudio import wave import numpy as np import matplotlib.pyplot as plt FORMAT = pyaudio.paInt16 CHANNELS = 2 RATE = 44100 CHUNK = 1024 RECORD_SECONDS = 10 WAVE_OUTPUT_FILENAME = "output.wav" p = pyaudio.PyAudio() stereo_mix_name = 'Stereo Mix' info = p.get_host_api_info_by_index(0) numdevices = info.get('deviceCount') stereo_mix = None # Find Stereo Mix device for i in range(0, numdevices): device_info = p.get_device_info_by_host_api_device_index(0, i) if (device_info.get('maxInputChannels')) > 0 and stereo_mix_name in device_info.get('name'): stereo_mix = device_info break stream = p.open(format = FORMAT, channels = CHANNELS, rate = RATE, input = True, input_device_index = stereo_mix.get('index'), frames_per_buffer = CHUNK) frames = [] current_index = 0 audio = np.zeros([CHUNK * 20,], dtype=np.int16) try: while True: data = stream.read(CHUNK) frames.append(data) except KeyboardInterrupt: pass stream.stop_stream() stream.close() p.terminate() # save as WAV file wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb') wf.setnchannels(CHANNELS) wf.setsampwidth(p.get_sample_size(FORMAT)) wf.setframerate(RATE) wf.writeframes(b''.join(frames)) wf.close() # read the output wf = wave.open(WAVE_OUTPUT_FILENAME, 'rb') sample_freq = wf.getframerate() n_samples = wf.getnframes() t_audio = n_samples / sample_freq signal_wave = wf.readframes(n_samples) signal_array = np.frombuffer(signal_wave, dtype=np.int16) times = np.linspace(0, n_samples / sample_freq, num = n_samples * 2) plt.figure(figsize=(15,5)) plt.plot(times, signal_array) plt.title('WAV File') plt.ylabel('Signal Value') plt.xlabel('Time (s)') plt.xlim(0, t_audio) plt.show()
在无播放内容(此时现象更清晰)或有播放内容时录制,发现录音刚启动的阶段存在随机振幅波动,波形如下图:



请问这是什么原因?我使用的是Windows笔记本的Stereo Mix录制设备。
原因分析
- 音频设备初始化瞬态噪声:Stereo Mix作为虚拟录制设备,启动流时驱动需要完成初始化、电平校准等操作,过程中会产生短暂的随机电噪声,表现为波形波动。
- 缓冲区初始填充异常:PyAudio首次调用
stream.read()时,缓冲区可能未完全稳定填充,读取到的初始数据可能包含未初始化的内存值或驱动过渡数据,引发异常波形。 - Windows音频栈调度延迟:Windows音频服务启动新录制流时,可能存在短暂的线程调度延迟,导致初始采样数据出现偏差,呈现振幅波动。
解决建议
- 丢弃初始帧数据:录制开始后先读取5-10帧并丢弃,跳过初始化阶段的异常数据,再将后续帧写入文件。
- 增加设备预热时间:打开流后调用
time.sleep(0.1)等待100ms左右,给驱动和音频栈足够的初始化时间再开始录制。 - 调整缓冲区大小:尝试增大
CHUNK值(如2048或4096),降低初始缓冲区填充的不稳定概率。
内容的提问来源于stack exchange,提问作者coder19
相关产品推荐
相关产品推荐

