批量去除音频头的脚本

wen 实用脚本 2

本文目录导读:

批量去除音频头的脚本

  1. 方法1:去除开头静音(自动检测)
  2. 方法2:去除固定长度开头
  3. 方法3:高级版本(带多种选项)
  4. 安装依赖
  5. 使用说明

方法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

使用说明

  1. 创建文件夹

    • input_audio/ - 放入要处理的音频文件
    • output_audio/ - 处理后的文件将保存在这里
  2. 选择模式

    • silence模式:自动检测并去除开头的静音段
    • fixed模式:去除开头固定长度的音频
  3. 调整参数

    • silence_thresh:静音检测阈值,-50dBFS是默认值,数值越小对静音越敏感
    • remove_seconds:固定模式下需要去除的秒数

脚本会自动处理所有常见音频格式,并保留原文件格式。

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