07-轻松实现文字转语音 - Coqui TTS部署实践

废话不多说,咱们直接开始吧!

环境安装

1、创建python虚拟环境

conda create --name env_coqui python=3.10
conda activate env_coqui

2、安装tts

pip install TTS

3、查看模型列表

tts --list_models
(env_coqui) PS D:\work\ai\tts\Coqui> tts --list_models

Name format: type/language/dataset/model
1: tts_models/multilingual/multi-dataset/xtts_v2
2: tts_models/multilingual/multi-dataset/xtts_v1.1
3: tts_models/multilingual/multi-dataset/your_tts
4: tts_models/multilingual/multi-dataset/bark
5: tts_models/bg/cv/vits
6: tts_models/cs/cv/vits
7: tts_models/da/cv/vits
8: tts_models/et/cv/vits
9: tts_models/ga/cv/vits
10: tts_models/en/ek1/tacotron2
11: tts_models/en/ljspeech/tacotron2-DDC
12: tts_models/en/ljspeech/tacotron2-DDC_ph
13: tts_models/en/ljspeech/glow-tts
14: tts_models/en/ljspeech/speedy-speech
15: tts_models/en/ljspeech/tacotron2-DCA
16: tts_models/en/ljspeech/vits
17: tts_models/en/ljspeech/vits–neon
18: tts_models/en/ljspeech/fast_pitch
19: tts_models/en/ljspeech/overflow
20: tts_models/en/ljspeech/neural_hmm
21: tts_models/en/vctk/vits

测试预训练模型

选择一个预训练模型(例如 tts_models/en/ljspeech/tacotron2-DDC),并测试其效果:

tts --text "Hello, this is a test of Coqui TTS." --model_name tts_models/en/ljspeech/tacotron2-DDC --vocoder_name vocoder_models/universal/libri-tts/wavegrad --out_path output.wav

上述命令运行完成后,在当前目录下生成了output.wav文件,点击可以播放。

写一个web页面

为了方便使用,我们使用flask框架做一个简单的web应用。

一段简单的python代码:

tts_demo.py
from flask import Flask, request, send_file, render_template
from TTS.api import TTS
import os
import torch

app = Flask(__name__)
# 修复 TTS 模型和 vocoder 的设置方式
from TTS.utils.radam import RAdam
from collections import defaultdict
with torch.serialization.safe_globals([RAdam, defaultdict, dict]):
    tts = TTS(model_name="tts_models/zh-CN/baker/tacotron2-DDC-GST")

@app.route("/", methods=["GET"])
def index():
    return render_template("index.html")

@app.route("/synthesize", methods=["POST"])
def synthesize():
    text = request.json.get("text")
    output_path = "output.wav"
    tts.tts_to_file(text=text, file_path=output_path)
    return send_file(output_path, mimetype="audio/wav")

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000)

一个无比简洁优雅的web页面~

templates/index.html
<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>文字转语音</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            max-width: 800px;
            margin: 0 auto;
            padding: 20px;
            line-height: 1.6;
        }
        h1 {
            text-align: center;
            margin-bottom: 30px;
            color: #333;
        }
        .container {
            background-color: #f9f9f9;
            border-radius: 8px;
            padding: 20px;
            box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
        }
        textarea {
            width: 100%;
            height: 150px;
            margin-bottom: 20px;
            padding: 10px;
            border: 1px solid #ddd;
            border-radius: 4px;
            resize: vertical;
        }
        button {
            background-color: #4CAF50;
            color: white;
            border: none;
            padding: 10px 20px;
            text-align: center;
            font-size: 16px;
            cursor: pointer;
            border-radius: 4px;
        }
        button:hover {
            background-color: #45a049;
        }
        .audio-container {
            margin-top: 20px;
        }
    </style>
