用ChatTTS搭建一个开源AI语音生成模型,包括WebUI界面和api接口

今天看到GitHub上开源了一个非常厉害的AI语音生成模型ChatTTS,可以生成和人类声音非常接近的语音,而且有语气、语调、可以停顿和发出笑声,再也没有了以前的AI味道

体验地址:colab.research.google.com/drive/1MYep…

ChatTTS是专门为对话场景设计的文本转语音模型,例如LLM助手对话任务。它支持英文和中文两种语言。最大的模型使用了10万小时以上的中英文数据进行训练。在HuggingFace中开源的版本为4万小时训练且未SFT的版本。



体验方法

感兴趣的朋友可以自己去尝试,HuggingFace地址是:huggingface.co/2Noise/Chat…

HuggingFace上面可能资源不足无法运行,可以使用谷歌的colab来运行

体验地址:colab.research.google.com/drive/1MYep…



搭了一个ChatTTS WebUI界面和api接口

最近几天,ChatTTS挺火,号称是专门为对话场景设计的文本转语音模型,拉下来玩了玩,开源版效果距离宣传视频还有不少差距,据说是故意限制。

ChatTTS是一个强大的文本转语音系统。然而,负责任地和符合伦理地利用这项技术是非常重要的。为了限制ChatTTS的使用,我们在4w小时模型的训练过程中添加了少量额外的高频噪音,并用mp3格式尽可能压低了音质,以防不法分子用于潜在的犯罪可能。同时我们在内部训练了检测模型,并计划在未来开放。

马马虎虎至少能用,先来搭个web界面和懒人包,使用方便点。本文主要包括三部分

  1. 源码部署

  2. 搭建web界面

  3. 开源地址

拉取源码安装依赖

  1. 假设代码要存在 E:/python/chat下, 确保chat目录为空,进入,地址栏输入 cmd回车,然后执行命令 git clone https://github.com/2noise/ChatTTS .  (git客户端可去这里安装 github.com/git-for-win…

  2. pip install -r requirements.txt

  3. 为方便使用,再额外安装2个模块 pip install modelscope soundfile

  4. 下载模型,默认是从 huggingface.co下载,众所周知的原因,非科学上网无法下载,改用 modescope替代

关键代码

ini复制代码from modelscope import snapshot_download # 下载到当前目录下的models文件夹,返回本地模型目录 CHATTTS_DIR = snapshot_download('pzc163/chatTTS',cache_dir="./models")

然后在 load_models时,设置本地源和源路径

ini复制代码chat = ChatTTS.Chat() chat.load_models(source="local",local_path=CHATTTS_DIR)

  1. 测试一下

ini复制代码 import ChatTTS from modelscope import snapshot_download  CHATTTS_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。

  1. 首先安装 pip install flask waitress

  2. 设定静态目录和模板目录

python复制代码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")

  1. 创建一个 api接口,用于将接收发来的文本合成为语音

python复制代码# 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}"})

要注意的是音色获取

ini复制代码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并没有提供一个友好的音色选择接口。

  1. 启动 flask

python复制代码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实现,非常简单,代码省略

  1. 使用 python 代码测试下

arduino复制代码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"}

效果预览及开源地址

image.png

实际效果音频点击播放 pyvideotrans.com/buzaihu.wav

代码已开源,有需要自取,开源地址 github.com/jianchang51…





分享一个国内免费使用GPT4.0的AI智能问答工具:智答专家。支持AI文本、作图、语音、Sora视频。无需魔法,亲测有效,点击访问

标签:ChatTTS
来源:智答专家
发布时间:2024-05-31 16:39