# tiangai100-f5-tts & tiangai100-kokoro-tts & tiangai100-gpt-sovits

## 天数智芯 天垓100 语音合成
该模型测试框架在天垓100加速卡上，适配了 Kokoro, F5-TTS, GPT-SoVITS 这3个模型，将语音信号转换为文本。

GPT-SoVITS 模型是一个集成了语音转换和文本转语音功能的先进 AI 系统，基于 GPT 和 SoVITS 技术构建。
Kokoro 是由 hexgrad 团队开发并开源的轻量级、高性能文本转语音（TTS）模型。
F5-TTS 模型由上海交通大学团队发布，是基于扩散 Transformer 和 ConvNeXt V2 的文本转语音（TTS）模型。

## GPT-SoVITS 模型测试服务原理

使用 GPT-SoVITS 框架内置的类 TTS 和 TTS_Config。
其中 TTS_Config 封装了 GPT-SoVITS 模型运行所需的全部配置参数；TTS 类是 GPT-SoVITS 模型的高层封装，整合了模型加载、文本处理、语音生成等全流程逻辑。

初始化时会加载 GPT-SoVITS 的 模型路径（如 bert_base_path、vits_weights_path）、运行设备（device: "cuda"）、精度（is_half）等参数，传入 TTS_Config 配置实例进行初始化，最终传给 TTS 类初始化管道，通过 TTS 类直接调用模型进行语音合成，将生成的音频片段打包后返回给客户端

此外，服务中重写了 PyTorch 中 Conv1d 和 ConvTranspose1d 的前向传播方法，可能用于优化模型在特定设备 CUDA 上的运行效率

## F5-TTS 模型测试服务原理
通过 infer_batch_process 函数（from f5_tts.infer.utils_infer）调用 F5-TTS 模型，infer_batch_process封装了模型推理的核心细节。核心逻辑为：
```python
for gen_audio, gen_sr in infer_batch_process(
    (audio, sr),  # 参考音频数据和采样率
    ref_text,     # 参考文本
    gen_text_batches,  # 分块后的目标文本
    ema_model,    # 加载好的F5-TTS模型
    vocoder,      # 声码器
    device=device,
    streaming=True,  # 流式输出（边生成边返回）
    chunk_size=int(24e6),
):
    yield gen_audio.tobytes()  # 以字节流返回生成的音频
```
生成的音频数据以 WAV 格式的字节流通过 StreamingResponse 返回给客户端，实现实时语音输出。

## GPT-SoVITS 和 F5-TTS 模型测试服务请求示例
```python
import requests

# 服务地址（根据实际部署情况修改IP和端口,端口为80）
url = f"{sut_url}/generate"
#url = "http://localhost:80/generate"

# 构造请求数据（multipart/form-data）
files = {
    "ref_audio": open("/path/to/reference.wav", "rb")  # 参考音频文件
}
data = {
    "ref_text": "这是参考音频对应的文本",  # 参考文本
    "text": "这是需要合成语音的目标文本",    # 目标文本
    "lang": "zh"                          # 语言
}

# 发送请求并保存结果
response = requests.post(url, files=files, data=data, stream=True)
if response.status_code == 200:
    with open("output.wav", "wb") as f:
        for chunk in response.iter_content(chunk_size=1024):
            if chunk:
                f.write(chunk)
    print("合成成功，音频已保存为 output.wav")
else:
    print(f"请求失败，状态码：{response.status_code}")


#服务会根据参考音频（ref_audio）和参考文本（ref_text）提取语音风格，然后将目标文本（text）合成为具有相同风格的语音。
#响应为流式音频，客户端需要按流的方式接收并保存（如示例中使用 stream=True 和迭代读取 chunk）。
#若需检查服务是否可用，可发送 GET 请求到 http://localhost:80/health 或 http://localhost:80/ready，正常会返回 {"status": "ok"}。
```

## Kokoro 模型测试服务原理
使用 kokoro 模块内置的 KModel 和 KPipeline 类。

KModel 是封装 kokoro 模型的类，负责加载模型结构和权重。
KPipeline 是连接文本输入和模型推理的核心管道类，主要职责包括：处理特定语言的文本（如英文音标转换、中文拼音处理等）和 调用 KModel（kokoro 模型）进行语音生成，关联模型与语言处理规则（如英文音标转换、语速调整等）。

向 KPipeline 传入语言标识（lang_code）、模型实例（model）等参数，用于区分不同语言的处理逻辑；kokoro 模型通过 KModel 类加载，由 KPipeline 管道封装调用逻辑，最终调用 kokoro 模型根据输入文本和语言类型生成对应语言的语音,以流式音频形式返回结果

## Kokoro 模型测试服务请求示例
```python
import requests

# 服务器地址（根据实际部署修改）
url = "http://localhost:80/tts"

# SSML 输入（支持中文/英文，通过 xml:lang 指定语言）
ssml = """
<speak>
  <voice xml:lang="zh">你好，这是 Kokoro 模型生成的中文语音。</voice>
</speak>
"""
# 英文示例：<voice xml:lang="en">Hello, this is English speech generated by Kokoro.</voice>

# 发送 POST 请求
response = requests.post(
    url,
    data=ssml,
    headers={"Content-Type": "text/plain"},  # 直接发送纯文本 SSML
    stream=True  # 启用流式响应
)

# 保存音频到文件（PCM 格式，可通过播放器直接播放或转成 WAV）
if response.status_code == 200:
    with open("output.pcm", "wb") as f:
        for chunk in response.iter_content(chunk_size=1024):
            if chunk:
                f.write(chunk)
    print("音频保存成功：output.pcm")
else:
    print(f"请求失败：{response.status_code}，{response.text}")
```

## 如何使用语音合成模型测试框架
代码实现了一个接收音频数据并返回识别文本的语音识别 HTTP 服务，并基于 corex:3.2.1 基础镜像，将该 HTTP 服务重新打包成 docker 镜像，通过 k8s 集群sut容器去请求这个 HTTP 服务。

## 天垓100上语音合成模型运行测试结果
在天垓100上对部分语音合成模型进行适配，测试方式为在 Nvidia A100 和 智铠100 加速卡上对同一段text进行语音合成任务，获取运行时间

| 模型名称   | 模型类型               | 适配状态 | 天垓100运行时间/s | Nvidia A100运行时间/s |
| ---------- | ---------------------- | -------- | ----------------- | --------------------- |
| kokoro     | StyleTTS 2, ISTFTNet   | 成功     | 0.2               | 0.1                   |
| f5-TTS     | DiT, ConvNeXt V2       | 成功     | 0.5               | 0.2                   |
| gpt-sovits | VITS                   | 成功     | 0.9               | 0.4                   |