Spaces:
Running
on
Zero
Running
on
Zero
#!/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() | |