OddTTS – 多引擎TTS语音合成API封装(兼容OpenAI TTS API)

OddTTS 是一个功能强大的多引擎语音合成服务,提供统一的API接口和友好的Web界面,一套接口搞定多种主流TTS引擎,包括EdgeTTS、Kokoro-82M-v1.1-zh、ChatTTS、Bert-VITS2、GptSovits v2等,同时也支持OpenAI TTS API的调用。

注意:

  • 首次运行时,会自动下载模型文件。
  • 模型文件大小:
    • Kokoro-82M-v1.1-zh模型:376MB左右。
    • EdgeTTS模型:0MB,无需下载模型。
    • ChatTTS模型:2.4GB(FP16精度)。
    • Bert-VITS2模型:2GB 左右(主干+BERT特征网络,每多一个语种需增加约1.3GB)。
    • GptSovits v2模型:2.5GB左右。
  • 显存需求:
    • EdgeTTS模型:0MB。
    • Kokoro-82M-v1.1-zh模型:0MB(普通CPU可运行)。
    • ChatTTS模型:至少 2.5GB。
    • Bert-VITS2模型:至少 5GB。少样本微调训练,建议使用显存 24GB 以上的 GPU。
    • GptSovits v2模型:至少 8GB。少样本微调训练,建议使用显存 24GB/48GB 以上的 GPU。
  • 国内用户建议使用镜像加速下载模型文件。
  • 模型文件大小较大,建议在有足够磁盘空间的环境运行,或者自定义模型路径(将 models/hf_home 改成你自己的路径)。
    • Windows: set HF_HOME=x:/models/hf_home
    • Linux/MacOS: export HF_HOME=/models/hf_home

一、前言

1. 关于OddTTS

由于在做的小落同学项目需要用到TTS语音合成功能,受限于小落同学的硬件环境(阿里云99元一年的ECS服务器)一开始只能选择用EdgeTTS,但是我自己的电脑又配置相对稍好一点,所以前前后后试了多个不同的TTS引擎,但需要将这些试过的TTS模型做一个统一的封装,以便于小落同学可以随时切换到不同的TTS引擎上,因此OddTTS就诞生了。

考虑到TTS功能的用途广泛,就把它单独出来,并开源了。希望对TTS有需求的同学有帮助。

注:如果你要用除EdgeTTS外的其它几个TTS引擎,在安装使用OddTTS前,你需要先自行安装对应的TTS。

2. 为什么建议你选择OddTTS?

  • 多引擎支持:集成了EdgeTTS、Kokoro、ChatTTS、Bert-VITS2、GptSovits等多种TTS引擎
  • 多种调用方式:支持文件路径返回、Base64编码返回、流式响应等多种输出方式
  • 友好的Web界面:基于Gradio提供可视化操作界面
  • RESTful API:提供完整的REST API,便于集成到其他系统
  • 可配置性强:支持GPU加速、并发线程数调整、模型预加载等配置选项
  • 跨平台兼容:基于Python开发,支持Windows、Linux、macOS等多种操作系统

3. 推荐硬件

模型名称原版最低运行显存原版流畅运行显存原版满血显存INT8 量化最低显存INT4 量化最低显存纯 CPU 能否运行CPU 运行速度
EdgeTTS0GB0GB0GB0GB0GB✅ 可以依赖于你的网速
Kokoro0GB0GB0GB0GB0GB✅ 可以
ChatTTS2.5GB4GB6GB+1.5GB1GB✅ 可以较快
Bert-VITS25GB6GB8GB+3GB2GB✅ 可以中等
GPT-SoVITS v28GB10GB12GB+4GB2.5GB❌ 不建议较慢

小落同学使用情况

  • Demo版本: 阿里云上99元每年的ECS(2核2G),跑不动任何一个TTS模型,所以用的是EdgeTTS.
  • 本地版本:我自己电脑是一个十年前的老笔记本,用的是Kokoro-82M-v1.1-zh模型,纯CPU、且离线运行,运行速度也快。

二、快速开始

1. 安装OddTTS

pip install -i https://pypi.org/simple/ oddtts

2. 启动 OddTTS

1. 默认配置启动

直接在安装好的虚拟环境下,执行下面的命令即可启动

oddtts

启动后OddTTS会默认绑定127.0.0.1(仅本地可访问),端口9001。浏览器访问:http://localhost:9001

2. 自定义配置启动

若要允许其他IP访问,请使用以下命令启动服务,将host设置为0.0.0.0,端口也可以改成你自定义的端口。

oddtts --host 0.0.0.0 --port 8080

三、OddTTS API接口文档

1. API接口列表

1) OpenAI API 兼容接口

GET /v1/audio/speech
  • Function: OpenAI TTS API 兼容接口, details see OpenAI TTS API.
  • Return: mp3 audio data.

2)获取语音列表

GET /v1/audio/voice/list
  • 功能:获取当前TTS引擎支持的所有语音
  • 返回:语音列表,每个语音包含名称、语言、性别等信息

3)获取特定语音详情

GET /v1/audio/voice/list/{voice_name}
  • 功能:获取指定语音的详细信息
  • 参数voice_name – 语音名称
  • 返回:语音详细信息

