这是一个 IndexTTS2 的 Flask API ,提供带有流式输出和情感预设支持的语音合成服务。
ISP的优势:
- 无论你要生成多长的文本,你都能在几秒内听到这段文本是什么样的,不会白白等几个小时然后发现效果不好。
- 基于官方接口实现,兼容绝大多数的仓库和整合包。
如果你喜欢速度和并发:
我们为VLLM写了一个FASTAPI版本。这里有(Win)ISP+VLLM的整合包。由于测试尚不充分,可能会遇到一点小问题,欢迎反馈。
这里有一份简单版的安装指南。或者,如果你已经安装好了IndexTTS2,你可以根据下面的说明继续。
- 克隆和安装 2025.10 以后的 IndexTTS及其依赖。
- 将此仓库克隆到
index-tts文件夹(使路径为index-tts/isp)。
cd index-tts
git clone https://github.com/Lumi083/isp.git
- IndexTTS2 推荐使用
uv进行环境管理。通过在 index-tts 文件夹执行下列命令,你可以将本项目的依赖安装到相同的uv管理环境中:
# pyaudio 仅用于 test\audio_play.py,你可以不安装它
# 但是你肯定需要 flask。
uv pip install flask==3.0.0 pyaudio>=0.2.14启动 API 服务器:
uv run isp/app.py服务器默认运行在 http://127.0.0.1:23467。
测试:
uv run .\isp\test\latency.py # 测试stream的首包延迟
uv run .\isp\test\audio_play.py # 用pyaudio播放stream的输出
uv run .\isp\test\presets.py # 测试各种情绪的生成
# 一些情况下 soundfile 可能无法识别部分文件。详见 issue 1--verbose:启用详细日志--port:API 端口(默认:23467)--host:绑定主机(默认:0.0.0.0)--model_dir:模型检查点路径(默认:./checkpoints)--fp16:推理使用 FP16(默认:True)--deepspeed:使用 DeepSpeed 加速--cuda_kernel:使用 cuda kernel 编译加速--force_presets:禁用 /voice/indextts,仅保留 /voice/indextts/presets。
使用提供的参数从文本生成音频。
text:要合成的文本prompt_audio:用于克隆说话人音色的参考音频路径
format:输出格式(当前仅支持:"wav")lang:语言代码(可能仅支持中文英文,默认:"zh")
-
stream:启用流式音频生成(默认:false) -
quick_token:快速流式令牌阈值(默认:0) -
当
stream=false时:下载生成的音频文件 -
当
stream=true时:返回流式 WAV 音频返回
emo_weight:情感混合权重(默认:0.65)emo_control_method:情感控制方法(默认:0)- 0:使用 prompt_audio 中的说话人情感
- 1:使用参考音频的情感
- 2:使用自定义情感向量
- 3:使用文本描述的情感
emo_ref_path:情感参考音频路径(方法 1)vec1到vec8:自定义情感向量分量(方法 2)
vec1 = gr.Slider(label=i18n("喜"), minimum=0.0, maximum=1.0, value=0.0, step=0.05)
vec2 = gr.Slider(label=i18n("怒"), minimum=0.0, maximum=1.0, value=0.0, step=0.05)
vec3 = gr.Slider(label=i18n("哀"), minimum=0.0, maximum=1.0, value=0.0, step=0.05)
vec4 = gr.Slider(label=i18n("惧"), minimum=0.0, maximum=1.0, value=0.0, step=0.05)
vec5 = gr.Slider(label=i18n("厌恶"), minimum=0.0, maximum=1.0, value=0.0, step=0.05)
vec6 = gr.Slider(label=i18n("低落"), minimum=0.0, maximum=1.0, value=0.0, step=0.05)
vec7 = gr.Slider(label=i18n("惊喜"), minimum=0.0, maximum=1.0, value=0.0, step=0.05)
vec8 = gr.Slider(label=i18n("平静"), minimum=0.0, maximum=1.0, value=0.0, step=0.05)
emo_text:情感描述文本(方法 3,不推荐)emo_random:随机化情感向量(不推荐)
使用 id 替代 prompt_audio,使用 emo_id 替代 emo_ref_path。
# ext in [wav, mp3]
prompt_audio = api_root_folder/presets/voice/{id}/prompt.{ext}
emo_ref_path = api_root_folder/presets/emo/{emo_id}.{ext}- 参考音频应不超过 15 秒