(简体中文|English)
文本转语音快速入门
PaddleSpeech中的示例主要通过数据集分类,我们主要使用的TTS数据集是:
CSMCS(普通话单一讲者)
AISHELL3(普通话多说话者)
LJSpeech(英文单一发言人)
VCTK(英语多说话者)
PaddleSpeech TTS中的模型具有以下映射关系:
tts0 - Tacotron2
tts1 - TransformerTTS
tts2 - SpeedySpeech
tts3 - FastSpeech2
voc0 - WaveFlow
voc1 - 并行波GAN
voc2 - MelGAN
voc3 - 多频带 MelGAN
voc4 - 风格MelGAN
voc5 - HiFiGAN
vc0 - Tacotron2 语音克隆与 GE2E
vc1 - FastSpeech2 语音克隆与 GE2E
快速入门
我们以 FastSpeech2 + Parallel WaveGAN 和 CSMSC 数据集为例。 examples/csmsc
使用CSMSC训练Parallel WaveGAN
转到目录
cd examples/csmsc/voc1
源环境
source path.sh
在开始做任何事情之前必须这样做。 将
MAIN_ROOT设置为项目目录。使用parallelwave_gan模型作为MODEL。主入口
bash run.sh这只是一个演示,请确保源数据已准备好,并且每个
step在下一个step之前都能正常工作。
使用 CSMSC 训练 FastSpeech2
转到目录
cd examples/csmsc/tts3
源环境
source path.sh
在开始任何操作之前必须要做这件事。 将
MAIN_ROOT设置为项目目录。使用fastspeech2模型作为MODEL。主入口
bash run.sh这只是一个演示,请确保源数据已准备好,并且每个
step在下一个step之前都能正常工作。
run.sh中的步骤主要包括:
源路径。
预处理数据集,
训练模型。
从metadata.jsonl合成波形。
从文本文件合成波形。(在声学模型中)
使用静态模型进行推理。 (可选)
有关更多详细信息,您可以查看 README.md 中的示例。
语音合成的流程
本节展示如何使用TTS提供的预训练模型并对其进行推断。
语音合成中的预训练模型以档案形式提供。解压缩后会得到一个这样的文件夹: 声学模型:
checkpoint_name
├── default.yaml
├── snapshot_iter_*.pdz
├── speech_stats.npy
├── phone_id_map.txt
├── spk_id_map.txt (optional)
└── tone_id_map.txt (optional)
声码器:
checkpoint_name
├── default.yaml
├── snapshot_iter_*.pdz
└── stats.npy
default.yaml存储用于训练模型的配置。snapshot_iter_*.pdz是检查点文件,其中*是它训练过的步骤。*_stats.npy是特征的统计文件,如果在训练之前已经被标准化过。phone_id_map.txt是音素到音素ID的映射。tone_id_map.txt是音调与音调_ids 的映射,当您在训练声学模型之前拆分音调和音素时使用。(例如在我们的 csmsc/speedyspeech 示例中)spk_id_map.txt是多说话者声学模型中说话者与 spk_ids 的映射。(例如在我们的 aishell3/fastspeech2 示例中)
下面的示例代码展示了如何使用模型进行预测。
声学模型(文本到谱图)
下面的代码展示了如何使用一个 FastSpeech2 模型。加载预训练模型后,使用它和归一化对象构造一个预测对象,然后使用 fastspeech2_inferencet(phone_ids) 生成声谱图,这些声谱图可以进一步用于使用声码器合成原始音频。
from pathlib import Path
import numpy as np
import paddle
import yaml
from yacs.config import CfgNode
from paddlespeech.t2s.models.fastspeech2 import FastSpeech2
from paddlespeech.t2s.models.fastspeech2 import FastSpeech2Inference
from paddlespeech.t2s.modules.normalizer import ZScore
# examples/fastspeech2/baker/frontend.py
from frontend import Frontend
# load the pretrained model
checkpoint_dir = Path("fastspeech2_nosil_baker_ckpt_0.4")
with open(checkpoint_dir / "phone_id_map.txt", "r") as f:
phn_id = [line.strip().split() for line in f.readlines()]
vocab_size = len(phn_id)
with open(checkpoint_dir / "default.yaml") as f:
fastspeech2_config = CfgNode(yaml.safe_load(f))
odim = fastspeech2_config.n_mels
model = FastSpeech2(
idim=vocab_size, odim=odim, **fastspeech2_config["model"])
model.set_state_dict(
paddle.load(args.fastspeech2_checkpoint)["main_params"])
model.eval()
# load stats file
stat = np.load(checkpoint_dir / "speech_stats.npy")
mu, std = stat
mu = paddle.to_tensor(mu)
std = paddle.to_tensor(std)
fastspeech2_normalizer = ZScore(mu, std)
# construct a prediction object
fastspeech2_inference = FastSpeech2Inference(fastspeech2_normalizer, model)
# load Chinese Frontend
frontend = Frontend(checkpoint_dir / "phone_id_map.txt")
# text to spectrogram
sentence = "你好吗?"
input_ids = frontend.get_input_ids(sentence, merge_sentences=True)
phone_ids = input_ids["phone_ids"]
flags = 0
# The output of Chinese text frontend is segmented
for part_phone_ids in phone_ids:
with paddle.no_grad():
temp_mel = fastspeech2_inference(part_phone_ids)
if flags == 0:
mel = temp_mel
flags = 1
else:
mel = paddle.concat([mel, temp_mel])
变声器(声谱图转波形)
下面的代码显示了如何使用一个 Parallel WaveGAN 模型。像上面的例子一样,加载预训练模型后,使用它和归一化对象构造一个预测对象,然后使用 pwg_inference(mel) 生成原始音频(wav格式)。
from pathlib import Path
import numpy as np
import paddle
import soundfile as sf
import yaml
from yacs.config import CfgNode
from paddlespeech.t2s.models.parallel_wavegan import PWGGenerator
from paddlespeech.t2s.models.parallel_wavegan import PWGInference
from paddlespeech.t2s.modules.normalizer import ZScore
# load the pretrained model
checkpoint_dir = Path("parallel_wavegan_baker_ckpt_0.4")
with open(checkpoint_dir / "pwg_default.yaml") as f:
pwg_config = CfgNode(yaml.safe_load(f))
vocoder = PWGGenerator(**pwg_config["generator_params"])
vocoder.set_state_dict(paddle.load(args.pwg_params))
vocoder.remove_weight_norm()
vocoder.eval()
# load stats file
stat = np.load(checkpoint_dir / "pwg_stats.npy")
mu, std = stat
mu = paddle.to_tensor(mu)
std = paddle.to_tensor(std)
pwg_normalizer = ZScore(mu, std)
# construct a prediction object
pwg_inference = PWGInference(pwg_normalizer, vocoder)
# spectrogram to wave
wav = pwg_inference(mel)
sf.write(
audio_path,
wav.numpy(),
samplerate=fastspeech2_config.fs)