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

Python中带通滤波器处理音频后导出文件时长不符问题求助

音频降噪脚本导出时长翻倍问题解决

问题原因

你的脚本导出的WAV时长翻倍,核心原因是原音频为立体声格式,但处理时未考虑声道逻辑:

  • pydub的get_array_of_samples()返回的是交错排列的立体声采样数据(左声道、右声道交替存储),总采样数是单声道的2倍。
  • 你直接将整个采样数组滤波后导出,却按单声道逻辑写入WAV文件,播放时系统会把总采样数当作单声道数据计算时长,最终时长变为原文件的2倍(36秒→72秒)。

解决方法

需根据原音频的声道数处理采样数据,保留声道信息后再导出。以下是修改后的完整代码:

!pip install pydub
from pydub import AudioSegment
from matplotlib import pyplot as plt
import numpy as np
from scipy import signal
from scipy.io.wavfile import write

# 加载音频并获取基础参数
audio = AudioSegment.from_file('fileInput.mp3')
sample_rate = audio.frame_rate
channels = audio.channels

# 转换采样数据为numpy数组,按声道数重塑格式
samples = np.array(audio.get_array_of_samples())
if channels > 1:
    # 立体声:将交错采样拆分为多声道二维数组
    samples = samples.reshape(-1, channels)

# 设计Butterworth带阻滤波器
sos = signal.butter(10, [100, 4000], 'bandstop', fs=sample_rate, output='sos')

# 对每个声道分别执行滤波
filtered = np.zeros_like(samples)
for i in range(channels):
    filtered[:, i] = signal.sosfilt(sos, samples[:, i])

# 合并声道数据(转回交错格式)并转换为int16类型
if channels > 1:
    filtered = filtered.flatten()
filtered = filtered.astype(np.int16)

# 导出WAV文件,使用原音频的采样率
write('./test.wav', sample_rate, filtered)

关键修改点

  • 不再硬写采样率44100,改为读取原音频的frame_rate,适配不同采样率的音频文件。
  • 针对立体声数据,将交错采样重塑为二维数组,分声道滤波后再合并回交错格式,保留原声道结构。
  • 导出时严格匹配原音频的采样率与声道数,避免时长计算错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 17:50:23