如何使用Python为音频文件设置全程固定音量,解决音量不均问题?
双说话人音量差异问题解决方案
常规pydub normalize功能基于整段音频的峰值调整增益,会被高音量的1号说话人片段限制增益上限,无法单独抬高低音量的2号说话人内容,这是此前方案无效的核心原因。
方案1:说话人分离后单独归一化(效果最优)
- 第一步使用预训练的说话人分离工具将音频中1号、2号说话人的内容按时间轴拆分,可选工具包括
pyannote.audio预训练模型、SpeechBrain分离模块,或轻量工具whisperx - 第二步对拆分后的1号说话人音频做峰值限制,统一调整到-16LUFS的标准对话响度
- 第三步对拆分后的2号说话人音频做响度归一化,拉高到和1号说话人相同的响度水平
- 最后将两段处理后的音频按原始时间轴对齐合并即可
方案2:动态范围压缩快速处理(无需分离说话人)
如果不需要最优效果,可以直接用音频压缩器压减动态范围,同时拉高低音量片段增益,pydub调用ffmpeg滤镜的示例代码如下:
from pydub import AudioSegment # 读取原始音频 raw_audio = AudioSegment.from_file("your_audio_file.wav") # 调用ffmpeg的acompressor滤镜,阈值-20dB,压缩比4:1,压低高音量峰值 compressed_audio = raw_audio.filter( "acompressor", threshold=-20, ratio=4, attack=10, release=200 ) # 对压缩后的音频做整体响度归一化 final_audio = compressed_audio.normalize() # 导出处理后文件 final_audio.export("processed_audio.wav", format="wav")
如果2号说话人音量仍然偏低,可以在压缩后额外增加增益,将平均响度低于-30dB的非静音片段单独提升10-15dB,注意不要过度拉高背景噪声。
方案3:自定义分段增益调整
你也可以自己实现小片段扫描逻辑,针对性调整低音量片段增益:
- 将整段音频按100ms为单位拆分为多个小片段
- 计算每个小片段的平均响度,筛选出响度低于-30dB的非静音片段(对应2号说话人内容)
- 对筛选出的片段计算需要提升的增益,拉高到和整段音频平均响度一致的水平
- 增益调整时对片段首尾加5ms的淡入淡出,避免出现爆音问题
内容的提问来源于stack exchange,提问作者Nutan Haq
相关产品推荐
相关产品推荐

