当前位置:   article > 正文

屌炸的文本转语音AI——ChatTTS本地部署教程

chattts本地部署

目录

1. 本地部署准备 

 1.1 下载 ChatTTS 代码

将代码库拷贝到本地,注意要在英文目录下 

1.2  通过 modelscope 下载ChatTTS模型 

2. 验证

2.1用 jupyter 验证

2.2 编写ttsollama.py代码

2.3 运行 ttsollama.py 


2024年5月28日 开源的 ChatTTS 截至 6月5日 20.2k 星

ChatTTS:开源领域最强的文本到语音转换(TTS)模型!它允许用户将文本转换为语音。该模型主要面向学术研究和教育目的,不适用于商业或法律用途。它使用深度学习技术,能够生成自然流畅的语音输出,适合研究和开发语音合成技术的人员使用。

带有情绪控制语音堪比真人,可以方便制作有声小说,如果应用在线对话中很难分辨是否是真人。

在线体验地址:https://huggingface.co/2Noise/ChatTTS

1. 本地部署准备 

 国内镜像库地址:https://gitee.com/vscene/ChatTTS

 1.1 下载 ChatTTS 代码

代码库拷贝到本地,注意要在英文目录下 

> git clone https://gitee.com/vscene/ChatTTS

> cd ChatTTS

> dir 

1.2  通过 modelscope 下载ChatTTS模型 

运行 python 并输入如下代码, 或者创建 download.py 并输入如下代码( python download.py进行下载)

from modelscope import snapshot_download

model_dir = snapshot_download('pzc163/chatTTS')

如果报错:ModuleNotFoundError: No module named 'modelscope'

说明没有安装 modelscope .

通过conda 创建 ChatTTS 环境 ,如果没有安装conda 请参考

手撸私有AI大模型——开发环境搭建miniconda_开发ai私有模型-CSDN博客

# 创建 ChatTTS python 运行环境,python 默认安装 3.11.5

> conda create -n ChatTTS

# 安装 modelscope 

> pip install modelscope 

 下载完的模型数据默认在 C:\Users\Administrator\.cache\modelscope\hub\pzc163\chatTTS 目录

 将 chatTTS 目录拷贝 到 ChatTTS 代码目录并覆盖其下的 "ChatTTS"目录

安装环境库依赖

>  pip install -r requirements.txt 

>  pip install ChatTTS  transformers torch omegaconf vocos openai IPython

2. 验证

2.1用 jupyter 验证

打开 vscode (需要安装jupyter 插件)

#在 git clone ChatTTS 目录下运行 code . [code 点] 命令启动 vscode

# 注意当前需要在 ChatTTS 的 conda 环境下

(ChatTTS)    d:\code\ChatTTS > code.

 

import torch

import ChatTTS

from IPython.display import Audio

 

chat = ChatTTS.Chat()

chat.load_models(source='local', local_path='ChatTTS')

 执行效果

texts = ["What’s your name?",]*3 \

        + ["我是嫦娥六号,目前正在月亮上工作。"]*3   \

        +["床前明月光,疑似地上霜。举头望明月,低头思故乡。"]  

wavs = chat.infer(texts, use_decoder=True)

 播放文本转语音结果 0-2 是 第一句, 3-5第二句,6是第三句

Audio(wavs[0], rate=24_000, autoplay=True)

Audio(wavs[3], rate=24_000, autoplay=True)

 

改变 wavs[?] 输出不同的声音

 Audio(wavs[4], rate=24_000, autoplay=True)

Audio(wavs[6], rate=24_000, autoplay=True)

2.2 编写ttsollama.py代码

首先需要保证ollama 已经在本地运行. http://localhost:11434 可以正常访问

编写 ttsollama.py 代码

(这里用的是 qwen:7b 模型,如何部署ollama 和 qwen:7b 模型,可参考 之前的文档)

