本文目录导读:

我来帮你创建一个批量去除音频静音部分的Python脚本,这个脚本使用ffmpeg来自动检测并移除音频中的静音部分。
方法1:使用FFmpeg(推荐)
#!/usr/bin/env python3
"""
批量去除音频静音部分脚本
依赖:ffmpeg (需安装)
安装:sudo apt install ffmpeg 或 brew install ffmpeg
"""
import os
import subprocess
import argparse
from pathlib import Path
def remove_silence_ffmpeg(input_file, output_file, threshold=-35, min_silence=0.5, keep_padding=0.3):
"""
使用ffmpeg去除音频静音
参数:
- threshold: 静音阈值(dB),-30到-60之间,数值越小越不敏感
- min_silence: 最小静音长度(秒)
- keep_padding: 保留的前后静音长度(秒)
"""
cmd = [
'ffmpeg',
'-i', input_file,
'-af', f'silenceremove=stop_periods=-1:stop_duration={min_silence}:'
f'stop_threshold=-{abs(threshold)}dB:start_periods=1:'
f'start_threshold=-{abs(threshold)}dB:start_silence=0.1:'
f'stop_silence={min_silence}:start_periods=1',
'-c:a', 'pcm_s16le', # 输出为WAV格式以保持质量
'-y',
output_file
]
try:
subprocess.run(cmd, check=True, capture_output=True)
print(f"✓ 处理完成: {Path(input_file).name}")
return True
except subprocess.CalledProcessError as e:
print(f"✗ 处理失败: {Path(input_file).name}")
print(f" 错误信息: {e.stderr.decode()}")
return False
def batch_remove_silence(input_dir, output_dir, **kwargs):
"""
批量处理目录中的音频文件
"""
# 支持的文件格式
SUPPORTED_FORMATS = ['.mp3', '.wav', '.flac', '.m4a', '.aac', '.ogg', '.wma']
# 创建输出目录
Path(output_dir).mkdir(parents=True, exist_ok=True)
# 获取所有音频文件
files = []
for ext in SUPPORTED_FORMATS:
files.extend(Path(input_dir).glob(f'*{ext}'))
files.extend(Path(input_dir).glob(f'*{ext.upper()}'))
if not files:
print(f"在 {input_dir} 中没有找到支持的音频文件")
return
print(f"找到 {len(files)} 个音频文件,开始处理...\n")
success_count = 0
fail_count = 0
for file in files:
# 创建输出文件名(转换为wav格式)
output_name = f"{file.stem}_cleaned.wav"
output_path = Path(output_dir) / output_name
print(f"处理: {file.name}")
if remove_silence_ffmpeg(str(file), str(output_path), **kwargs):
success_count += 1
else:
fail_count += 1
print(f"\n处理完成!成功: {success_count} 个, 失败: {fail_count} 个")
print(f"输出目录: {output_dir}")
def main():
parser = argparse.ArgumentParser(description='批量去除音频静音')
parser.add_argument('input', help='输入目录或文件路径')
parser.add_argument('-o', '--output', default='output_cleaned', help='输出目录(default: output_cleaned)')
parser.add_argument('-t', '--threshold', type=float, default=-35,
help='静音阈值dB,范围-60到-20 (default: -35)')
parser.add_argument('-m', '--min-silence', type=float, default=0.5,
help='最小静音时长秒 (default: 0.5)')
parser.add_argument('-p', '--padding', type=float, default=0.3,
help='保留的静音时间秒 (default: 0.3)')
args = parser.parse_args()
# 检查ffmpeg是否安装
try:
subprocess.run(['ffmpeg', '-version'], capture_output=True, check=True)
except (subprocess.CalledProcessError, FileNotFoundError):
print("错误:没有找到ffmpeg!请先安装ffmpeg")
print("Ubuntu/Debian: sudo apt install ffmpeg")
print("MacOS: brew install ffmpeg")
print("Windows: 下载ffmpeg并添加到PATH")
return
# 检查输入路径
if os.path.isfile(args.input):
# 单个文件处理
Path(args.output).mkdir(parents=True, exist_ok=True)
output_file = Path(args.output) / f"{Path(args.input).stem}_cleaned.wav"
remove_silence_ffmpeg(args.input, str(output_file),
args.threshold, args.min_silence, args.padding)
elif os.path.isdir(args.input):
# 批量处理
batch_remove_silence(args.input, args.output,
threshold=args.threshold,
min_silence=args.min_silence,
keep_padding=args.padding)
else:
print(f"错误:找不到路径 {args.input}")
if __name__ == "__main__":
main()
方法2:使用pydub(Python库)
#!/usr/bin/env python3
"""
使用pydub批量去除音频静音
依赖:pip install pydub
还需安装ffmpeg或libav
"""
from pydub import AudioSegment
from pydub.silence import split_on_silence
import os
from pathlib import Path
def remove_silence_pydub(input_path, output_path,
min_silence_len=500, # 最小静音长度(ms)
silence_thresh=-40, # 静音阈值(dB)
keep_silence=300): # 保留静音长度(ms)
"""
使用pydub去除静音
"""
try:
# 加载音频
audio = AudioSegment.from_file(input_path)
# 分割音频
chunks = split_on_silence(
audio,
min_silence_len=min_silence_len,
silence_thresh=silence_thresh,
keep_silence=keep_silence
)
if not chunks:
print(f"✗ 未检测到可用的音频片段: {Path(input_path).name}")
return False
# 合并所有非静音片段
combined = AudioSegment.empty()
for chunk in chunks:
combined += chunk
# 导出音频
combined.export(output_path, format="wav")
print(f"✓ 处理完成: {Path(input_path).name}")
return True
except Exception as e:
print(f"✗ 处理失败: {Path(input_path).name}")
print(f" 错误: {str(e)}")
return False
def batch_process_pydub(input_dir, output_dir, **kwargs):
"""批量处理目录中的音频文件"""
SUPPORTED_FORMATS = ['.mp3', '.wav', '.flac', '.m4a', '.aac', '.ogg']
Path(output_dir).mkdir(parents=True, exist_ok=True)
files = []
for ext in SUPPORTED_FORMATS:
files.extend(Path(input_dir).glob(f'*{ext}'))
if not files:
print(f"在 {input_dir} 中没有找到支持的音频文件")
return
print(f"找到 {len(files)} 个音频文件\n")
success = 0
for file in files:
output_path = Path(output_dir) / f"{file.stem}_cleaned.wav"
if remove_silence_pydub(str(file), str(output_path), **kwargs):
success += 1
print(f"\n处理完成!成功: {success}/{len(files)}")
print(f"输出目录: {output_dir}")
if __name__ == "__main__":
# 使用示例
# 批量处理
batch_process_pydub(
"input_audio", # 输入目录
"output_audio", # 输出目录
min_silence_len=500, # 最短静音500ms
silence_thresh=-40, # 阈值-40dB
keep_silence=300 # 保留300ms静音
)
# 或者处理单个文件
# remove_silence_pydub("input.mp3", "output.wav")
使用方法
方法1(FFmpeg):
# 安装ffmpeg (Ubuntu) sudo apt install ffmpeg # 批量处理目录 python3 remove_silence_ffmpeg.py input_dir -o output_dir # 自定义参数 python3 remove_silence_ffmpeg.py input_dir -o output_dir -t -40 -m 0.8 -p 0.5
方法2(pydub):
# 安装依赖 pip install pydub # 确保ffmpeg已安装 # 然后直接运行脚本 python3 remove_silence_pydub.py
参数说明
- threshold (-t): 静音检测阈值,-60到-20dB之间,数值越小,对静音越敏感
- min_silence (-m): 被认为静音的最短持续时间(秒)
- padding (-p): 保留在非静音部分前后的静音时长(秒)
高级用法
如果你需要更精细的控制,可以使用这个简化版本:
import subprocess
import os
def simple_remove_silence(input_file, output_file):
"""最简单的FFmpeg静音去除"""
cmd = f'ffmpeg -i "{input_file}" -af silenceremove=stop_periods=-1:stop_duration=0.5:stop_threshold=-35dB -c:a pcm_s16le "{output_file}"'
os.system(cmd)
# 批量处理
def batch_simple(input_dir):
for file in os.listdir(input_dir):
if file.endswith('.mp3'):
simple_remove_silence(
f"{input_dir}/{file}",
f"{input_dir}/cleaned_{file}"
)
# 使用
batch_simple("audio_folder")
选择哪种方法取决于你的需求:
- 方法1更节约时间,速度快
- 方法2更易调整参数,使用Python API
需要其他功能(如音量规范化、格式转换等)可以告诉我!