跳到主要内容

TTS

如何添加新的 TTS 支持?

信息

"TTS 安装永远是添加 TTS 支持中最困难的一步。第二困难的是让别人也装上这个 TTS。"

添加 TTS 的步骤相对固定,并不要求对 Open-LLM-VTuber 项目代码的深度理解,因此相对适合新人上手熟悉项目 (Pull Request 也比较容易被合并)。

0. 总览

0.1 要求

  • 最新版本的 Open-LLM-VTuber,并请切换到 dev 分支进行开发 (Pull Request 也请开到 dev 分支)。
  • 会写 Python (不过你跟着下面步骤走就知道你会不会 Python 了。你可以边走边学)
  • 大概理解 GitHub 开源工作流。具体来说,理解 fork 与 Pull Request 的概念。
  • 理解如何使用 uv 管理 Python 项目依赖。(不会 uv 的这里学)
  • 懂一点点 Pydantic (或是... AI 懂也行)

0.2 步骤总览

信息

本项目目录遵循 src 结构,所有后端代码都存放在 src/open_llm_vtuber 目录下。后面提到的 ttsconfig_manager 都在 src/open_llm_vtuber 目录中。

前端代码的引用,配置文件,极少数代码和其他非代码文件则存放在项目根目录下。

开发

  1. tts 目录中添加新的 TTS 实现
  2. tts_factory 工厂类中,添加代码来初始化你实现的 tts 类。
  3. conf.default.yaml 以及 conf.ZH.default.yaml 文件中,添加 tts 配置项
  4. config_manager/tts.py 文件中,将你的 tts 的相关配置添加到配置文件数据校验代码中。

测试

  1. 切换到你的 tts 实现并进行测试,确保在空输入,奇怪标点符号的状况下,能正常使用。
  2. 整理代码,提交 pull request

文档

  1. 请前往 用户指南/后端用户指南/语音合成(TTS),编辑 TTS 文档的源代码并添加你实现的 TTS 的安装指南。
  • 如果你在这一步遇到困难,你可以直接联系我,我可以帮你把文档添加进文档网站中 (但安装指南要自己写!)

1. 开发:

2.1 往 tts 目录中添加新的 TTS 实现

前往 src/open_llm_vtuber/tts 目录。

tts

目录下有几个重要的文件:

tts_interface.py

  • 这个是 tts 类的接口类。所有 tts 都要继承这个接口。

tts_factory.py

  • tts 的工厂类。后端将会用配置项调用这个工厂类来初始化 tts,获取 tts 的实例。

剩下的文件都是项目支持的 tts 的实现。我推荐你参考 edge_tts.py 的实现,这也是项目预设的 tts。

请参考 tts_interface.py 与其他 tts 实现,添加新的 tts。

你可以选择实现 async_generate_audiogenerate_audio 其中之一。项目后端以异步代码为主,tts_interface.py 中,如果你选择实现了同步的 generate_audio 函数,async_generate_audio 函数会将 generate_audio 函数包装成异步函数。

generate_audio 函数并不会被外部调用,因此如果你使用的 tts 支持异步,你可以只实现 async_generate_audio 函数。

传入值

你大概率会想要在这个 tts 类初始化的时候从配置文件获取一些参数,自定义一些像是声音,语言之类的自定义项。请把这些可配置项的参数写成构造函数的参数。

2.2 在 tts_factory 工厂类中,添加代码来初始化你实现的 tts 类。

前往 tts_factory.py 文件,在get_tts_engine函数中添加新 tts 的初始化逻辑。

函数 get_tts_engine 将会被外部逻辑调用,并回传一个 tts 的实例。

  • engine_type 表示了用户在 conf.yaml 中,tts_model 选项写的东西,也就是 tts 的选择。
  • kwargs 是一个字典,内容是 conf.yaml 中,这个 tts_modeltts_config 下的配置。

举个例子:

  tts_config:
tts_model: "edge_tts"
# text to speech model options:
# "azure_tts", "pyttsx3_tts", "edge_tts", "bark_tts",
# "cosyvoice_tts", "melo_tts", "coqui_tts",
# "fish_api_tts", "x_tts", "gpt_sovits_tts", "sherpa_onnx_tts"

azure_tts:
api_key: "azure-api-key"
region: "eastus"
voice: "en-US-AshleyNeural"
pitch: "26" # percentage of the pitch adjustment
rate: "1" # rate of speak

bark_tts:
voice: "v2/en_speaker_1"

edge_tts:
# Check out doc at https://github.com/rany2/edge-tts
# Use `edge-tts --list-voices` to list all available voices
voice: "en-US-AvaMultilingualNeural" # "en-US-AvaMultilingualNeural" #"zh-CN-XiaoxiaoNeural" # "ja-JP-NanamiNeural"

tts_model 设成 edge_tts 的时候:

  • engine_type 的传入数值将会是 edge_tts
  • kwargs 将会是这样的字典
{"voice": "en-US-AvaMultilingualNeural"}

2.3 在 conf.default.yaml 以及 conf.ZH.default.yaml 文件中,添加 tts 配置项

v1.1.0 版本之后,项目的配置文件(conf.yaml)会从预设配置文件 conf.default.yamlconf.ZH.default.yaml 生成。如果要添加配置项,我们需要编辑 conf.default.yaml 文件,然后在 conf.ZH.yaml 文件中也加上。

conf.ZH.default.yaml 是给中文用户提供的配置文件,包含中文的注释和一些预设选项。如果用户的系统语言是中文,本项目的配置文件初始化与配置文件更新都会从 conf.ZH.default.yaml 文件而非 conf.default.yaml 文件获取。

你可以在这两个预设配置文件中的 tts_config 中添加新的 tts 所需要的配置项。

2.4 在 config_manager/tts.py 文件中,将你的 tts 的相关配置添加到配置文件数据校验代码中。

v1.0.0 版本开始,项目引入了基于 Pydantic 的配置文件数据校验,因此如果往配置文件中添加新的设置项,我们要修改对应的 Pydantic 模型。

前往 src/open_llm_vtuber/config_manager/tts.py 文件。参考其他 tts 实现,在 tts.py 中添加配置的类,并在底部的 TTSConfig 中添加 tts。

3. 测试与提交代码

测试好你添加的 tts,确认项目可以正常运行,所有配置项都能正常使用。

接着在命令行中用 uv run ruff format 命令,格式化代码。

之后就可以提交 pull request 啦。

危险

请在 conf.default.yamlconf.ZH.default.yaml 文件中放入预设的选项。请不要随便改动配置文件中与你pull request 无关的的选项。

危险

请不要把自己的 API key 推送到分支中。请在提交前检查自己要提交的代码,不要把乱七八糟的东西推上来。

4. 补充文档

请前往 用户指南/后端用户指南/语音合成(TTS),编辑 TTS 文档的源代码并添加你实现的 TTS 的安装指南。

注意,我们的文档有中英文两种语言。如果可以,可以先完成一个语言之后用 AI 翻译成另一个语言。