手撸私有AI大模型——ollama本地部署私有大模型_ollama 下载-CSDN博客

  1. import torch
  2. import ChatTTS
  3. from IPython.display import Audio
  4. import scipy
  5. import numpy as np
  6. chat = ChatTTS.Chat()
  7. chat.load_models(source='local', local_path='ChatTTS')
  8. def deterministic(seed=2222):
  9. torch.manual_seed(seed)
  10. np.random.seed(seed)
  11. torch.cuda.manual_seed(seed)
  12. torch.backends.cudnn.deterministic = True
  13. torch.backends.cudnn.benchmark = False
  14. from ChatTTS.experimental.llm import OllamaAPI
  15. user_question = '用中文简单介绍北京中轴线'
  16. texts = ["北京中轴线,是指北京自元大都、明清北京城以来北京城市东西对称布局建筑物的对称轴,北京市诸多其它建筑物亦位于此条轴线上。明清北京城的中轴线南起永定门,北至钟鼓楼直线距离长约7.8公里。"]
  17. ollama_api = OllamaAPI(base_url="http://localhost:11434", model="qwen:7b")
  18. text = ollama_api.call(user_question, prompt_version='deepseek')
  19. text = ollama_api.call(text, prompt_version='deepseek_TN')
  20. spk_stat = torch.load('ChatTTS/asset/spk_stat.pt')
  21. rand_spk = torch.randn(768) * spk_stat.chunk(2)[0] + spk_stat.chunk(2)[1]
  22. params_infer_code = {'spk_emb': rand_spk, 'temperature': .3}
  23. params_refine_text = {'prompt': '[oral_2][laugh_1][break_6]'}
  24. # 将infer函数中的文本参数替换为从LLM获取的text
  25. wav = chat.infer(texts,
  26. params_refine_text=params_refine_text, params_infer_code=params_infer_code)
  27. Audio(wav[0], rate=24_000, autoplay=True)
  28. # 导出音频
  29. scipy.io.wavfile.write(filename = "./result.wav", rate = 24_000, data = wav[0].T)

在 experimental 目录下 创建 llm.py代码

  1. from openai import OpenAI
  2. prompt_dict = {
  3. 'deepseek': [
  4. {"role": "system", "content": "You are a helpful assistant"},
  5. {"role": "user", "content": "你好,请注意你现在生成的文字要按照人日常生活的口吻,你的回复将会后续用TTS模型转为语音,并且请把回答控制在100字以内。并且标点符号仅包含逗号和句号,将数字等转为文字回答。"},
  6. {"role": "assistant", "content": "好的,我现在生成的文字将按照人日常生活的口吻, 并且我会把回答控制在一百字以内, 标点符号仅包含逗号和句号,将阿拉伯数字等转为中文文字回答。下面请开始对话。"},],
  7. 'deepseek_TN': [
  8. {"role": "system", "content": "You are a helpful assistant"},
  9. {"role": "user", "content": "你好,现在我们在处理TTS的文本输入,下面将会给你输入一段文本,请你将其中的阿拉伯数字等等转为文字表达,并且输出的文本里仅包含逗号和句号这两个标点符号"},
  10. {"role": "assistant", "content": "好的,我现在对TTS的文本输入进行处理。这一般叫做text normalization。下面请输入"},
  11. {"role": "user", "content": "We paid $123 for this desk."},
  12. {"role": "assistant", "content": "We paid one hundred and twenty three dollars for this desk."},
  13. {"role": "user", "content": "详询请拨打010-87124653"},
  14. {"role": "assistant", "content": "详询请拨打零幺零,八七壹二四六五三"},
  15. {"role": "user", "content": "罗森宣布将于7月24日退市,在华门店超6000家!"},
  16. {"role": "assistant", "content": "罗森宣布将于七月二十四日退市,在华门店超过六千家。"},
  17. ],
  18. }
  19. # Ollama API
  20. class OllamaAPI:
  21. def __init__(self, base_url, model):
  22. self.base_url = base_url
  23. self.model = model
  24. def call(self, user_question, temperature=0.3, prompt_version='kimi', **kwargs):
  25. import requests
  26. headers = {
  27. 'Content-Type': 'application/json',
  28. }
  29. data = {
  30. "model": self.model,
  31. "messages": prompt_dict[prompt_version] + [{"role": "user", "content": user_question}],
  32. "temperature": temperature,
  33. **kwargs
  34. }
  35. response = requests.post(self.base_url + "/v1/chat/completions", headers=headers, json=data)
  36. response_data = response.json()
  37. if response.status_code == 200:
  38. return response_data['choices'][0]['message']['content']
  39. else:
  40. raise Exception(f"Error: {response_data}")

2.3 运行 ttsollama.py 

# 运行 ttsollama.py 输出 result.wav

>python ttsollama.py

 物理机只有CPU跑的比较慢, 但是本地部署免费 :)

 测试的结果7.8 公里中的 数字 7 和8 没有识别的很好

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/743723
推荐阅读
相关标签
  

闽ICP备14008679号