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

录音初始阶段音频振幅出现大幅波动的原因探究

关于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()

在无播放内容(此时现象更清晰)或有播放内容时录制,发现录音刚启动的阶段存在随机振幅波动,波形如下图:

声波图1
声波图2
声波图3

请问这是什么原因?我使用的是Windows笔记本的Stereo Mix录制设备。


原因分析

  • 音频设备初始化瞬态噪声:Stereo Mix作为虚拟录制设备,启动流时驱动需要完成初始化、电平校准等操作,过程中会产生短暂的随机电噪声,表现为波形波动。
  • 缓冲区初始填充异常:PyAudio首次调用stream.read()时,缓冲区可能未完全稳定填充,读取到的初始数据可能包含未初始化的内存值或驱动过渡数据,引发异常波形。
  • Windows音频栈调度延迟:Windows音频服务启动新录制流时,可能存在短暂的线程调度延迟,导致初始采样数据出现偏差,呈现振幅波动。

解决建议

  • 丢弃初始帧数据:录制开始后先读取5-10帧并丢弃,跳过初始化阶段的异常数据,再将后续帧写入文件。
  • 增加设备预热时间:打开流后调用time.sleep(0.1)等待100ms左右,给驱动和音频栈足够的初始化时间再开始录制。
  • 调整缓冲区大小:尝试增大CHUNK值(如2048或4096),降低初始缓冲区填充的不稳定概率。

内容的提问来源于stack exchange,提问作者coder19

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 17:04:58