【AI大模型】ChatTTS文本转语音

什么是ChatTTS

ChatTTS(Chat Text-to-Speech)是一种技术,它允许计算机程序将文本转换成口语,即语音输出。这种技术广泛应用于各种场景,比如语音助手、电子书阅读器、自动电话系统、辅助技术等。用户输入文本,ChatTTS系统会将这些文本转换成语音,然后通过扬声器播放出来,或者通过音频文件保存。这种转换通常涉及到语音合成技术,包括自然语言处理和语音合成引擎,使得生成的语音听起来尽可能自然和流畅。

ChatTTS 是一款为对话场景设计的语音合成模型,专为 LLM 助手任务优化。它不仅支持多语言(中文和英文),还能预测和控制细粒度的韵律特征,包括笑声、停顿和插话等。使用这款工具,你可以实现自然流畅的语音合成,特别适合对话任务。

项目地址

https://github.com/2noise/ChatTTS?ref=upstract.com

https://huggingface.co/2Noise/ChatTTS

git lfs install
git clone https://www.modelscope.cn/pzc163/chatTTS.git ChatTTS-Model
git clone https://github.com/2noise/ChatTTS
cd ChatTTS

ChatTTS特点

多语言支持:ChatTTS的一个关键特性是支持多种语言,包括英语和中文。这使其能够为广泛用户群提供服务,并克服语言障碍。
大规模数据训练:ChatTTS使用了大量数据进行训练,大约有1000万小时的中文和英文数据。这样的大规模训练使其声音合成质量高,听起来自然。
对话任务兼容性:ChatTTS很适合处理通常分配给大型语言模型LLMs的对话任务。它可以为对话生成响应,并在集成到各种应用和服务时提供更自然流畅的互动体验。
开源计划:ChatTTS团队目前开源一个经过训练的基础模型。
控制和安全性:ChatTTS致力于提高模型的可控性,添加水印,并将其与LLMs集成。这些努力确保了模型的安全性和可靠性。
易用性:ChatTTS为用户提供了易于使用的体验。它只需要文本信息作为输入,就可以生成相应的语音文件。这样的简单性使其方便有语音合成需求的用户。
细粒度控制:支持对笑声、停顿和插入词等声音元素的精确操纵。
多说话人支持:能够模拟不同性别和风格的说话人,增加语音的多样性。
高效接口:提供简单易用的Python API,方便快速集成到现有项目中。

从技术角度进行分析

ChatTTS项目在技术上有几个关键点

深度学习模型:ChatTTS使用Transformer架构进行文本处理和语音生成。Transformer模型以其强大的上下文理解能力和生成质量而著称,特别适合自然语言处理任务。
分词器:项目使用T5Tokenizer进行文本预处理,依赖SentencePiece库进行子词单元的分解,这可以有效提升生成语音的质量。
预训练与微调:ChatTTS依赖于预训练模型,如T5模型,通过微调特定任务的数据集,进一步提高模型的性能和适应性。
PyTorch框架:整个项目基于PyTorch框架开发,利用其高效的计算能力和灵活的模型构建功能,支持大规模并行计算和分布式训练。

关键参数详解

在使用 ChatTTS 过程中,了解和调整关键参数非常重要:

Audio Seed
含义: 用于初始化随机数生成器的种子值。设置相同的 Audio Seed 可以确保重复生成一致的语音,便于实验和调试。
推荐 Seed: 3798-知性女、462-大舌头女、2424-低沉男。

Text Seed
含义: 类似于 Audio Seed,在文本生成阶段用于初始化随机数生成器的种子值。

Refine Text
建议: 勾选此选项可以对输入文本进行优化或修改,提升语音的自然度和可理解性。

Audio Temperature
含义: 控制输出的随机性。数值越高,生成的语音越可能包含意外变化;数值较低则趋向于更平稳的输出。

Top_P 和Top_K
Top_P: 核采样策略,定义概率累积值,模型将只从这个累积概率覆盖的最可能的词中选择下一个词。
Top_K: 限制模型考虑的可能词汇数量,设置为一个具体数值,模型将只从这最可能的 K 个词中选择下一个词。

