Files
Yosuga_server/Test/GPTSoVITSTest.py
T
2026-02-03 01:20:00 +08:00

173 lines
7.1 KiB
Python

import asyncio
from src.modules.tts_module.tts_core.gpt_sovits.gpt_sovits_client import GPTSoVITSClient, StreamingMode
from src.modules.tts_module.tts_core.async_audio_player import AsyncAudioPlayer
import sounddevice as sd
test_text = "春の午後、公園のベンチに座って本を読んでいると、小さな子供が凧あげをしているのが目に入った。風に乗って凧が高く上がるたびに、彼の顔には真っすぐな笑顔が広がる。母親がそばで見守りながら、時折声をかけている。\
空は雲一つない青さで、桜の花びらが風に舞っている。遠くで犬の鳴き声が聞こえ、芝生の上では老夫婦がお茶を楽しんでいた。すべてがゆっくりと流れる時間の中で、自分の心も不思議と落ち着いてくる。\
ふと、子供の凧が木の枝に引っかかってしまった。少し焦る様子だったが、母親が助けてくれて、すぐにまた空に舞い上がった。失敗しても、誰かが助けてくれる。そんな当たり前のことに、今日は特別な温かさを感じた。\
日が傾き始める頃、私は本を閉じて家路についた。明日もきっと、誰かの笑顔があるだろう。"
async def test_tts():
# 创建客户端(推荐上下文管理器)
async with GPTSoVITSClient(debug=True, port= 20261, host="192.168.1.8") as client:
# 基础TTS调用
try:
audio = await client.tts(
text="あのさ、いやまあ、なんていうか...要するに、そういうことじゃなくて、ほら、前に言ってたやつ、あれなんだけど、とにかく、後ででもいいから、ちょっと相談に乗ってくれない?",
ref_audio_path="uploaded_audio/test_voice.wav", # 服务器上的路径
text_lang="ja",
prompt_lang="ja",
media_type="wav",
prompt_text="もう!こんなところで何やってるんだよ!"
)
# 保存音频
audio.save("outputs/output.wav")
print(f"✅ TTS成功!音频大小: {len(audio.audio_data)} bytes")
except Exception as e:
print(f"❌ 错误: {e}")
async def test_model_change():
async with GPTSoVITSClient(debug=True, port= 20261, host="192.168.1.8") as client:
# 切换模型
print("🔄 切换GPT模型...")
await client.set_gpt_weights(
"GPT_weights_v2Pro/Yosuga_Airi-e32.ckpt"
)
print("🔄 切换SoVITS模型...")
await client.set_sovits_weights(
"SoVITS_weights_v2Pro/Yosuga_Airi_e16_s864.pth"
)
async def stream_tts():
async with GPTSoVITSClient(debug=True, port= 20261, host="192.168.1.8") as client:
try:
# 使用最快模式流式输出
chunk_count = 0
async for chunk in await client.tts(
text="要するに、そういうことじゃなくて、ほら、前に言ってたやつ、あれなんだけど、とにかく、後ででもいいから、ちょっと相談に乗ってくれない?",
ref_audio_path="uploaded_audio/test_voice.wav",
text_lang="ja",
prompt_lang="ja",
prompt_text="もう!こんなところで何やってるんだよ!",
streaming_mode=StreamingMode.FASTEST, # 模式3:快速流式
media_type="wav"
):
chunk_count += 1
print(f"🎵 收到音频块 #{chunk_count}: {len(chunk.audio_data)} bytes")
# 实时播放处理
# await play_audio_chunk(chunk.audio_data)
print(f"✅ 流式TTS完成!共{chunk_count}个音频块")
except Exception as e:
print(f"❌ 流式错误: {e}")
async def stream_tts_and_play(
text: str,
ref_audio_path: str,
text_lang: str = "zh",
prompt_lang: str = "zh",
streaming_mode: StreamingMode = StreamingMode.FASTEST
):
"""
实时流式TTS + 播放一体化
Args:
text: 要合成的文本
ref_audio_path: 参考音频路径
text_lang: 文本语言
prompt_lang: 提示语言
"""
# 创建音频播放器(缓冲区大小=5,平衡延迟和稳定性)
async with AsyncAudioPlayer(buffer_size=5) as player:
# 创建TTS客户端
async with GPTSoVITSClient(debug=True, port= 20261, host="192.168.1.8") as client:
try:
print(f"🎤 开始流式合成: {text[:30]}...")
print(f"🎯 流式模式: {streaming_mode.name}")
# 获取音频流(异步生成器)
audio_stream = await client.tts(
text=text,
ref_audio_path=ref_audio_path,
text_lang=text_lang,
prompt_lang=prompt_lang,
prompt_text="もう!こんなところで何やってるんだよ!",
streaming_mode=streaming_mode,
media_type="wav",
sample_steps=32,
top_k=5,
temperature=1.0
)
# 动态读取并播放
chunk_idx = 0
async for audio_chunk in audio_stream:
chunk_idx += 1
print(f"📥 收到音频块 #{chunk_idx}: {len(audio_chunk.audio_data):6d} bytes")
# 立即加入播放队列(非阻塞)
await player.add_chunk(audio_chunk.audio_data)
print(f"✅ 合成完成! 共接收 {chunk_idx} 个音频块")
# 等待播放完成(所有块播完)
await player.audio_queue.join()
print("🎵 播放完成!")
except Exception as e:
print(f"❌ 错误: {e}")
raise
async def test_japanese():
"""测试日语长文本流式播放"""
print("=" * 50)
print("🗾 日语流式TTS测试")
print("=" * 50)
await stream_tts_and_play(
text=test_text,
ref_audio_path="uploaded_audio/test_voice.wav",
text_lang="ja",
prompt_lang="ja",
streaming_mode=StreamingMode.FASTEST # 模式3:最快
)
async def batch_test():
"""批量处理示例"""
async with GPTSoVITSClient() as client:
texts = [
"你好,世界!",
"这是一个批量测试。",
"异步批量处理非常高效。"
]
results = await client.batch_tts(
texts=texts,
ref_audio_path="archive_jingyuan_1.wav",
text_lang="zh"
)
for i, audio in enumerate(results):
audio.save(f"output/batch_{i}.wav")
print(f"✅ 批量任务 {i + 1}/{len(results)} 完成")
if __name__ == "__main__":
# 检查音频设备
print("🔍 检查音频设备...")
print(sd.query_devices())
sd.default.device = (None, "pulse") # 使用PulseAudio
asyncio.run(test_japanese())