183 lines
5.6 KiB
Python
183 lines
5.6 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
测试语速调整功能的脚本
|
|
验证配音块生成和音频语速调整的完整流程
|
|
"""
|
|
|
|
import os
|
|
import sys
|
|
import json
|
|
from pathlib import Path
|
|
|
|
# 设置路径
|
|
current_dir = os.path.dirname(os.path.abspath(__file__))
|
|
os.environ['PATH'] += os.pathsep + current_dir
|
|
sys.path.append(current_dir)
|
|
|
|
# 导入核心模块
|
|
from core.utils.config_utils import load_key, update_key
|
|
from core import _8_2_dub_chunks, _10_gen_audio
|
|
|
|
def create_test_translate_result():
|
|
"""创建测试用的翻译结果数据"""
|
|
test_data = [
|
|
{
|
|
"id": 1,
|
|
"start": 0.0,
|
|
"end": 3.5,
|
|
"original_text": "Hello, how are you today?",
|
|
"translated_text": "你好,你今天怎么样?"
|
|
},
|
|
{
|
|
"id": 2,
|
|
"start": 4.0,
|
|
"end": 7.2,
|
|
"original_text": "I'm doing great, thank you for asking.",
|
|
"translated_text": "我很好,谢谢你的询问。"
|
|
},
|
|
{
|
|
"id": 3,
|
|
"start": 8.0,
|
|
"end": 12.5,
|
|
"original_text": "Would you like to have lunch together today?",
|
|
"translated_text": "你想今天一起吃午餐吗?"
|
|
}
|
|
]
|
|
|
|
# 确保output目录存在
|
|
os.makedirs('output', exist_ok=True)
|
|
|
|
# 保存测试数据
|
|
with open('output/translate_result.json', 'w', encoding='utf-8') as f:
|
|
json.dump(test_data, f, ensure_ascii=False, indent=2)
|
|
|
|
print("✅ 创建了测试翻译数据")
|
|
|
|
def test_dub_chunks_generation():
|
|
"""测试配音块生成功能"""
|
|
print("\n🎬 测试配音块生成...")
|
|
|
|
try:
|
|
# 创建测试数据
|
|
create_test_translate_result()
|
|
|
|
# 生成配音块
|
|
_8_2_dub_chunks.gen_dub_chunks()
|
|
|
|
# 检查结果
|
|
if os.path.exists('output/dub_chunks.json'):
|
|
with open('output/dub_chunks.json', 'r', encoding='utf-8') as f:
|
|
chunks = json.load(f)
|
|
|
|
print(f"✅ 成功生成 {len(chunks)} 个配音块")
|
|
|
|
# 显示一些统计信息
|
|
cutoff_count = sum(1 for chunk in chunks if chunk['cut_off'] == 1)
|
|
speed_issues = sum(1 for chunk in chunks if chunk['speed_status'] > 0)
|
|
|
|
print(f"📊 切分点数量: {cutoff_count}")
|
|
print(f"⚡ 需要语速调整的片段: {speed_issues}")
|
|
|
|
# 显示第一个块的详细信息
|
|
if chunks:
|
|
first_chunk = chunks[0]
|
|
print(f"\n📋 第一个块的信息:")
|
|
print(f" 文本: {first_chunk['text']}")
|
|
print(f" 时长: {first_chunk['duration']:.2f}s")
|
|
print(f" 估算时长: {first_chunk['est_dur']:.2f}s")
|
|
print(f" 语速状态: {first_chunk['speed_status']}")
|
|
|
|
return True
|
|
else:
|
|
print("❌ 配音块文件未生成")
|
|
return False
|
|
|
|
except Exception as e:
|
|
print(f"❌ 配音块生成失败: {e}")
|
|
import traceback
|
|
traceback.print_exc()
|
|
return False
|
|
|
|
def test_speed_adjustment_logic():
|
|
"""测试语速调整逻辑"""
|
|
print("\n⚡ 测试语速调整逻辑...")
|
|
|
|
try:
|
|
# 模拟一些测试数据
|
|
test_chunks = [
|
|
{
|
|
'real_dur': 3.0, # 实际TTS时长
|
|
'tol_dur': 3.5, # 容忍时长
|
|
'duration': 3.2, # 原始时长
|
|
'gap': 0.5, # 间隙
|
|
'tolerance': 0.3 # 容忍度
|
|
},
|
|
{
|
|
'real_dur': 2.8,
|
|
'tol_dur': 3.0,
|
|
'duration': 2.5,
|
|
'gap': 0.8,
|
|
'tolerance': 0.5
|
|
}
|
|
]
|
|
|
|
# 测试速度因子计算
|
|
from core._10_gen_audio import calculate_chunk_speed_factor
|
|
|
|
accept = load_key("speed_factor.accept") if load_key("speed_factor.accept") else 1.3
|
|
min_speed = load_key("speed_factor.min") if load_key("speed_factor.min") else 0.8
|
|
|
|
speed_factor, keep_gaps = calculate_chunk_speed_factor(test_chunks, accept, min_speed)
|
|
|
|
print(f"✅ 计算出的语速因子: {speed_factor}")
|
|
print(f"✅ 是否保留间隙: {keep_gaps}")
|
|
|
|
# 验证结果合理性
|
|
if 0.5 <= speed_factor <= 2.0:
|
|
print("✅ 语速因子在合理范围内")
|
|
return True
|
|
else:
|
|
print("⚠️ 语速因子超出预期范围")
|
|
return False
|
|
|
|
except Exception as e:
|
|
print(f"❌ 语速调整逻辑测试失败: {e}")
|
|
import traceback
|
|
traceback.print_exc()
|
|
return False
|
|
|
|
def main():
|
|
"""主测试函数"""
|
|
print("🧪 开始测试语速调整功能...")
|
|
|
|
# 设置一些基本配置
|
|
update_key("tolerance", 0.5)
|
|
update_key("speed_factor.accept", 1.3)
|
|
update_key("speed_factor.min", 0.8)
|
|
|
|
success_count = 0
|
|
total_tests = 2
|
|
|
|
# 测试1: 配音块生成
|
|
if test_dub_chunks_generation():
|
|
success_count += 1
|
|
|
|
# 测试2: 语速调整逻辑
|
|
if test_speed_adjustment_logic():
|
|
success_count += 1
|
|
|
|
# 总结
|
|
print(f"\n📊 测试结果: {success_count}/{total_tests} 个测试通过")
|
|
|
|
if success_count == total_tests:
|
|
print("🎉 所有测试通过!语速调整功能实现正确。")
|
|
return True
|
|
else:
|
|
print("⚠️ 部分测试失败,请检查实现。")
|
|
return False
|
|
|
|
if __name__ == "__main__":
|
|
main()
|
|
|