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
相关产品推荐
相关产品推荐

