轻松实现文字转语音 - 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 torchapp = 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('转换失败');}// 获取音频blobconst 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 生成多种语言的语音,提升用户体验。