/ChatTTS-Forge

ChatTTS-Forge 提供了完善的 ChatTTS 封装,包括 API WebUI Playground 等,新功能持续开发中 🚀

Primary LanguagePythonGNU Affero General Public License v3.0AGPL-3.0

cn | en | Discord Server

🍦 ChatTTS-Forge

ChatTTS-Forge 是一个围绕 TTS 生成模型 ChatTTS 开发的项目,实现了 API Server 和 基于 Gradio 的 WebUI。

banner

你可以通过以下几种方式体验和部署 ChatTTS-Forge:

- 描述 链接
在线体验 部署于 HuggingFace 中 HuggingFace Spaces
一键启动 点击按钮,一键启动 Colab Open In Colab
容器部署 查看 docker 部分 Docker
本地部署 查看环境准备部分 本地部署

1. INDEX

2. GPU 显存要求

2.1. 加载模型显存要求

数据类型 加载 ChatTTS 模型 加载 Enhancer 模型
float32 2GB 3GB
half 1GB 1.5GB

2.2. Batch Size 显存要求

数据类型 Batch Size 不开启 Enhancer 开启 Enhancer
float32 ≤ 4 2GB 4GB
float32 8 8~10GB 8~14GB
half ≤ 4 2GB 4GB
half 8 2~6GB 4~8GB

注释:

  • Batch Size 为 4 以内时,2GB 显存足够进行推理。
  • Batch Size 为 8 时,需 8~14GB 显存。
  • Half Batch Size 为上表中的 Batch Size 的一半,显存要求也相应减半。

3. Features

  • 全面的 API 服务: 提供所有功能的 API 访问,方便集成。
  • 超长文本生成: 支持生成 1000 字以上的长文本,保持一致性。
  • 风格管理: 通过名称或 ID 复用说话风格,内置 32 种不同风格。
  • 说话人管理: 通过名称或 ID 高效复用说话人。
  • 风格提示词注入: 通过注入提示词灵活调整输出风格。
  • batch 生成: 支持自动分桶并批量生成。
  • 类 SSML 支持: 使用类 SSML 语法创建丰富的音频长文本。
  • 独立 refine API: 提供单独的 refine 调试接口,提升调试效率。
  • OpenAI 风格 API: 提供类似 OpenAI 的 /v1/audio/speech 语音生成接口。
  • Google 风格 API: 提供类似 Google 的 /v1/text:synthesize 文本合成接口。
  • 友好的调试 GUI: 独立于 Gradio 的 playground,简化调试流程。
  • 文本标准化:
    • Markdown: 自动检测处理 markdown 格式文本。
    • 数字转写: 自动将数字转为模型可识别的文本。
    • Emoji 适配: 自动翻译 emoji 为可读文本。
    • 基于分词器: 基于 tokenizer 预处理文本,覆盖模型所有不支持字符范围。
    • 中英文识别: 适配英文环境。
  • 音质增强: 继承音质增强、降噪模型提升输出质量
  • Speaker 导入导出: 支持 Speaker 导入导出,方便定制
  • Speaker 融合: 支持 Speaker 融合,微调说话人

4. Interface

项目 描述 部署或使用方式 图片
API 提供多种形式的文本转语音接口。部署后访问 http://localhost:8000/docs 查看详细信息。 运行 python launch.py API 文档
Playground
包含一个独立于 Python 代码和 Gradio 的 Playground 前端页面,方便调试 API。 部署后访问 http://localhost:8000/playground/index.html
WebUI 在某些场景(如 HuggingFace/Colab)中需要使用 WebUI,这里提供了一个简单实现。请注意,WebUI 不支持对任何本地文件的写操作。 运行 python webui.py WebUI

5. Installation and Running

  1. 确保 相关依赖 已经正确安装,
  2. 根据你的需求启动需要的服务,具体启动参数如下。

5.1. webui.py: WebUI

WebUI.py 是一个用于配置和启动 Gradio Web UI 界面的脚本。

所有参数:

