本文目录导读:

方法1:去除开头静音(自动检测)
import os
from pydub import AudioSegment
def remove_initial_silence(input_dir, output_dir, silence_thresh=-50.0, chunk_size=10):
"""
批量去除音频文件开头静音
参数:
input_dir: 输入文件夹路径
output_dir: 输出文件夹路径
silence_thresh: 静音阈值(dBFS),越小越敏感
chunk_size: 检测静音的块大小(ms)
"""
if not os.path.exists(output_dir):
os.makedirs(output_dir)
for filename in os.listdir(input_dir):
if filename.endswith(('.mp3', '.wav', '.m4a', '.ogg', '.flac')):
file_path = os.path.join(input_dir, filename)
print(f"处理: {filename}")
# 加载音频文件
audio = AudioSegment.from_file(file_path)
# 检测并去除开头静音
start_trim = detect_leading_silence(audio, silence_thresh, chunk_size)
trimmed_audio = audio[start_trim:]
# 保存处理后的文件
output_path = os.path.join(output_dir, filename)
trimmed_audio.export(output_path, format=os.path.splitext(filename)[1][1:])
print(f" - 去除 {start_trim/1000:.2f} 秒静音")
def detect_leading_silence(sound, silence_thresh=-50.0, chunk_size=10):
"""
检测音频开头的静音长度
返回需要剪切的毫秒数
"""
trim_ms = 0
while trim_ms < len(sound):
if sound[trim_ms:trim_ms+chunk_size].dBFS > silence_thresh:
break
trim_ms += chunk_size
return trim_ms
# 使用示例
if __name__ == "__main__":
input_folder = "input_audio" # 输入文件夹
output_folder = "output_audio" # 输出文件夹
remove_initial_silence(input_folder, output_folder)
方法2:去除固定长度开头
import os
from pydub import AudioSegment
def remove_fixed_duration(input_dir, output_dir, remove_seconds=1.0):
"""
批量去除音频文件开头固定长度
参数:
input_dir: 输入文件夹路径
output_dir: 输出文件夹路径
remove_seconds: 去除开头的秒数
"""
if not os.path.exists(output_dir):
os.makedirs(output_dir)
remove_ms = int(remove_seconds * 1000) # 转换为毫秒
for filename in os.listdir(input_dir):
if filename.endswith(('.mp3', '.wav', '.m4a', '.ogg', '.flac')):
file_path = os.path.join(input_dir, filename)
print(f"处理: {filename}")
# 加载音频文件
audio = AudioSegment.from_file(file_path)
# 去除开头固定长度
trimmed_audio = audio[remove_ms:] if len(audio) > remove_ms else audio
# 保存处理后的文件
output_path = os.path.join(output_dir, filename)
trimmed_audio.export(output_path, format=os.path.splitext(filename)[1][1:])
print(f" - 去除前 {remove_seconds} 秒")
# 使用示例
if __name__ == "__main__":
input_folder = "input_audio"
output_folder = "output_audio"
remove_fixed_duration(input_folder, output_folder, remove_seconds=2.0)
方法3:高级版本(带多种选项)
import os
import argparse
from pydub import AudioSegment
class AudioTrimmer:
def __init__(self):
self.supported_formats = {'.mp3', '.wav', '.m4a', '.ogg', '.flac', '.aac'}
def batch_process(self, input_dir, output_dir, mode='silence', **kwargs):
"""
批量处理音频文件
参数:
mode: 'silence' - 去除静音, 'fixed' - 固定长度去除
"""
if not os.path.exists(output_dir):
os.makedirs(output_dir)
processed = 0
for filename in os.listdir(input_dir):
ext = os.path.splitext(filename)[1].lower()
if ext in self.supported_formats:
file_path = os.path.join(input_dir, filename)
try:
audio = AudioSegment.from_file(file_path)
if mode == 'silence':
trimmed_audio = self._remove_silence(audio, **kwargs)
elif mode == 'fixed':
trimmed_audio = self._remove_fixed(audio, **kwargs)
# 保存文件
output_path = os.path.join(output_dir, filename)
trimmed_audio.export(output_path, format=ext[1:])
processed += 1
removed = len(audio) - len(trimmed_audio)
print(f"✓ {filename}: 去除 {removed/1000:.2f} 秒")
except Exception as e:
print(f"✗ {filename}: 错误 - {str(e)}")
print(f"\n完成! 共处理 {processed} 个文件")
def _remove_silence(self, audio, silence_thresh=-50.0, chunk_size=10):
"""去除开头静音"""
trim_ms = 0
while trim_ms < len(audio):
if audio[trim_ms:trim_ms+chunk_size].dBFS > silence_thresh:
break
trim_ms += chunk_size
return audio[trim_ms:]
def _remove_fixed(self, audio, remove_seconds=1.0):
"""去除固定长度"""
remove_ms = int(remove_seconds * 1000)
return audio[remove_ms:] if len(audio) > remove_ms else audio
# 命令行版本
def main():
parser = argparse.ArgumentParser(description='批量去除音频文件开头')
parser.add_argument('input_dir', help='输入文件夹路径')
parser.add_argument('output_dir', help='输出文件夹路径')
parser.add_argument('-m', '--mode', choices=['silence', 'fixed'], default='silence',
help='处理模式: silence(自动检测静音), fixed(固定长度)')
parser.add_argument('-t', '--threshold', type=float, default=-50.0,
help='静音阈值(dBFS),仅silence模式有效')
parser.add_argument('-d', '--duration', type=float, default=1.0,
help='去除固定长度(秒),仅fixed模式有效')
args = parser.parse_args()
trimmer = AudioTrimmer()
trimmer.batch_process(
args.input_dir,
args.output_dir,
mode=args.mode,
silence_thresh=args.threshold,
remove_seconds=args.duration
)
if __name__ == "__main__":
# 如果是命令行使用
# main()
# 或者直接调用
trimmer = AudioTrimmer()
trimmer.batch_process(
"input_audio",
"output_audio",
mode='silence', # 或 'fixed'
silence_thresh=-50.0,
remove_seconds=1.0
)
安装依赖
pip install pydub ffmpeg-python
还需要安装ffmpeg:
- Windows: 下载ffmpeg并添加到系统PATH
- macOS:
brew install ffmpeg - Linux:
sudo apt-get install ffmpeg
使用说明
-
创建文件夹:
input_audio/- 放入要处理的音频文件output_audio/- 处理后的文件将保存在这里
-
选择模式:
silence模式:自动检测并去除开头的静音段fixed模式:去除开头固定长度的音频
-
调整参数:
silence_thresh:静音检测阈值,-50dBFS是默认值,数值越小对静音越敏感remove_seconds:固定模式下需要去除的秒数
脚本会自动处理所有常见音频格式,并保留原文件格式。