Esta es la implementación oficial de nuestro flujo de voz ICASSP 2024 Paper.

Este repositorio se prueba en Python 3.9 en Linux. Puedes configurar el medio ambiente con 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 Tenga en cuenta que para evitar el problema de instalar Torchdyn, copiamos directamente la versión Torchdyn 1.0.6 aquí localmente en torchdyn/ .
El siguiente proceso también puede necesitar comandos bash y perl en su entorno.
Este repositorio se basa en la organización de datos de estilo Kaldi. Todos los archivos de descripción de datos deben colocarse en subdirectorios en data/ . Consulte data/ljspeech/example para obtener un ejemplo básico. En este ejemplo, son necesarios los siguientes archivos de texto sin formato:
wav.scp : organizado como utt /path/to/wav .utts.list : cada línea especifica un enunciado. Esto se puede obtener mediante cut -d ' ' -f 1 wav.scp > utts.list .utt2spk : Organizado como utt spk_name .text y phn_duration : Especifica la secuencia del fonema y las duraciones enteras correspondientes (en los marcos). Además, hay un archivo data/ljspeech/phones.txt para especificar todos los teléfonos junto con sus índices en el diccionario. Para LJSpeech, proporcionamos el archivo procesado en línea. Puede descargarlo y descifrar a data/ljspeech/{train,val} . Si desea entrenar en su propio conjunto de datos, es posible que deba crear estos archivos usted mismo (o cambiar la estrategia de carga de datos).
Después de tener estos archivos de manifiesto, haga lo siguiente para extraer el espectrograma MEL para capacitación:
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". Tenga en cuenta que predeterminamos usar datos de 16kHz aquí. Esto creará feats/fbank y feats/normed_fbank , donde los archivos SCP y ARK de estilo kaldi almacenan los datos del espectrograma MEL. Las características normadas se utilizarán para el entrenamiento.
Si desea usar IDS de altavoces (como LJSpeech, en lugar de usar incrustaciones de altavoces previos a la aparición como Xvectores) para capacitación, ejecute:
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. Las configuraciones para la capacitación se almacenan como archivo YAML en configs/ . Los manifestaciones de datos y las características para el conjunto de capacitación y validación se especificarán en esos archivos YAML. Deberá cambiar las rutas de archivo doble cotizadas allí si necesita entrenar en sus propios datos.
Entonces, el entrenamiento se realiza por
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 Creará logs/${model_name} para registro y punto de control.
Varias notas:
use_gt_dur en false para encender el algoritmo MAS. En esta configuración, es mejor configurar add_blank en true . Después de entrenar el modelo hasta cierto punto, puede estar listo para el proceso de rectificación de flujo. La rectificación de flujo requiere generar datos utilizando el modelo entrenado y usar el par (ruido, datos) para entrenar nuevamente el modelo. Como este proceso siempre debe involucrar todo el conjunto de datos de capacitación, se recomienda ejecutar en múltiples GPU para decodificación paralela. Proporcionamos un script para hacer esto:
# 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. Esto creará synthetic_wav/${model_name}/generate_for_reflow/train para el almacenamiento. noise.scp junto con feats.scp se almacenará. Después de decodificar el conjunto de entrenamiento, también puede decodificar la validación establecida por --dataset val .
Luego lj_16k_gt_dur_reflow.yaml especifique las rutas a estas feats.scp noise.scp
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 "
...Ahora está listo para entrenar nuevamente en Refluw, con el mismo script en la capacitación pero nuevos archivos de configuración YAML. Siéntase libre de copiar un modelo capacitado al nuevo directorio de registro para reanudar. Además, es posible cambiar la estructura del modelo y entrenar desde cero en los datos de reflujo.
Similar a "Generar datos para la reflujo", la inferencia del modelo se puede hacer por
python inference_dataset.py -c configs/ ${your_yaml} -m ${model_name} --EMA
--solver euler -t 10 Esto sintetizará los espectrogramas MEL para la validación establecida en su configuración, almacenándolos en synthetic_wav/${model_name}/tts_gt_spk/feats.scp . Se puede especificar altavoz, velocidad y temperatura; Consulte la función tools.get_hparams_decode() para un conjunto completo de opciones.
La inferencia se puede hacer en el directorio hifigan/ . Consulte el Readme allí.
Durante el desarrollo, se mencionó los siguientes repositorios:
utils/ . Este repositorio también contiene algunas funcionalidades experimentales.
Conversión de voz . Como los GLOWTT pueden realizar la conversión de voz a través de la propiedad de desanimación de los flujos de normalización, es razonable que la coincidencia de flujo también pueda realizarla. Method model.tts.GradTTS.voice_conversion da un intento preliminar.
Estimación de probabilidad . Los modelos generativos basados en la ecuación diferencial tienen la capacidad de estimar las probabilidades de datos por la fórmula instantánea de cambio de variable
En la práctica, la integral se reemplaza por suma, y la divergencia es reemplazada por el estimador Skiding-Hutchinson Trace. Ver el Apéndice D.2 en Song, et. Al para detalles teóricos. Implementé esto en model.tts.GradTTS.compute_likelihood .
model.cfm.OTCFM , aunque no funciona muy bien por ahora.GradLogPEstimator2d por la configuración model.fm_net_type . Actualmente, la arquitectura estimadora del Diffsinger también es compatible. Puede agregar más, por ejemplo, que se introdujo en Matcha-TTS.model.tts.GradTTS.forward ahora admite binomial beta antes para mapas de alineación; Y si lo desea, puede cambiar la variable MAS_target a otra cosa, ¡por ejemplo, ruido transformado con flujo!Siéntase libre de citar este trabajo si ayuda?
@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}
}