参数 类型 默认值 描述
--server_name str "0.0.0.0" 服务器主机地址
--server_port int 7860 服务器端口
--share bool False 启用共享模式,允许外部访问
--debug bool False 启用调试模式
--compile bool False 启用模型编译
--auth str None 用于认证的用户名和密码,格式为 username:password
--half bool False 开启 f16 半精度推理
--off_tqdm bool False 关闭 tqdm 进度条
--tts_max_len int 1000 TTS(文本到语音)的最大文本长度
--ssml_max_len int 2000 SSML(语音合成标记语言)的最大文本长度
--max_batch_size int 8 TTS 的最大批处理大小
--device_id str None 指定使用 gpu device_id
--use_cpu str None 当前可选值 "all"
--webui_experimental bool False 是否开启实验功能(不完善的功能)
--language str zh-CN 设置 webui 本地化
--api bool False 是否开启 API

从 webui.py 入口启动, 可与 api 同时启动,api 的配置在下方 launch.py 脚本参数中说明, 开启后可在 http://localhost:7860/docs 查看 api

开启 --half 可以大幅减少显存占用。如果 batch size 大于 8 建议开启 half。

由于 MKL FFT doesn't support tensors of type: Half 所以 --half--use_cpu="all" 不能同时使用

5.1.1. webui features

点我看详细图文介绍

  • ChatTTS 模型原生功能 Refiner/Generate
  • 原生 Batch 合成,高效合成超长文本
  • Style control
  • SSML
    • Editor: 简单的 SSML 编辑,配合其他功能使用
    • Spliter:超长文本分割预处理
    • Podcast: 支持创建编辑播客脚本
  • Speaker
    • 内置音色:内置众多 speaker 可以使用
    • speaker creator: 支持试音抽卡,创建 speaker
    • embdding: 支持 speaker embdding 上传,可以复用保存下来的 speaker
    • speaker merge: 支持合并说话人,微调 speaker
  • Prompt Slot
  • Text Normalize
  • 音质增强:
    • enhance: 音质增强提高输出质量
    • denoise: 去除噪音
  • Experimental 实验功能
    • [WIP] ASR
    • [WIP] Inpainting

5.2. launch.py: API Server

某些情况,你并不需要 webui,那么可以使用这个脚本启动单纯的 api 服务。

所有参数:

参数 类型 默认值 描述
--host str "0.0.0.0" 服务器主机地址
--port int 8000 服务器端口
--reload bool False 启用自动重载功能(用于开发)
--compile bool False 启用模型编译
--lru_size int 64 设置请求缓存池的大小;设置为 0 禁用 lru_cache
--cors_origin str "*" 允许的 CORS 源,使用 * 允许所有源
--no_playground bool False 关闭 playground 入口
--no_docs bool False 关闭 docs 入口
--half bool False 开启 f16 半精度推理
--off_tqdm bool False 关闭 tqdm 进度条
--exclude str "" 排除不需要的 api
--device_id str None 指定使用 gpu device_id
--use_cpu str None 当前可选值 "all"

launch.py 脚本启动成功后,你可以在 /docs 下检查 api 是否开启。

详细 API 文档

6. Benchmark

可使用 ./tests/benchmark/tts_benchmark.py 复现

测试平台

  • GPU: GeForce RTX 2080 Ti
  • CPU: 3.4hz 24core

以下为 batch size 为 8 时的结果,完整扫描看 performance_results.csv

Batch size Use decoder Half precision Compile model Use CPU GPU Memory Duration RTF
8 1.72 36.78 0.22
8 0.89 39.34 0.24
8 1.72 36.78 0.23
8 0.90 39.34 0.24
8 1.70 36.78 0.29
8 1.72 36.78 0.29
8 1.02 35.75 0.40
8 0.95 35.75 0.40
8 N/A 49.92 0.58
8 N/A 49.92 0.58
8 N/A 49.92 0.58
8 N/A 49.92 0.60
8 N/A N/A N/A
8 N/A N/A N/A
8 N/A N/A N/A
8 N/A N/A N/A

