Spaces:
Runtime error
Runtime error
| #!/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() | |