</head>
<body>
    <h1>文字转语音</h1>
    <div class="container">
        <textarea id="textInput" placeholder="请输入要转换为语音的文字..."></textarea>
        <button id="convertBtn">转换为语音</button>
        <div class="audio-container">
            <audio id="audioOutput" controls style="display: none;"></audio>
        </div>
    </div>

    <script>
        document.getElementById('convertBtn').addEventListener('click', async () => {
            const text = document.getElementById('textInput').value;
            if (!text) {
                alert('请输入文字内容!');
                return;
            }
            
            try {
                // 显示加载中状态
                document.getElementById('convertBtn').disabled = true;
                document.getElementById('convertBtn').textContent = '处理中...';
                
                // 发送请求到后端
                const response = await fetch('/synthesize', {
                    method: 'POST',
                    headers: {
                        'Content-Type': 'application/json',
                    },
                    body: JSON.stringify({ text })
                });
                
                if (!response.ok) {
                    throw new Error('转换失败');
                }
                
                // 获取音频blob
                const blob = await response.blob();
                const audioUrl = URL.createObjectURL(blob);
                
                // 播放音频
                const audioElement = document.getElementById('audioOutput');
                audioElement.src = audioUrl;
                audioElement.style.display = 'block';
                audioElement.play();
            } catch (error) {
                alert('转换失败:' + error.message);
            } finally {
                // 恢复按钮状态
                document.getElementById('convertBtn').disabled = false;
                document.getElementById('convertBtn').textContent = '转换为语音';
            }
        });
    </script>
</body>
</html> 

运行程序:python demo.py
然后在浏览器输入访问地址:http://localhost:5000/,就可以将任意的文字转为语音啦!
在这里插入图片描述

当然如果需要特定的声音效果,我们可以进行自定义训练。例如用自己录制的声音去训练,就可以生成符自己的专属声音了!

总结,在数字人直播、视频配音、有声书、播客等场景,tts(text to speech)都有广泛的应用。我们需要选择符合我们的模型,并且可以通过自定义训练我们需要的声音。

Coqui TTS简介

Coqui TTS是一个开源的文本转语音(TTS)工具包,旨在提供高质量、灵活且易于使用的语音合成解决方案。它由 Mozilla 的 TTS 项目发展而来,并在社区的支持下不断改进和扩展。Coqui TTS 支持多种语言、模型架构和声码器,适用于从研究到生产的各种场景。

核心特点

1.多模型支持

  • Coqui TTS 提供了多种 TTS 模型架构的支持,包括但不限于:

  • Tacotron 2:经典的序列到序列模型。

  • FastPitch:基于 Transformer 的非自回归模型,适合实时应用。

  • VITS:端到端模型,结合变分推断和对抗学习,生成高质量语音。

  • YourTTS:支持多语言和个性化声音训练的模型。

  • 用户可以根据需求选择不同的模型以平衡音质和性能。

2.高质量声码器

  • Coqui TTS 集成了多种先进的声码器(Vocoder),用于将梅尔频谱图转换为音频波形:

  • HiFi-GAN:高保真生成对抗网络,音质接近真人水平。

  • WaveGrad:基于扩散模型的声码器,生成效果优秀。

  • WaveRNN:轻量级声码器,适合实时应用。

  • 声码器的选择直接影响最终音频的质量和生成速度。

3.多语言支持

  • Coqui TTS 支持多种语言的语音合成,包括但不限于英语、中文、西班牙语、法语等。
  • 特别是 YourTTS 和 XTTS 模型,能够通过少量数据快速适配新的语言或特定说话人。

4.开箱即用

  • Coqui TTS 提供了大量的预训练模型,用户无需训练即可直接使用这些模型进行语音合成。
  • 这些模型覆盖了多种语言、口音和声音风格,满足不同场景的需求。

5.灵活的训练框架

  • 如果需要定制化的声音(如特定说话人的声音),Coqui TTS 提供了完整的训练流程。
  • 支持从头训练或微调现有模型,只需准备相应的语音数据集。

6.易用性

  • 提供了命令行工具和 Python API,方便用户快速上手。
  • 文档齐全,社区活跃,适合初学者和开发者。

应用场景

1.数字人直播

  • 结合 Coqui TTS 和虚拟形象技术,实现数字人实时语音交互。
  • 可用于电商直播、教育、娱乐等领域。

2.语音助手

  • 为智能音箱、客服机器人等设备提供自然流畅的语音合成能力。

3.内容创作

  • 将文本内容(如电子书、文章)转换为语音,用于播客、有声读物等。

4.多语言支持

  • 在国际化项目中,使用 Coqui TTS 生成多种语言的语音,提升用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值