7. demo

7.1. 风格化控制

input
<speak version="0.1">
    <voice spk="Bob" seed="42" style="narration-relaxed">
        下面是一个 ChatTTS 用于合成多角色多情感的有声书示例[lbreak]
    </voice>
    <voice spk="Bob" seed="42" style="narration-relaxed">
        黛玉冷笑道:[lbreak]
    </voice>
    <voice spk="female2" seed="42" style="angry">
        我说呢 [uv_break] ,亏了绊住,不然,早就飞起来了[lbreak]
    </voice>
    <voice spk="Bob" seed="42" style="narration-relaxed">
        宝玉道:[lbreak]
    </voice>
    <voice spk="Alice" seed="42" style="unfriendly">
        “只许和你玩 [uv_break] ,替你解闷。不过偶然到他那里,就说这些闲话。”[lbreak]
    </voice>
    <voice spk="female2" seed="42" style="angry">
        “好没意思的话![uv_break] 去不去,关我什么事儿? 又没叫你替我解闷儿 [uv_break],还许你不理我呢” [lbreak]
    </voice>
    <voice spk="Bob" seed="42" style="narration-relaxed">
        说着,便赌气回房去了 [lbreak]
    </voice>
</speak>
output
default.webm

7.2. 长文本生成

input

中华美食,作为世界饮食文化的瑰宝,以其丰富的种类、独特的风味和精湛的烹饪技艺而闻名于世。**地大物博,各地区的饮食习惯和烹饪方法各具特色,形成了独树一帜的美食体系。从北方的京鲁菜、东北菜,到南方的粤菜、闽菜,无不展现出中华美食的多样性。

在中华美食的世界里,五味调和,色香味俱全。无论是辣味浓郁的川菜,还是清淡鲜美的淮扬菜,都能够满足不同人的口味需求。除了味道上的独特,中华美食还注重色彩的搭配和形态的美感,让每一道菜品不仅是味觉的享受,更是一场视觉的盛宴。

中华美食不仅仅是食物,更是一种文化的传承。每一道菜背后都有着深厚的历史背景和文化故事。比如,北京的烤鸭,代表着皇家气派;而西安的羊肉泡馍,则体现了浓郁的地方风情。中华美食的精髓在于它追求的“天人合一”,讲究食材的自然性和烹饪过程中的和谐。

总之,中华美食博大精深,其丰富的口感和多样的烹饪技艺,构成了一个充满魅力和无限可能的美食世界。无论你来自哪里,都会被这独特的美食文化所吸引和感动。

output
long_text_demo.webm

8. SSML

SSML readme

9. Speaking style

style readme

10. Docker

10.1. 镜像

WIP 开发中

10.2. 手动 build

下载模型: python -m scripts.download_models --source modelscope

  • webui: docker-compose -f ./docker-compose.webui.yml up -d
  • api: docker-compose -f ./docker-compose.api.yml up -d

环境变量配置

11. Roadmap

WIP

12. FAQ

12.1. 什么是 Prompt1 和 Prompt2?

Prompt1 和 Prompt2 都是系统提示(system prompt),区别在于插入点不同。因为测试发现当前模型对第一个 [Stts] token 非常敏感,所以需要两个提示。

  • Prompt1 插入到第一个 [Stts] 之前
  • Prompt2 插入到第一个 [Stts] 之后

12.2. 什么是 Prefix?

Prefix 主要用于控制模型的生成能力,类似于官方示例中的 refine prompt。这个 prefix 中应该只包含特殊的非语素 token,如 [laugh_0][oral_0][speed_0][break_0] 等。

12.3. Style 中 _p 的区别是什么?

Style 中带有 _p 的使用了 prompt + prefix,而不带 _p 的则只使用 prefix。

12.4. 为什么开启了 --compile 很慢?

由于还未实现推理 padding 所以如果每次推理 shape 改变都可能触发 torch 进行 compile

暂时不建议开启

References