4)生成TTS音频(返回文件路径)

POST /api/oddtts/file
  • 功能:生成TTS音频并返回文件路径
  • 请求体
  {
    \"text\": \"要转换为语音的文本\",
    \"voice\": \"语音名称\",
    \"rate\": 语速调整(-50到50),
    \"volume\": 音量调整(-50到50),
    \"pitch\": 音调调整(-50到50)
  }
  • 返回{\"status\": \"success\", \"file_path\": \"音频文件路径\", \"format\": \"mp3\"}

5)生成TTS音频(返回Base64)

POST /api/oddtts/base64
  • 功能:生成TTS音频并返回Base64编码
  • 请求体:同文件路径API
  • 返回{\"status\": \"success\", \"base64\": \"Base64编码的音频数据\", \"format\": \"mp3\"}

6)生成TTS音频(流式响应)

POST /api/oddtts/stream
  • 功能:生成TTS音频并以流式响应返回
  • 请求体:同文件路径API
  • 返回:流式音频数据(audio/mpeg格式)

7)健康检查

GET /oddtts/health
  • 功能:检查服务是否正常运行
  • 返回{\"status\": \"healthy\", \"message\": \"API服务运行正常\"}

2. API调用示例

以下是一些OddTTS的API调用的示例。

其中voice需要先从后端获取语音列表,再填入当前模型支持的语音名称(接口是:/v1/audio/voice/list),不同的模型的voice音色是不一样的。

1)使用curl调用API

curl.exe -X POST http://localhost:9001/api/oddtts/file ^
  -H "Content-Type: application/json" ^
  -d "{\"text\": \"欢迎关注我的公众号: 奥德元。一起学习AI,一起追赶时代!\", \"voice\": \"zm_011\", \"rate\": 0, \"volume\": 0, \"pitch\": 0}"

2)使用OpenAI库调用API

from openai import OpenAI

base_url = "http://localhost:9001/v1"
model = "oddtts-1"
api_key = "dummy"
voice = "zm_011"

text = "欢迎关注我的公众号: 奥德元。一起学习AI,一起追赶时代!Good good study, day day up!"

def test_openai_tts_api(voice_id):
    client = OpenAI(
        api_key=api_key,
        base_url=base_url
    )

    response = client.audio.speech.create(
        model=model,
        input=text,
        voice=voice_id,
        response_format="mp3"
    )
    response.write_to_file("output.mp3")

if __name__ == "__main__":
    test_openai_tts_api(voice)

3)使用requests库调用API

import requests

# 配置API基础URL
API_BASE_URL = "http://localhost:9001"

# 测试文本
TEST_TEXT = \"欢迎关注我的公众号: 奥德元。一起学习AI,一起追赶时代!Good good study, day day up!\"

# 获取语音列表
def test_api_voices():
    response = requests.get(f\"{API_BASE_URL}/v1/audio/voice/list\")
    voices = response.json()
    print(f\"成功获取 {len(voices)} 个语音选项\")
    return voices

# 测试生成TTS音频
def test_api_tts_file(voice_name):
    payload = {
        \"text\": TEST_TEXT,
        \"voice\": voice_name,
        \"rate\": 0,
        \"volume\": 0,
        \"pitch\": 0
    }
    response = requests.post(f\"{API_BASE_URL}/api/oddtts/file\", json=payload)
    result = response.json()
    print(f\"音频文件路径: {result.get('file_path')}\")

4)使用JavaScript调用API

async function generateTTS(text, voice) {
    const response = await fetch('http://localhost:9001/api/oddtts/file', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json'
        },
        body: JSON.stringify({
            text: text,
            voice: voice,
            rate: 0,
            volume: 0,
            pitch: 0
        })
    });
    const result = await response.json();
    console.log('音频文件路径:', result.file_path);
    return result;
}

generateTTS('欢迎关注我的公众号: 奥德元。一起学习AI,一起追赶时代!', 'zm_011');

四、Web界面使用

服务启动后,可以通过浏览器访问 http://localhost:9001/ 打开Gradio Web界面,支持以下功能:

  • 文本输入区域:输入要转换为语音的文本
  • 语音选择:选择不同的语音和语言
  • 参数调整:调整语速、音量、音调等参数
  • 音频生成:点击按钮生成并播放语音
  • 音频下载:下载生成的语音文件

五、常见问题

  1. 服务启动失败
    • 检查端口是否被占用
    • 确认所有依赖包已正确安装
    • 查看日志文件获取详细错误信息
  2. 语音合成失败
    • 检查TTS引擎配置是否正确
    • 确认选择的语音存在于当前TTS引擎中
    • 对于某些需要联网的引擎,确认网络连接正常(如: EdgeTTS)
  3. 如何切换TTS引擎
    • 修改 oddtts_config.py 文件中的 tts_type 配置项
    • 重启服务使配置生效
  4. 输出格式
    • 默认输出格式为mp3
    • 可以通过 response_format 参数指定其他格式,如wav、mp3等

六、许可证

MIT 许可证 – 详见 LICENSE 文件。商用、个人用、随便用。

也欢迎提交问题和改进建议!