123 lines
3.5 KiB
Python
123 lines
3.5 KiB
Python
"""
|
|
快速测试 Kokoro TTS 模型是否可用
|
|
"""
|
|
import sys
|
|
import asyncio
|
|
from pathlib import Path
|
|
|
|
# 添加项目路径
|
|
sys.path.insert(0, str(Path(__file__).parent))
|
|
|
|
async def test_kokoro():
|
|
"""测试 Kokoro TTS"""
|
|
print("=" * 60)
|
|
print(" Kokoro TTS 模型验证测试")
|
|
print("=" * 60)
|
|
print()
|
|
|
|
# 检查模型文件
|
|
model_dir = Path("models/Kokoro-82M-v1.1-zh-ONNX")
|
|
print(f"1. 检查模型目录: {model_dir}")
|
|
|
|
if not model_dir.exists():
|
|
print(f" ❌ 目录不存在")
|
|
return False
|
|
print(f" ✓ 目录存在")
|
|
|
|
# 检查 ONNX 模型
|
|
onnx_files = list((model_dir / "onnx").glob("model*.onnx"))
|
|
print(f"\n2. 检查 ONNX 模型:")
|
|
if not onnx_files:
|
|
print(f" ❌ 未找到 ONNX 模型")
|
|
return False
|
|
for f in onnx_files:
|
|
size_mb = f.stat().st_size / 1024 / 1024
|
|
print(f" ✓ {f.name} ({size_mb:.1f} MB)")
|
|
|
|
# 检查 tokenizer
|
|
tokenizer = model_dir / "tokenizer.json"
|
|
print(f"\n3. 检查 tokenizer:")
|
|
if not tokenizer.exists():
|
|
print(f" ❌ tokenizer.json 不存在")
|
|
return False
|
|
print(f" ✓ tokenizer.json 存在")
|
|
|
|
# 检查语音文件
|
|
voices_dir = model_dir / "voices"
|
|
print(f"\n4. 检查语音文件:")
|
|
if not voices_dir.exists():
|
|
print(f" ❌ voices 目录不存在")
|
|
return False
|
|
voice_files = list(voices_dir.glob("*.bin"))
|
|
print(f" ✓ 找到 {len(voice_files)} 个语音文件")
|
|
print(f" 示例: {[f.stem for f in voice_files[:5]]}")
|
|
|
|
# 初始化 Kokoro TTS
|
|
print(f"\n5. 初始化 Kokoro TTS 服务...")
|
|
try:
|
|
from app.providers.kokoro_tts import KokoroTTSService
|
|
|
|
tts = KokoroTTSService()
|
|
success = await tts.initialize()
|
|
|
|
if not success:
|
|
print(f" ❌ 初始化失败")
|
|
return False
|
|
|
|
print(f" ✓ 初始化成功")
|
|
|
|
# 测试合成
|
|
print(f"\n6. 测试语音合成...")
|
|
test_text = "你好,这是 Kokoro TTS 测试"
|
|
print(f" 合成文本: {test_text}")
|
|
|
|
import time
|
|
import sounddevice as sd
|
|
import numpy as np
|
|
|
|
t0 = time.time()
|
|
audio_parts = []
|
|
for chunk in tts.synthesize(test_text):
|
|
audio_parts.append(chunk)
|
|
|
|
elapsed = time.time() - t0
|
|
|
|
if audio_parts:
|
|
full_audio = np.concatenate(audio_parts)
|
|
print(f" ✓ 合成成功")
|
|
print(f" 耗时: {elapsed:.2f}s")
|
|
print(f" 音频长度: {len(full_audio) / 24000:.2f}s")
|
|
print(f" 实时率: {len(full_audio) / 24000 / elapsed:.2f}x")
|
|
|
|
# 播放测试
|
|
print(f"\n7. 播放测试音频...")
|
|
sd.play(full_audio, samplerate=24000, blocking=True)
|
|
print(f" ✓ 播放完成")
|
|
|
|
return True
|
|
else:
|
|
print(f" ❌ 合成失败,未生成音频")
|
|
return False
|
|
|
|
except Exception as e:
|
|
print(f" ❌ 异常: {e}")
|
|
import traceback
|
|
traceback.print_exc()
|
|
return False
|
|
|
|
|
|
async def main():
|
|
success = await test_kokoro()
|
|
|
|
print()
|
|
print("=" * 60)
|
|
if success:
|
|
print(" ✅ Kokoro TTS 验证通过!可以启动服务端了")
|
|
else:
|
|
print(" ❌ 验证失败,请检查上述问题")
|
|
print("=" * 60)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(main())
|