CTX-vec2wav,具有声学上下文感知能力的声码器
这是AAAI-2024论文UniCATS:一个统一的上下文感知文本到语音框架,包含上下文VQ-扩散和声码化中CTX-vec2wav声码器的官方实现。
<img width="1187" alt="image-20230926140022539" src=asset/main.png>
另请参阅:CTX-txt2vec的官方实现,这是论文中提出的具有上下文VQ-扩散的声学模型。
环境设置
本仓库在Linux上的python 3.9环境下进行了测试。您可以使用conda设置环境
# 安装所需包
conda create -n ctxv2w python=3.9 # 或任何您喜欢的名称
conda activate ctxv2w
pip install -r requirements.txt
# 然后,设置PATH和PYTHONPATH
source path.sh # 如果不使用"ctxv2w",请更改环境名称
utils/
中的脚本应该是可执行的。您可以运行chmod +x utils/*
来确保这一点。
以下过程还需要您的Linux环境中有bash
和perl
命令。
推理(使用声学上下文进行声码化)
对于已经在data/
中注册的句子,可以通过以下方式进行推理(VQ索引+声学提示):
bash run.sh --stage 3 --stop_stage 3
# 您可以通过"--eval_set $which_set"指定要构建的数据集,例如"--eval_set dev_all"
您也可以创建一个子集并对其进行推理:
subset_data_dir.sh data/eval_all 200 data/eval_subset # 从data/eval_all中随机选择200个句子
bash run.sh --stage 3 --stop_stage 3 --eval_set "eval_subset"
程序会加载实验目录exp/train_all_ctxv2w.v1/*pkl
中的最新检查点。
💡注意:run.sh
中的第3阶段会自动为每个句子随机选择提示(参见local/build_prompt_feat.py
)。
您可以自定义此过程并自行进行推理:
- 准备一个
feats.scp
文件,为每个句子(用于推理)指定其VQ索引序列,形状为(L, 2)
。 - 运行
feat-to-len.py scp:/path/to/feats.scp > /path/to/utt2num_frames
。 - 准备一个
prompt.scp
文件,为每个句子指定其声学(梅尔谱)提示,形状为(L', 80)
。 - 通过以下方式运行推理:
# 可能需要更改采样率 decode.py \ --sampling-rate 16000 \ --feats-scp /path/to/feats.scp \ --prompt-scp /path/to/prompt.scp \ --num-frames /path/to/utt2num_frames \ --config /path/to/config.yaml \ --vq-codebook /path/to/codebook.npy \ --checkpoint /path/to/checkpoint \ --outdir /path/to/output/wav
训练
首先,您需要正确构建data
和feats
目录。请查看data_prep了解详细信息。
💡注意:这里我们提供16kHz版本的模型和数据。同时,原始论文使用24kHz数据,这是通过使用16kHz提取的特征并增加配置yaml中的
upsample_scales
来实现的。
然后,可以通过以下方式在LibriTTS(所有训练分区)上进行训练:
bash run.sh --stage 2 --stop_stage 2
# 您可以通过--conf $your_config提供不同的配置文件
# 查看run.sh了解所有参数。您可以在命令行中将每个bash变量指定为"--key value"。
这将创建exp/train_all_ctxv2w.v1
用于日志记录。如果您指定$CUDA_VISIBLE_DEVICES环境变量,该脚本会自动处理多GPU训练。
预训练模型参数
我们发布了在LibriTTS train-all集上的两个版本的模型参数(生成器)。这些对应于目标波形的两个采样率。 请注意,声学特征(fbank+ppe)都是从16k波形中提取的。唯一的区别是HifiGAN生成器中的上采样率。
使用方法与"推理"部分相同。欢迎使用这些检查点进行声码化!
CMVN文件:为了对集外句子进行推理,我们提供了cmvn.ark
文件在此。您应该提取梅尔谱,用该文件(在LibriTTS上计算)进行归一化,然后输入模型。
致谢
在开发过程中,参考了以下仓库:
- ESPnet,用于
ctx_vec2wav/models/conformer
中的大多数网络模块。 - Kaldi,用于
utils/
中的大多数实用脚本。 - ParallelWaveGAN,采用了其训练和解码流程。
引用
@article{du2023unicats,
title={UniCATS: A Unified Context-Aware Text-to-Speech Framework with Contextual VQ-Diffusion and Vocoding},
author={Du, Chenpeng and Guo, Yiwei and Shen, Feiyu and Liu, Zhijun and Liang, Zheng and Chen, Xie and Wang, Shuai and Zhang, Hui and Yu, Kai},
journal={arXiv preprint arXiv:2306.07547},
year={2023}
}