Language : 🇺🇸 | 🇨🇳
一个非官方的VALL-E(PyTorch实现)零样本文本到语音合成器的神经编解码语言模型。
我们可以在一块GPU上训练VALL-E模型。
演示
广泛影响
由于VALL-E可以合成保持说话者身份的语音,可能在模型的滥用上存在潜在风险,例如伪造语音识别或冒充特定的说话者。
为了避免滥用,不会提供训练好的模型和服务。
安装依赖
快速启动并运行,只需按照以下步骤操作:
# PyTorch
pip install torch==1.13.1 torchaudio==0.13.1 --extra-index-url https://download.pytorch.org/whl/cu116
pip install torchmetrics==0.11.1
# fbank
pip install librosa==0.8.1
# phonemizer pypinyin
apt-get install espeak-ng
## OSX: brew install espeak
pip install phonemizer==3.2.1 pypinyin==0.48.0
# lhotse 更新到最新版本
# https://github.com/lhotse-speech/lhotse/pull/956
# https://github.com/lhotse-speech/lhotse/pull/960
pip uninstall lhotse
pip uninstall lhotse
pip install git+https://github.com/lhotse-speech/lhotse
# k2
# 在 https://huggingface.co/csukuangfj/k2 找到合适的版本
pip install https://huggingface.co/csukuangfj/k2/resolve/main/cuda/k2-1.23.4.dev20230224+cuda11.6.torch1.13.1-cp310-cp310-linux_x86_64.whl
# icefall
git clone https://github.com/k2-fsa/icefall
cd icefall
pip install -r requirements.txt
export PYTHONPATH=`pwd`/../icefall:$PYTHONPATH
echo "export PYTHONPATH=`pwd`/../icefall:\$PYTHONPATH" >> ~/.zshrc
echo "export PYTHONPATH=`pwd`/../icefall:\$PYTHONPATH" >> ~/.bashrc
cd -
source ~/.zshrc
# valle
git clone https://github.com/lifeiteng/valle.git
cd valle
pip install -e .
训练&推理
-
英文示例 examples/libritts/README.md
-
中文示例 examples/aishell1/README.md
-
前缀模式 0 1 2 4 用于NAR解码器
论文第5.1章 "LibriLight中的平均波形长度为60秒。在训练过程中,我们随机裁剪波形为10到20秒之间的随机长度。对于NAR声学提示符令牌,我们从同一语句中选择3秒的随机片段波形。"- 0:无声学提示符令牌
- 1:当前批次语句的随机前缀 (推荐使用这个)
- 2:当前批次语句的随机片段
- 4:与论文相同(由于他们随机裁剪长波形为多个语句,因此相同语句是指在同一长波形中的前或后语句。)
# 使用前缀模式4训练NAR解码器 python3 bin/trainer.py --prefix_mode 4 --dataset libritts --input-strategy PromptedPrecomputedFeatures ...
LibriTTS 演示 在一个24G内存的GPU上训练
cd examples/libritts
# 第一步 准备数据集
bash prepare.sh --stage -1 --stop-stage 3
# 第二步 在一个24GB内存的GPU上训练模型
exp_dir=exp/valle
## 训练AR模型
python3 bin/trainer.py --max-duration 80 --filter-min-duration 0.5 --filter-max-duration 14 --train-stage 1 \
--num-buckets 6 --dtype "bfloat16" --save-every-n 10000 --valid-interval 20000 \
--model-name valle --share-embedding true --norm-first true --add-prenet false \
--decoder-dim 1024 --nhead 16 --num-decoder-layers 12 --prefix-mode 1 \
--base-lr 0.05 --warmup-steps 200 --average-period 0 \
--num-epochs 20 --start-epoch 1 --start-batch 0 --accumulate-grad-steps 4 \
--exp-dir ${exp_dir}
## 训练NAR模型
cp ${exp_dir}/best-valid-loss.pt ${exp_dir}/epoch-2.pt # --start-epoch 3=2+1
python3 bin/trainer.py --max-duration 40 --filter-min-duration 0.5 --filter-max-duration 14 --train-stage 2 \
--num-buckets 6 --dtype "float32" --save-every-n 10000 --valid-interval 20000 \
--model-name valle --share-embedding true --norm-first true --add-prenet false \
--decoder-dim 1024 --nhead 16 --num-decoder-layers 12 --prefix-mode 1 \
--base-lr 0.05 --warmup-steps 200 --average-period 0 \
--num-epochs 40 --start-epoch 3 --start-batch 0 --accumulate-grad-steps 4 \
--exp-dir ${exp_dir}
# 第三步 推理
python3 bin/infer.py --output-dir infer/demos \
--checkpoint=${exp_dir}/best-valid-loss.pt \
--text-prompts "KNOT one point one five miles per hour." \
--audio-prompts ./prompts/8463_294825_000043_000000.wav \
--text "To get up and running quickly just follow the steps below." \
# 演示推理
https://github.com/lifeiteng/lifeiteng.github.com/blob/main/valle/run.sh#L68
故障排除
- SummaryWriter 分段错误(核心转储)
- 行
tb_writer = SummaryWriter(log_dir=f"{params.exp_dir}/tensorboard")
- 修复 https://github.com/tensorflow/tensorboard/pull/6135/files
file=`python -c 'import site; print(f"{site.getsitepackages()[0]}/tensorboard/summary/writer/event_file_writer.py")'` sed -i 's/import tf/import tensorflow_stub as tf/g' $file
- 行
训练自定义数据集?
- 准备数据集到
lhotse manifests
- 这里有很多参考资料 lhotse/recipes
python3 bin/tokenizer.py ...
python3 bin/trainer.py ...
贡献
引用
要引用这个仓库:
@misc{valle,
author={Feiteng Li},
title={VALL-E: A neural codec language model},
year={2023},
url={http://github.com/lifeiteng/vall-e}
}
@article{VALL-E,
title = {Neural Codec Language Models are Zero-Shot Text to Speech Synthesizers},
author = {Chengyi Wang, Sanyuan Chen, Yu Wu,
Ziqiang Zhang, Long Zhou, Shujie Liu,
Zhuo Chen, Yanqing Liu, Huaming Wang,
Jinyu Li, Lei He, Sheng Zhao, Furu Wei},
year = {2023},
eprint = {2301.02111},
archivePrefix = {arXiv},
volume = {abs/2301.02111},
url = {http://arxiv.org/abs/2301.02111},
}