#!/usr/bin/env python3 """ 音频文件转换和片段提取工具 将MP3文件转换为WAV格式,并提取指定时间段的音频片段 """ import os import subprocess from pathlib import Path def convert_mp3_to_wav_and_extract(input_file, start_time, end_time, output_dir=None): """ 将MP3文件转换为WAV格式,并提取指定时间段的音频片段 Args: input_file (str): 输入的MP3文件路径 start_time (float): 开始时间(秒) end_time (float): 结束时间(秒) output_dir (str): 输出目录,如果为None则使用输入文件所在目录 Returns: bool: 操作是否成功 """ try: # 检查输入文件是否存在 if not os.path.exists(input_file): print(f"❌ 错误:输入文件不存在: {input_file}") return False # 设置输出目录 if output_dir is None: output_dir = os.path.dirname(input_file) # 确保输出目录存在 Path(output_dir).mkdir(parents=True, exist_ok=True) # 生成输出文件名 input_name = Path(input_file).stem output_wav = os.path.join(output_dir, f"{input_name}.wav") output_segment = os.path.join(output_dir, f"{input_name}_segment_{start_time}s_to_{end_time}s.wav") print(f"🎵 开始处理音频文件: {input_file}") print(f"📁 输出目录: {output_dir}") # 步骤1:将MP3转换为WAV格式 print(f"\n🔄 步骤1: 将MP3转换为WAV格式") convert_cmd = [ 'ffmpeg', '-y', # 覆盖输出文件 '-i', input_file, # 输入文件 '-ar', '16000', # 采样率16kHz '-ac', '1', # 单声道 '-c:a', 'pcm_s16le', # 16位PCM编码 output_wav # 输出文件 ] print(f"执行命令: {' '.join(convert_cmd)}") result = subprocess.run(convert_cmd, capture_output=True, text=True) if result.returncode != 0: print(f"❌ MP3转WAV失败: {result.stderr}") return False print(f"✅ MP3转WAV成功: {output_wav}") # 步骤2:提取音频片段 print(f"\n🔄 步骤2: 提取音频片段 ({start_time}s - {end_time}s)") duration = end_time - start_time extract_cmd = [ 'ffmpeg', '-y', # 覆盖输出文件 '-i', output_wav, # 输入WAV文件 '-ss', str(start_time), # 开始时间 '-t', str(duration), # 持续时间 '-c', 'copy', # 直接复制,不重新编码 output_segment # 输出片段文件 ] print(f"执行命令: {' '.join(extract_cmd)}") result = subprocess.run(extract_cmd, capture_output=True, text=True) if result.returncode != 0: print(f"❌ 音频片段提取失败: {result.stderr}") return False print(f"✅ 音频片段提取成功: {output_segment}") # 显示文件信息 print(f"\n📊 文件信息:") print(f"原始MP3文件: {input_file}") print(f"转换后的WAV文件: {output_wav}") print(f"提取的音频片段: {output_segment}") print(f"片段时长: {duration:.1f}秒") # 检查输出文件大小 if os.path.exists(output_wav): wav_size = os.path.getsize(output_wav) / 1024 # KB print(f"WAV文件大小: {wav_size:.1f} KB") if os.path.exists(output_segment): segment_size = os.path.getsize(output_segment) / 1024 # KB print(f"片段文件大小: {segment_size:.1f} KB") return True except Exception as e: print(f"❌ 处理过程中出现错误: {str(e)}") return False def main(): """主函数""" print("🎵 音频文件转换和片段提取工具") print("=" * 50) # 检查ffmpeg是否安装 try: subprocess.run(['ffmpeg', '-version'], capture_output=True, check=True) print("✅ 检测到ffmpeg") except (subprocess.CalledProcessError, FileNotFoundError): print("❌ 错误:未找到ffmpeg,请先安装ffmpeg") print("Ubuntu/Debian: sudo apt install ffmpeg") print("CentOS/RHEL: sudo yum install ffmpeg") print("macOS: brew install ffmpeg") return # 设置文件路径和时间参数 input_file = "/home/t2vg-a100-G4-42/v-shuyuantu/StableAvatar/example_case/case-3/ssvid.net--Wellerman-Female-Cover-LYRICS-Sea-Shanty.mp3" start_time = 1.9 # 开始时间(秒) end_time = 7.1 # 结束时间(秒) print(f"📁 输入文件: {input_file}") print(f"⏰ 提取时间段: {start_time}s - {end_time}s") print(f"⏱️ 片段时长: {end_time - start_time:.1f}秒") # 执行转换和提取 success = convert_mp3_to_wav_and_extract(input_file, start_time, end_time) if success: print(f"\n🎉 所有操作完成!") print(f"输出文件保存在: {os.path.dirname(input_file)}") else: print(f"\n❌ 操作失败,请检查错误信息") if __name__ == "__main__": main()