进阶使用技巧

除了基本的参数设置,你还可以通过本地部署 Web UI 或 API 的方式进行更细粒度的控制,比如调整笑声、停顿和口音。以下是一些常用的控制标记
[oral_(0-9)]: 控制口音强度
[laugh_(0-2)]: 控制笑声
[break_(0-7)]: 控制停顿时间
试试不同的组合,比如 [oral 2][laugh 0][break 4],探索更多有趣的语音效果。

优缺点分析

优点:

生成质量高
ChatTTS利用先进的Transformer架构和大规模预训练技术,生成的语音自然度高,接近真人发声。
灵活性强
由于采用了统一的文本到文本框架,ChatTTS可以处理多种语言任务,不仅限于语音合成,还可以进行翻译、摘要等任务。
开源社区支持
ChatTTS是一个开源项目,得到了广泛的社区支持和贡献,提供了丰富的资源和工具供开发者使用。

缺点:

计算资源需求高
高质量的语音生成需要大量的计算资源,特别是在训练和微调阶段,对硬件性能有较高要求。
数据依赖性强
生成效果严重依赖于训练数据的质量和多样性,在某些特定应用场景下,可能需要大量的特定数据进行微调。
实时性不足
由于生成过程的复杂性,在某些实时应用中可能存在延迟,特别是在处理复杂文本和生成长段语音时。

项目克隆

https://github.com/2noise/ChatTTS?ref=upstract.com
直接在Git上面下载对应的项目代码

模型下载:
开源版本是一个在 40,000 小时数据上进行无监督微调的预训练模型:

https://huggingface.co/2Noise/ChatTTS/tree/main

一键部署 简单易用 无需复杂安装ChatTTS_colab的整合包:

https://huggingface.co/taa/ChatTTS_colab/tree/main

魔塔:
https://www.modelscope.cn/models/pzc163/chatTTS/files
或者
https://www.modelscope.cn/search?search=ChatTTS
自己选择下载

依赖安装

直接安装

PowerShell 7.4.2
cd D:\ChatTTS
pip install -r requirements.txt -i https://pypi.doubanio.com/simple/
pip install --upgrade -r requirements.txt

或者使用conda

conda create -n chattts
conda activate chattts
pip install -r requirements.txt

其中torch可能有问题,使用GPU的话,先查看自己电脑的cudn适配那个版本的torch之后安装对应的版本即可

用法介绍

ChatTTS中文文本转音频文件
特别注意:经验证,ChatTTS官网的样例代码API已经过时,无法直接运行,特别是chat.load_models方法入参是错误的,下面是阅读API入参且验证的可执行代码。

# ChatTTS-01.py

import ChatTTS
import torch
import torchaudio

# 第一步下载的ChatTTS模型文件目录,请按照实际情况替换
MODEL_PATH = '/Users/obullxl/PythonSpace/ChatTTS-Model'

# 初始化并加载模型,特别注意加载模型参数,官网样例代码已经过时,请使用老牛同学验证代码
chat = ChatTTS.Chat()
chat.load_models(
    vocos_config_path=f'{MODEL_PATH}/config/vocos.yaml',
    vocos_ckpt_path=f'{MODEL_PATH}/asset/Vocos.pt',
    gpt_config_path=f'{MODEL_PATH}/config/gpt.yaml',
    gpt_ckpt_path=f'{MODEL_PATH}/asset/GPT.pt',
    decoder_config_path=f'{MODEL_PATH}/config/decoder.yaml',
    decoder_ckpt_path=f'{MODEL_PATH}/asset/Decoder.pt',
    tokenizer_path=f'{MODEL_PATH}/asset/tokenizer.pt',
)

# 需要转化为音频的文本内容
text = '大家好,我是老牛,微信公众号:老牛同学。很高兴与您相遇,专注于编程技术、大模型及人工智能等相关技术分享,欢迎关注和转发,让我们共同启程智慧之旅!'

# 文本转为音频
wavs = chat.infer(text, use_decoder=True)

# 保存音频文件到本地文件(采样率为24000Hz)
torchaudio.save("./output/output-01.wav", torch.from_numpy(wavs[0]), 24000)

