会员专属,加入会员后,可免费下载!本站资源仅支持搭载Apple Silicon Mac M系列 GPU加速芯片。
ChatTTS-UI:一键文字转语音的神器,支持API调用!
最近有一个非常有趣的项目,叫做ChatTTS-UI。它是一个简单的本地网页界面,可以使用ChatTTS将文字合成为语音,还支持对外提供API接口。项目已经开源,大家可以在这里找到:https://github.com/jianchang512/ChatTTS-ui
使用效果:
ChatTTS-UI的特点
相较于官方的使用页面,ChatTTS-UI有以下几个特点:
-
文字、数字和符号控制符混杂效果 -
优化中文文本归一化 -
添加速度控制(speed 1-9) -
固定音色 -
增加 compile=true
以启用推理优化 -
数字转为对应语言的读法 -
增加中英分词功能 -
改进界面和API -
增加 top_p
和top_k
参数控制 -
多行文字按行合成 -
自定义音色获取种子值 -
允许跳过 refine text
阶段 -
网页在线文字合成 -
支持API接口
安装指南
为了简化安装流程,Mac爱范团队将上述工具封装成了一个独立的启动包,用户只需简单点击即可运行,无需配置繁琐的Python环境。以下是获取和安装该应用的详细步骤:
下载应用
前往下载页面:https://aifun.fans/271/,点击页面右侧的下载按钮进行下载。
注意:仅支持搭载有 Mac M1/2/3 系列芯片的设备。
安装步骤
-
从上述链接下载DMG镜像文件,将
app
文件拖拽到Applications
文件夹中。 -
复制安装完成后,首次启动先不要在启动台打开,而是在应用程序文件夹右键打开,原因参考Mac 安装软件常见问题。
-
软件会自动在默认浏览器打开操作界面,此时可以开始在浏览器中使用。
ChatTTS使用技巧
文本中可用的控制符号
你可以在原始待合成文本中穿插控制符号,目前支持笑声和停顿两种控制符。
-
[laugh] 代表笑声 -
[uv_break] 代表停顿
例如:
text="你好啊[uv_break]朋友们,听说今天是个好日子,难道[uv_break]不是吗[laugh]?"
在实际合成中,[laugh]
将被笑声替代,[uv_break]
处将加入停顿。对于笑声和停顿的强度,可以通过参数 params_refine_text
中传递 prompt
控制。
chat.infer([text],params_refine_text={"prompt":'[oral_2][laugh_0][break_6]'})
chat.infer([text],params_refine_text={"prompt":'[oral_2][laugh_2][break_4]'})
跳过 refine text 阶段
实际合成时会重新整理(refine text)插入控制符,如果不希望这样,可以将 skip_refine_text
参数设为 True
。
chat.infer([text],skip_refine_text=True,params_refine_text={"prompt":'[oral_2][laugh_0][break_6]'})
固定发音人音色
默认每次合成都随机调用不同音色,这点非常不友好。若要简单固定发音角色,可以手动设置一个随机数种子,然后获取一个随机说话人。
torch.manual_seed(2222)
rand_spk = chat.sample_random_speaker()
chat.infer([text], use_decoder=True,params_infer_code={'spk_emb': rand_spk})
经测试,2222 7869 6653
是男性音色,3333 4099 5099
是女性角色,更多角色可以自行调整不同的种子数测试。
使用API请求教程
请求方法: POST
请求地址: http://127.0.0.1:9966/tts
请求参数:
-
text: str | 必须, 要合成语音的文字 -
voice: int | 可选,默认 2222, 决定音色的数字, 2222 | 7869 | 6653 | 4099 | 5099,可选其一,或者任意传入将随机使用音色 -
prompt: str | 可选,默认 空, 设定 笑声、停顿,例如 [oral_2][laugh_0][break_6] -
temperature: float | 可选, 默认 0.3 -
top_p: float | 可选, 默认 0.7 -
top_k: int | 可选, 默认 20 -
skip_refine: int | 可选, 默认0, 1=跳过 refine text,0=不跳过 -
custom_voice: int | 可选, 默认0,自定义获取音色值时的种子值,需要大于0的整数,如果设置了则以此为准,将忽略 voice
-
is_split: int | 可选,默认 0, 1=将数字转为文本以便正确发音,0=保持不变
返回: json数据
成功返回:
{code:0,msg:ok,audio_files:[dict1,dict2]}
其中 audio_files 是字典数组,每个元素dict为 {filename:wav文件绝对路径,url:可下载的wav网址}
失败返回:
{code:1,msg:错误原因}
API调用代码
import requests
res = requests.post('http://127.0.0.1:9966/tts', data={
"text": "若不懂无需填写",
"prompt": "",
"voice": "3333",
"temperature": 0.3,
"top_p": 0.7,
"top_k": 20,
"skip_refine": 0,
"custom_voice": 0,
"is_split": 1
})
print(res.json())
成功调用的结果:
{code:0, msg:'ok', audio_files:[{filename: E:/python/chattts/static/wavs/20240601-22_12_12-c7456293f7b5e4dfd3ff83bbd884a23e.wav, url: http://127.0.0.1:9966/static/wavs/20240601-22_12_12-c7456293f7b5e4dfd3ff83bbd884a23e.wav}]}
出错时的结果:
{code:1, msg:"error"}
各位新老朋友,麻烦点个赞👍和在看👀吧!