如何用脚本批量删除音频静音段?

wen 实用脚本 2

本文目录导读:

如何用脚本批量删除音频静音段?

  1. 方法一:使用 FFmpeg(最常用)
  2. 方法二:使用 pydub(更精细控制)
  3. 方法三:使用 librosa(高级音频处理)
  4. 安装依赖
  5. 参数调优建议

使用 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

参数调优建议

  1. 静音阈值-50dB-30dB 之间,值越小检测越敏感
  2. 最小静音时长:0.3-1秒,建议从0.5秒开始尝试
  3. 保留过渡:避免音频突然中断,保留少量静音过渡

选择哪种方法取决于你的具体需求:

  • FFmpeg:快速、命令行友好
  • pydub:更易用、适合简单任务
  • librosa:功能强大、适合复杂音频处理

抱歉,评论功能暂时关闭!