# 上述文本转音频程序执行完成,在本地目录生成了./output/output-01.wav音频文件,打开该音频文件,就可以听到非常自然流畅的语音了!

基础用法

import ChatTTS
import torch
import torchaudio

chat = ChatTTS.Chat()
chat.load(compile=False) # Set to True for better performance

texts = ["PUT YOUR 1st TEXT HERE", "PUT YOUR 2nd TEXT HERE"]

wavs = chat.infer(texts)

torchaudio.save("output1.wav", torch.from_numpy(wavs[0]), 24000)

进阶用法

###################################
# Sample a speaker from Gaussian.

rand_spk = chat.sample_random_speaker()
print(rand_spk) # save it for later timbre recovery

params_infer_code = ChatTTS.Chat.InferCodeParams(
    spk_emb = rand_spk, # add sampled speaker 
    temperature = .3,   # using custom temperature
    top_P = 0.7,        # top P decode
    top_K = 20,         # top K decode
)

###################################
# For sentence level manual control.

# use oral_(0-9), laugh_(0-2), break_(0-7) 
# to generate special token in text to synthesize.
params_refine_text = ChatTTS.Chat.RefineTextParams(
    prompt='[oral_2][laugh_0][break_6]',
)

wavs = chat.infer(
    texts,
    params_refine_text=params_refine_text,
    params_infer_code=params_infer_code,
)

###################################
# For word level manual control.

text = 'What is [uv_break]your favorite english food?[laugh][lbreak]'
wavs = chat.infer(text, skip_refine_text=True, params_refine_text=params_refine_text,  params_infer_code=params_infer_code)
torchaudio.save("output2.wav", torch.from_numpy(wavs[0]), 24000)

基础用法和进阶用法都是官网提供的:跳转

示例

# Import necessary libraries and configure settings
import torch
import torchaudio
torch._dynamo.config.cache_size_limit = 64
torch._dynamo.config.suppress_errors = True
torch.set_float32_matmul_precision('high')

import ChatTTS
from IPython.display import Audio

# Initialize and load the model: 
chat = ChatTTS.Chat()
chat.load_models(compile=False) # Set to True for better performance

# Define the text input for inference (Support Batching)
texts = [
    "So we found being competitive and collaborative was a huge way of staying motivated towards our goals, so one person to call when you fall off, one person who gets you back on then one person to actually do the activity with.",
    ]

# Perform inference and play the generated audio
wavs = chat.infer(texts)
Audio(wavs[0], rate=24_000, autoplay=True)

# Save the generated audio 
torchaudio.save("output.wav", torch.from_numpy(wavs[0]), 24000)

测试示例

import ChatTTS
from IPython.display import Audio
 
chat = ChatTTS.Chat()
chat.load_models()
 
texts = ["我是测试文本", "你好,世界!"]
 
wavs = chat.infer(texts, use_decoder=True)
 
Audio(wavs[0], rate=24_000, autoplay=True)

如果前面没有下载模型的话,这儿测试代码会自动下载模型

快速搭建WebUI界面

依赖安装:

pip install omegaconf~=2.3.0 transformers~=4.41.1
pip install tqdm einops vector_quantize_pytorch vocos
pip install modelscope gradio

WebUI界面代码:

# ChatTTS-WebUI.py

import random

import ChatTTS
import gradio as gr
import numpy as np
import torch
from ChatTTS.infer.api import refine_text, infer_code

print('启动ChatTTS WebUI......')

# WebUI设置
WEB_HOST = '127.0.0.1'
WEB_PORT = 8089

MODEL_PATH = '/Users/obullxl/PythonSpace/ChatTTS-Model'

chat = ChatTTS.Chat()
chat.load_models(
    vocos_config_path=f'{MODEL_PATH}/config/vocos.yaml',
    vocos_ckpt_path=f'{MODEL_PATH}/asset/Vocos.pt',
    gpt_config_path=f'{MODEL_PATH}/config/gpt.yaml',
    gpt_ckpt_path=f'{MODEL_PATH}/asset/GPT.pt',
    decoder_config_path=f'{MODEL_PATH}/config/decoder.yaml',
    decoder_ckpt_path=f'{MODEL_PATH}/asset/Decoder.pt',
    tokenizer_path=f'{MODEL_PATH}/asset/tokenizer.pt',
)


