2026-04-14 10:08:41 +08:00

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())