本文目录导读:

使用 FFmpeg(最常用)
Python 脚本
import subprocess
import os
from pathlib import Path
def remove_silence_ffmpeg(input_file, output_file, silence_threshold=-50, silence_duration=0.5):
"""
使用FFmpeg删除静音段
"""
cmd = [
'ffmpeg',
'-i', input_file,
'-af', f'silenceremove=start_periods=1:start_duration={silence_duration}:start_threshold={silence_threshold}dB:stop_periods=-1:stop_duration={silence_duration}:stop_threshold={silence_threshold}dB',
'-acodec', 'libmp3lame', # 或 'pcm_s16le' 对于WAV
output_file
]
subprocess.run(cmd, check=True)
def batch_remove_silence(input_dir, output_dir, formats=['.mp3', '.wav', '.m4a']):
"""批量处理目录中的音频文件"""
Path(output_dir).mkdir(parents=True, exist_ok=True)
for file_path in Path(input_dir).glob('*'):
if file_path.suffix.lower() in formats:
output_path = Path(output_dir) / f"processed_{file_path.name}"
print(f"处理: {file_path.name}")
try:
remove_silence_ffmpeg(str(file_path), str(output_path))
print(f"完成: {output_path.name}")
except Exception as e:
print(f"错误处理 {file_path.name}: {e}")
# 使用示例
batch_remove_silence('input_audio', 'output_audio')
Bash 脚本
#!/bin/bash
INPUT_DIR="input_audio"
OUTPUT_DIR="output_audio"
THRESHOLD="-50dB"
DURATION="0.5"
mkdir -p "$OUTPUT_DIR"
for file in "$INPUT_DIR"/*.{mp3,wav,m4a}; do
if [ -f "$file" ]; then
filename=$(basename "$file")
echo "处理: $filename"
ffmpeg -i "$file" \
-af "silenceremove=start_periods=1:start_duration=$DURATION:start_threshold=$THRESHOLD:stop_periods=-1:stop_duration=$DURATION:stop_threshold=$THRESHOLD" \
"$OUTPUT_DIR/processed_$filename"
fi
done
使用 pydub(更精细控制)
from pydub import AudioSegment
from pydub.silence import detect_silence, split_on_silence
import os
from pathlib import Path
def remove_silence_pydub(input_file, output_file, silence_thresh=-50, min_silence_len=500):
"""
使用pydub删除静音并合并非静音段
"""
# 读取音频
audio = AudioSegment.from_file(input_file)
# 检测静音段
silence_ranges = detect_silence(
audio,
min_silence_len=min_silence_len,
silence_thresh=silence_thresh
)
# 分割音频
non_silent_chunks = split_on_silence(
audio,
min_silence_len=min_silence_len,
silence_thresh=silence_thresh,
keep_silence=100 # 保留100ms的过渡
)
# 合并非静音段
processed_audio = AudioSegment.empty()
for chunk in non_silent_chunks:
processed_audio += chunk
# 导出
processed_audio.export(output_file, format=output_file.split('.')[-1])
def batch_process(input_dir, output_dir):
"""批量处理目录中的音频文件"""
Path(output_dir).mkdir(parents=True, exist_ok=True)
# 支持的格式
formats = ['.mp3', '.wav', '.m4a', '.ogg', '.flac']
for file_path in Path(input_dir).glob('*'):
if file_path.suffix.lower() in formats:
output_path = Path(output_dir) / f"processed_{file_path.name}"
print(f"处理: {file_path.name}")
try:
remove_silence_pydub(str(file_path), str(output_path))
print(f"完成: {output_path.name}")
except Exception as e:
print(f"错误处理 {file_path.name}: {e}")
# 使用示例
batch_process('input_audio', 'output_audio')
使用 librosa(高级音频处理)
import librosa
import soundfile as sf
import numpy as np
from pathlib import Path
def remove_silence_librosa(input_file, output_file, top_db=30):
"""
使用librosa检测并删除静音段
"""
# 加载音频
audio, sr = librosa.load(input_file, sr=None)
# 分割非静音段
non_silent_intervals = librosa.effects.split(
audio,
top_db=top_db,
frame_length=2048,
hop_length=512
)
# 提取并连接非静音段
non_silent_audio = []
for start, end in non_silent_intervals:
non_silent_audio.append(audio[start:end])
# 连接所有段
if non_silent_audio:
processed_audio = np.concatenate(non_silent_audio)
else:
processed_audio = audio
# 保存结果
sf.write(output_file, processed_audio, sr)
def batch_process_librosa(input_dir, output_dir):
"""批量处理音频文件"""
Path(output_dir).mkdir(parents=True, exist_ok=True)
for file_path in Path(input_dir).glob('*.wav'): # librosa支持多种格式
output_path = Path(output_dir) / f"processed_{file_path.name}"
print(f"处理: {file_path.name}")
try:
remove_silence_librosa(str(file_path), str(output_path))
print(f"完成: {output_path.name}")
except Exception as e:
print(f"错误处理 {file_path.name}: {e}")
# 使用示例
batch_process_librosa('input_audio', 'output_audio')
安装依赖
# FFmpeg # Ubuntu/Debian sudo apt-get install ffmpeg # macOS brew install ffmpeg # Windows: 从 https://ffmpeg.org/download.html 下载 # Python库 pip install pydub librosa soundfile numpy
参数调优建议
- 静音阈值:
-50dB到-30dB之间,值越小检测越敏感 - 最小静音时长:0.3-1秒,建议从0.5秒开始尝试
- 保留过渡:避免音频突然中断,保留少量静音过渡
选择哪种方法取决于你的具体需求:
- FFmpeg:快速、命令行友好
- pydub:更易用、适合简单任务
- librosa:功能强大、适合复杂音频处理