def generate_seed():
    new_seed = random.randint(1, 100000000)
    return {
        "__type__": "update",
        "value": new_seed
    }


def generate_audio(text, temperature, top_P, top_K, audio_seed_input, text_seed_input, refine_text_flag):
    torch.manual_seed(audio_seed_input)
    rand_spk = torch.randn(768)
    params_infer_code = {
        'spk_emb': rand_spk,
        'temperature': temperature,
        'top_P': top_P,
        'top_K': top_K,
    }
    params_refine_text = {'prompt': '[oral_2][laugh_0][break_6]'}

    torch.manual_seed(text_seed_input)

    text_tokens = refine_text(chat.pretrain_models, text, **params_refine_text)['ids']
    text_tokens = [i[i < chat.pretrain_models['tokenizer'].convert_tokens_to_ids('[break_0]')] for i in text_tokens]
    text = chat.pretrain_models['tokenizer'].batch_decode(text_tokens)
    # result = infer_code(chat.pretrain_models, text, **params_infer_code, return_hidden=True)

    print(f'ChatTTS微调文本:{text}')

    wav = chat.infer(text,
                     params_refine_text=params_refine_text,
                     params_infer_code=params_infer_code,
                     use_decoder=True,
                     skip_refine_text=True,
                     )

    audio_data = np.array(wav[0]).flatten()
    sample_rate = 24000
    text_data = text[0] if isinstance(text, list) else text

    return [(sample_rate, audio_data), text_data]


def main():
    with gr.Blocks() as demo:
        default_text = "大家好,我是老牛同学,微信公众号:老牛同学。很高兴与您相遇,专注于编程技术、大模型及人工智能等相关技术分享,欢迎关注和转发,让我们共同启程智慧之旅!"
        text_input = gr.Textbox(label="输入文本", lines=4, placeholder="Please Input Text...", value=default_text)

        with gr.Row():
            refine_text_checkbox = gr.Checkbox(label="文本微调开关", value=True)
            temperature_slider = gr.Slider(minimum=0.00001, maximum=1.0, step=0.00001, value=0.8, label="语音温度参数")
            top_p_slider = gr.Slider(minimum=0.1, maximum=0.9, step=0.05, value=0.7, label="语音top_P采样参数")
            top_k_slider = gr.Slider(minimum=1, maximum=20, step=1, value=20, label="语音top_K采样参数")

        with gr.Row():
            audio_seed_input = gr.Number(value=42, label="语音随机数")
            generate_audio_seed = gr.Button("\U0001F3B2")
            text_seed_input = gr.Number(value=42, label="文本随机数")
            generate_text_seed = gr.Button("\U0001F3B2")

        generate_button = gr.Button("文本生成语音")

        text_output = gr.Textbox(label="微调文本", interactive=False)
        audio_output = gr.Audio(label="语音")

        generate_audio_seed.click(generate_seed,
                                  inputs=[],
                                  outputs=audio_seed_input)

        generate_text_seed.click(generate_seed,
                                 inputs=[],
                                 outputs=text_seed_input)

        generate_button.click(generate_audio,
                              inputs=[text_input, temperature_slider, top_p_slider, top_k_slider, audio_seed_input, text_seed_input, refine_text_checkbox],
                              outputs=[audio_output, text_output, ])

    # 启动WebUI
    demo.launch(server_name='127.0.0.1', server_port=8089, share=False, show_api=False, )


if __name__ == '__main__':
    main()


如果下载的源码是GitHub 安装最新版:
pip install git+https://github.com/2noise/ChatTTS

https://github.com/2noise/ChatTTS
则可以直接启动:

python examples/web/webui.py

音频保存交互命令:

python examples/cmd/run.py "Your text 1." "Your text 2."

如果直接启动webui.py报错的话,可能是缺少依赖:

pip install -r requirements.txt -i https://pypi.doubanio.com/simple/
 
pip install gradio
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值