给ChatTTS搭了个web界面及API接口,可用于视频翻译配音工具


最近几天,ChatTTS挺火,号称是专门为对话场景设计的文本转语音模型,拉下来玩了玩,开源版效果距离宣传视频还有不少差距,据说是故意限制。
ChatTTS是一个强大的文本转语音系统。然而,负责任地和符合伦理地利用这项技术是非常重要的。为了限制ChatTTS的使用,我们在4w小时模型的训练过程中添加了少量额外的高频噪音,并用mp3格式尽可能压低了音质,以防不法分子用于潜在的犯罪可能。同时我们在内部训练了检测模型,并计划在未来开放。
马马虎虎至少能用,先来搭个web界面和懒人包,使用方便点。本文主要包括三部分
1. 源码部署ChatTTS
2. 搭建web界面
3. 在视频翻译配音工具中使用
4. 开源地址: https://github.com/jianchang512/chatTTS-ui
    源码部署ChatTTS
假设代码要存在 E:/python/chat下, 确保chat目录为空,进入,地址栏输入 cmd回车,然后执行命令 git clone https://github.com/2noise/ChatTTS . (git客户端可去这里安装 https://github.com/git-for-windows/git/releases/download/v2.45.1.windows.1/Git-2.45.1-64-bit.exe )
pip install -r requirements.txt
为方便使用,再额外安装2个模块 pip install modelscope soundfile
下载模型,默认是从 huggingface.co下载,众所周知的原因,非科学上网无法下载,改用 modescope替代
关键代码
from modelscope import snapshot_download# 下载到当前目录下的models文件夹,返回本地模型目录CHATTTS_DIR = snapshot_download('pzc163/chatTTS',cache_dir="./models")
然后在 load_models时,设置本地源和源路径
chat = ChatTTS.Chat()chat.load_models(source="local",local_path=CHATTTS_DIR)
测试一下
import ChatTTSfrom modelscope import snapshot_downloadCHATTTS_DIR = snapshot_download('pzc163/chatTTS',cache_dir="./models")chat = ChatTTS.Chat()chat.load_models(source="local",local_path=CHATTTS_DIR)wavs = chat.infer(["你知道我在等你吗,你是否真的在乎我?"], use_decoder=True)
wavs[0] 即是有效的音频数据,这里有个坑,官方给的IPython Audio示例很可能无法播放,因此改用 soundfile 保存到本地后播放
sf.write('1.wav', wavs[0][0], 24000)
没有意外的话,你应该能听到比较真实的人类声音。
    搭个web界面
简单页面首选 flask,并使用 waitress 做 wsgi。
首先安装 pip install flask waitress
设定静态目录和模板目录
app = Flask(__name__, static_folder='./static', static_url_path='/static', template_folder='./templates') @app.route('/static/<path:filename>')def static_files(filename): return send_from_directory(app.config['STATIC_FOLDER'], filename)@app.route('/')def index(): return render_template("index.html")
创建一个 api接口,用于将接收发来的文本合成为语音
# params# text:待合成文字# voice:音色# prompt:@app.route('/tts', methods=['GET', 'POST'])def tts(): # 原始字符串 text = request.args.get("text","").strip() or request.form.get("text","").strip() prompt = request.form.get("prompt",'') try: voice = int(request.form.get("voice",'2222')) except Exception: voice=2222 speed = 1.0 try: speed = float(request.form.get("speed",1)) except: pass if not text: return jsonify({"code": 1, "msg": "text params lost"}) texts = [text] std, mean = torch.load(f'{CHATTTS_DIR}/asset/spk_stat.pt').chunk(2) torch.manual_seed(voice) rand_spk = torch.randn(768) * std + mean wavs = chat.infer(texts, use_decoder=True,params_infer_code={'spk_emb': rand_spk} ,params_refine_text= {'prompt': prompt}) md5_hash = hashlib.md5() md5_hash.update(f"{text}-{voice}-{language}-{speed}-{prompt}".encode('utf-8')) datename=datetime.datetime.now().strftime('%Y%m%d-%H_%M_%S') filename = datename+'-'+md5_hash.hexdigest() + ".wav" sf.write(WAVS_DIR+'/'+filename, wavs[0][0], 24000) return jsonify({"code": 0, "msg": "ok","filename":WAVS_DIR+'/'+filename,"url":f"http://{WEB_ADDRESS}/static/wavs/{filename}"})
要注意的是音色获取
    std, mean = torch.load(f'{CHATTTS_DIR}/asset/spk_stat.pt').chunk(2)    torch.manual_seed(voice)    rand_spk = torch.randn(768) * std + mean
随机选择一个音色。目前ChatTTS并没有提供一个友好的音色选择接口。
启动 flask
    from flask import Flask, request, render_template, jsonify, send_file, send_from_directoryfrom waitress import serve    try:     serve(app,host='127.0.0.1', port=9966)    except Exception:     pass
前端界面使用bootstrap5实现,非常简单,代码省略
使用 python 代码测试下
    import requests    res=requests.post('http://127.0.0.1:9966/tts',data={"text":"你知道我在等你吗,你是否真的在乎我?","prompt":"","voice":"2222"})    print(res.json())    #ok     {code:0,msg:'ok',filename:filename.wav,url:http://127.0.0.1:9966/static/wavs/filename.wav}    #error     {code:1,msg:"error"}
    在视频翻译配音中使用
1. 使用windows预打包版或源码部署该ChatTTS UI项目并启动 ,该项目开源地址  https://github.com/jianchang512/chatTTS-ui
2. 将视频翻译配音软件升级到 1.82+版本,下载地址: https://pyvideotrans.com/downpackage.html
3. 在视频翻译配音软件中--菜单--设置--ChatTTS地址栏中输入http地址,默认是 http://127.0.0.1:9966
4. 可以愉快使用了
效果如下

实际效果音频点击播放  https://pyvideotrans.com/buzaihu.wav
到顶部