批量去除音频静音部分的脚本

wen 实用脚本 2

本文目录导读:

批量去除音频静音部分的脚本

  1. 方法1:使用FFmpeg(推荐)
  2. 方法2:使用pydub(Python库)
  3. 使用方法
  4. 参数说明
  5. 高级用法

我来帮你创建一个批量去除音频静音部分的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

需要其他功能(如音量规范化、格式转换等)可以告诉我!

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