一 简介
在当今数字化的时代,文本转语音(TTS)技术的应用越来越广泛,尤其是在对话式场景中,如智能语音助手、有声读物等。在以前的文章中,我也测试过国外的一个可以录制个人声音,并可以对声音做克隆,并对一段文本,可以利用克隆的声音阅读出来。但是,那个网站对使用存在必定限制,频繁使用需要付钱的。
所以如果有大量的文本转语音需求,不如自己搭建个。无意中看到前段时间比较火的开源的文本转语音github项目:
https://github.com/2noise/ChatTTS/tree/main,目前是4k 个star。 听了下声音,超级自然,没有什么AI声音的感觉,关键可以在文字中加入笑声、停顿、感叹词等。
可以通过下面的视频来一起感受下这个声音的真实性:
鉴于这个项目比较有意思,又是python的,我就上手来实战下,下面记录时间过程。
二 安装和使用
先说下我的电脑配置:

虽然我的机器也有个显卡,但是不是NVIDIA 的,所后来面的代码执行中,实则只用到了CPU, 总体感觉速度还行。
2.1 依赖和ChatTTS安装
以下是操作步骤,python的版本要用3.11,更高的版本会有问题。
# 创建虚拟环境
python3.11 -m venv myenv-py3.11
# 激活虚拟环境
source myenv-py3.11/bin/activate
# 安装依赖,依赖文件可以到项目里面下
pip install -r requirements.txt
pip install torch==2.1.0 torchvision==0.16.0 torchaudio==2.1.0
pip install ChatTTS
requirements.txt内容如下:
numpy<3.0.0
numba
torch>=2.1.0
torchaudio
tqdm
vector_quantize_pytorch
transformers>=4.41.1
vocos
IPython
gradio
pybase16384
pynini==2.1.5
WeTextProcessing
nemo_text_processing
av
pydub
2.2 测试代码
import ChatTTS
import torch
import torchaudio
chat = ChatTTS.Chat()
chat.load(compile=False)
texts= ["大家好,我是明翼,[break_4]欢迎大家关注我的公众号尧字节,希望大家多阅读、点赞、评论、转发哦[laugh_0]!"]
waves = chat.infer(texts)
audio_tensor = torch.from_numpy(waves[0]).unsqueeze(0)
torchaudio.save("miao.wav", audio_tensor, 24000)
代码解释:
import ChatTTS:导入 ChatTTS 库,该库用于文本到语音的转换。
import torch:导入 torch 库,它是一个用于深度学习的开源框架,ChatTTS 可能依赖于 torch 进行模型的计算。
import torchaudio:导入 torchaudio 库,它是 torch 的一个音频处理库,用于音频的读取、保存等操作。
chat = ChatTTS.Chat():
创建一个 ChatTTS.Chat 类的实例 chat,该实例用于后续的文本到语音的转换操作。
chat.load(compile=False):
调用 chat 对象的 load 方法来加载所需的模型。compile 参数是一个布尔值,若设置为 True,可能会通过编译模型来提高性能,但在当前代码中设置为 False。
第一次调用的时候,会到下载模型,模型比较大,会运行一段时间。
wavs = chat.infer(texts)
调用 chat 对象的 infer 方法,将 texts 列表作为输入,进行文本到语音的转换。infer 方法会返回一个包含多个语音数据的列表 wavs,列表中的每个元素对应 texts 列表中相应文本转换后的语音数据。
这一步是最耗时间的。
可以看到有如下的显示:
>>> wavs = chat.infer(texts)
found invalid characters: {'!'}
text: 13%|██████████████████████████▋ | 49/384(max) [00:04, 11.69it/s]
code: 17%|███████████████████████████████████▏ | 348/2048(max) [00:25, 13.81it/s]
下面两行代码超级重大:
audio_tensor = torch.from_numpy(waves[0]).unsqueeze(0)
torchaudio.save("miao.wav", audio_tensor, 24000)
将 NumPy 数组转换为 PyTorch 张量:torch.from_numpy(waves[0]) 函数的作用是把 NumPy 数组 waves[0] 转换为 PyTorch 张量。waves 一般是一个包含多个音频数据的列表,waves[0] 表明取列表中的第一个音频数据。
添加一个维度:unsqueeze(0) 方法用于在张量的指定位置(这里是第 0 维)添加一个维度。在音频处理中,torchaudio.save 函数要求输入的音频张量是二维的,形状为 (通道数, 样本数)。而 torch.from_numpy(waves[0]) 返回的可能是一维张量,只包含样本数据,所以需要使用 unsqueeze(0) 在第 0 维添加一个维度,将其转换为二维张量,表明单通道音频。
原来我找的代码是没有:.unsqueeze(0)这个代码片段的,会报错,报错如下:
return backend.save(
^^^^^^^^^^^^^
File ".../lib/python3.11/site-packages/torchaudio/_backend/sox.py", line 72, in save
sox_ext.save_audio_file(
File ".../AI/code/myenv-chattts311/lib/python3.11/site-packages/torch/_ops.py", line 755, in __call__
return self._op(*args, **(kwargs or {}))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
RuntimeError: Input tensor has to be 2D.
另外还遇到了一个坑,报错信息如下:
ite-packages/ChatTTS/model/dvae.py", line 247, in __repr__
self.coef.cpu().numpy().astype(np.float32).tobytes()
^^^^^^^^^^^^^^^^^^^^^^^
RuntimeError: Numpy is not available
从表面上来看好像Numpy库没有安装,但是我的确 已经安装了,后面查了下是个版本依赖的问题,通过重新安装低版本Numpy库解决:
pip3 install "numpy<2"
总结
最后放上转换后的语音效果,值得注意的是,我设置的停顿和笑声似乎没起什么作用,有大神知道缘由,麻烦告知下!
️ 听完这段AI朗读的音频,是不是感觉科技的力量越来越神奇了?从声音克隆到情感化朗读,ChatTTS让我们离”真假难辨”又近了一步!
如果你也心动了,不妨跟着教程动手试试看~(温馨提示:记得先检查你的Python版本和库依赖哦)
最后留个小思考:当AI的声音越来越自然,你觉得未来人机交互会迎来怎样的变革?欢迎在评论区分享你的脑洞!
点击关注【尧字节】,获取更多前沿技术实战干货!下一期你想看什么AI黑科技?留言告知我吧~(顺便给文章点个赞呗)
收藏了,感谢分享