Это официальная реализация нашего бумажного голосового потока ICASSP 2024.

Этот репо протестирован на Python 3.9 на Linux. Вы можете настроить окружающую среду с Conda
# Install required packages
conda create -n vflow python==3.9 # or any name you like
conda activate vflow
pip install -r requirements.txt
# Then, set PATH
source path.sh # change the env name in it if you don't use "vflow"
# Install monotonic_align for MAS
cd model/monotonic_align
python setup.py build_ext --inplace Обратите внимание, что, чтобы избежать проблем с установкой Torchdyn, мы напрямую копируем версию Torchdyn 1.0.6 здесь локально, на torchdyn/ .
Следующий процесс также может потребоваться команды bash и perl в вашей среде.
Это репо зависит от организации данных в стиле Калди. Все файлы описания данных должны быть размещены в подкатализаторах в data/ . См. data/ljspeech/example для основного примера. В этом примере необходимы следующие текстовые файлы:
wav.scp : организовано как utt /path/to/wav .utts.list : каждая строка определяет высказывание. Это может быть получено с помощью cut -d ' ' -f 1 wav.scp > utts.list .utt2spk : Организован как utt spk_name .text и phn_duration : указывает последовательность фонем и соответствующую целочисленную продолжительность (в кадрах). Кроме того, существует файл data/ljspeech/phones.txt , чтобы указать все телефоны вместе с их индексами в словаре. Для LJSPEECH мы предоставляем обработанный файл онлайн. Вы можете скачать его и распаковать в data/ljspeech/{train,val} . Если вы хотите тренироваться на своем собственном наборе данных, вам, возможно, придется создать эти файлы самостоятельно (или изменить стратегию загрузки данных).
После того, как эти манифестные файлы, пожалуйста, сделайте следующее, чтобы извлечь мель-спектрограмму для обучения:
bash extract_fbank.sh --stage 0 --stop_stage 2 --nj 16
# nj: number of parallel jobs.
# Have a look into the script if you need to change something
# Bash variables before "parse_options.sh" can be passed by CLI, e.g. "--key value". Обратите внимание, что мы по умолчанию используем здесь данные 16 кГц . Это создаст feats/fbank и feats/normed_fbank , где файлы SCP в стиле Kaldi и ARK хранят данные Mel-Spectrogram. Нормальные функции будут использоваться для обучения.
Если вы хотите использовать динамики-id (например, LJSPEECH, вместо того, чтобы использовать предварительные встраивания динамиков, такие как XVectors) для обучения, пожалуйста, запустите:
make_utt2spk_id.py data/ljspeech/train/utt2spk data/ljspeech/val/utt2spk
# You can add more files in CLI. Will write utt2num_frames in the same directory to these files. Конфигурации для обучения хранятся как файл yaml в configs/ . Данные манифесты и функции для обучения и набора проверки будут указаны в этих файлах YAML. Вам нужно будет сменить двойные пути файлов, если вам нужно тренироваться на своих собственных данных.
Затем обучение выполняется
python train.py -c configs/ ${your_yaml} -m ${model_name}
# e.g. python train.py -c configs/lj_16k_gt_dur.yaml -m lj_16k_gt_dur Он создаст logs/${model_name} для ведения журнала и контрольной точки.
Несколько примечаний:
use_gt_dur в false , чтобы включить алгоритм MAS. В этом настройке лучше установить add_blank на true . После обучения модели в некоторой степени он может быть готов к процессу выпрямления потока. Устранение потока требует генерирования данных с использованием обученной модели и использования пары (шум, данные), чтобы снова обучить модель. Поскольку этот процесс всегда должен включать в себя весь набор обучения, рекомендуется запустить несколько графических процессоров для параллельного декодирования. Мы предоставляем сценарий, чтобы сделать это:
# Set CUDA_VISIBLE_DEVICES, or the program will use all available GPUs.
python generate_for_reflow.py -c configs/ ${your_yaml} -m ${model_name}
--EMA --max-utt-num 100000000
--dataset train
--solver euler -t 10
--gt-dur
# --EMA specifies to load EMA checkpoint (latest)
# --max-utt-num sets the number of utterances to decode (in this case, arbitrarily high)
# --solver euler -t 10 specifies the solver and timesteps. Could be adaptive solvers like dopri5.
# --gt-dur forces the model to use ground truth duration for decoding. Это создаст synthetic_wav/${model_name}/generate_for_reflow/train для хранения. noise.scp вместе с feats.scp будет храниться. После декодирования обучающего набора вы также можете декодировать проверку, установленную --dataset val .
Затем укажите пути к этим feats.scp и noise.scp в новой конфигурации YAML, как в lj_16k_gt_dur_reflow.yaml :
perform_reflow : true
...
data :
train :
feats_scp : " synthetic_wav/lj_16k_gt_dur/train/feats.scp "
noise_scp : " synthetic_wav/lj_16k_gt_dur/train/noise.scp "
...Теперь он снова готов к обучению в рефере, с тем же сценарием в обучении, но новыми файлами конфигурации YAML. Не стесняйтесь копировать обученную модель в новый журнал Dir для возобновления. Кроме того, можно изменить структуру модели и тренироваться с нуля на данных режни.
Подобно «генерировать данные для рефера», модельный вывод может быть сделан
python inference_dataset.py -c configs/ ${your_yaml} -m ${model_name} --EMA
--solver euler -t 10 Это будет синтезировать Mel-Spectrograms для проверки, установленной в вашей конфигурации, сохраняя их по адресу synthetic_wav/${model_name}/tts_gt_spk/feats.scp . Динамик, скорость и температура могут быть указаны; См. Функция tools.get_hparams_decode() для полного набора параметров.
Затем вывод может быть сделан в каталоге hifigan/ . Пожалуйста, обратитесь к Readme.
Во время разработки были упомянуты следующие репозитории:
utils/ . Этот репозиторий также содержит некоторые экспериментальные функции.
Преобразование голоса . Поскольку Glowtts может выполнять преобразование голоса с помощью свойства распутывания нормализации потоков, разумно, что сопоставление потока также может выполнить его. Method model.tts.GradTTS.voice_conversion дает предварительную попытку.
Оценка вероятности . Генеративные модели на основе дифференциальных уравнений имеют возможность оценивать вероятность данных по формуле мгновенного изменения переменной переменной
На практике интеграл заменяется суммированием, а дивергенция заменяется оценкой трассировщиков Skilling-Hutchinson. См. Приложение D.2 в песне, et. AL для теоретических деталей. Я реализовал это в model.tts.GradTTS.compute_likelihood .
model.cfm.OTCFM , хотя сейчас это не работает не очень хорошо.GradLogPEstimator2d с помощью конфигурации model.fm_net_type . В настоящее время также поддерживается архитектура оценки Diffsinger. Вы можете добавить больше, например, введенное в Matcha-TTS.model.tts.GradTTS.forward теперь поддерживает бета -биномиальные предыдущие для карт выравнивания; И если вы хотите, вы можете изменить переменную MAS_target на что-то еще, например, проточный шум!Не стесняйтесь ссылаться на эту работу, если это помогает?
@INPROCEEDINGS{guo2024voiceflow,
author={Guo, Yiwei and Du, Chenpeng and Ma, Ziyang and Chen, Xie and Yu, Kai},
booktitle={ICASSP 2024 - 2024 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP)},
title={{VoiceFlow}: Efficient Text-To-Speech with Rectified Flow Matching},
year={2024},
volume={},
number={},
pages={11121-11125},
keywords={Signal processing algorithms;Signal processing;Acoustics;Mathematical models;Vectors;Trajectory;Speech processing;Text-to-speech;flow matching;rectified flow;efficiency;speed-quality tradeoff},
doi={10.1109/ICASSP48485.2024.10445948}
}