Remarque : Ceci est la version de développement. Si vous avez besoin d'une version stable, veuillez vérifier le V0.1.1.
L'objectif du référentiel est de fournir une implémentation du vocoder Wavenet, qui peut générer des échantillons de parole bruts de haute qualité conditionnés sur des caractéristiques linguistiques ou acoustiques.
Des échantillons audio sont disponibles sur https://r9y9.github.io/wavenet_vocoder/.
Un cahier censé être exécuté sur https://colab.research.google.com est disponible:
Remarque : Ce n'est pas lui-même un modèle de texte vocal (TTS). Avec un modèle pré-formé fourni ici, vous pouvez synthétiser la forme d'onde étant donné un spectrogramme MEL , pas du texte brut. Vous aurez besoin d'un modèle de prédiction de spectrogramme MEL (comme Tacotron2) pour utiliser les modèles pré-formés pour TTS.
Remarque : Quant au modèle pré-entraîné pour LJSpeech, le modèle a été affiné plusieurs fois et entraîné pour plus de 1000 000 étapes au total. Veuillez vous référer aux problèmes (# 1, # 75, # 45) pour savoir comment le modèle a été formé.
| URL du modèle | Données | URL hyper params | Git engager | Mesures |
|---|---|---|---|---|
| lien | Ljspeech | lien | 2092A64 | 1000K ~ Étapes |
| lien | CMU arctique | lien | B1A1076 | Étapes de 740k |
Pour utiliser les modèles pré-formés, vérifiez d'abord le commit Git spécifique noté ci-dessus. c'est-à-dire,
git checkout ${commit_hash}
Puis suit la section "Synthétiser à partir d'un point de contrôle" dans la lecture. Notez que l'ancienne version de Synthesis.py peut ne pas accepter le paramètre --preset=<json> et vous devrez peut-être modifier hparams.py en fonction du fichier préréglé (JSON).
Vous pouvez essayer par exemple:
# Assuming you have downloaded LJSpeech-1.1 at ~/data/LJSpeech-1.1
# pretrained model (20180510_mixture_lj_checkpoint_step000320000_ema.pth)
# hparams (20180510_mixture_lj_checkpoint_step000320000_ema.json)
git checkout 2092a64
python preprocess.py ljspeech ~/data/LJSpeech-1.1 ./data/ljspeech
--preset=20180510_mixture_lj_checkpoint_step000320000_ema.json
python synthesis.py --preset=20180510_mixture_lj_checkpoint_step000320000_ema.json
--conditional=./data/ljspeech/ljspeech-mel-00001.npy
20180510_mixture_lj_checkpoint_step000320000_ema.pth
generated
Vous pouvez trouver un fichier WAV généré dans le répertoire generated . Je me demande comment ça marche? Ensuite, jetez un œil au code :)
Le référentiel se compose de 1) bibliothèque Pytorch, 2) outils de ligne de commande et 3) recettes de style ESPNET. Le premier est une bibliothèque Pytorch à fournir des fonctionnalités Wavanet. Le second est un ensemble d'outils pour exécuter la formation / l'inférence WAVENET, le traitement des données, etc. Le dernier est les recettes reproductibles combinant la bibliothèque et les outils utilitaires Wavenet. Veuillez les voir en fonction de votre objectif. Si vous souhaitez construire votre wavenet sur votre ensemble de données (je suppose que c'est le cas le plus probable), la recette est le chemin pour vous.
git clone https://github.com/r9y9/wavenet_vocoder && cd wavenet_vocoder
pip install -e .
Si vous n'avez besoin que de la partie de la bibliothèque, vous pouvez l'installer à partir de PYPI:
pip install wavenet_vocoder
Le référentiel fournit des recettes de style kaldi pour rendre les expériences reproductibles et facilement gérables. Les recettes disponibles sont les suivantes:
mulaw256 : WAVENET qui utilise une distribution de sortie catégorique. L'entrée est une forme d'onde quantifiée Mulaw 8 bits.mol : Mélange de wavenet logistique (mol). L'entrée est un audio brut 16 bits.gaussian : wavenet monocussien (aka enseignant wavenet de clarinette). L'entrée est un audio brut 16 bits. Toute la recette a run.sh , qui spécifie toutes les étapes pour effectuer la formation / l'inférence WAVENET, y compris le prétraitement des données. Veuillez consulter Run.sh dans le répertoire EGS pour plus de détails.
AVIS : Le conditionnement global du wavenet multi-haut-parleurs n'est pas pris en charge dans les recettes ci-dessus (elle ne devrait pas être difficile à mettre en œuvre). Veuillez vérifier V0.1.12 pour la fonctionnalité, ou si vous avez vraiment besoin de la fonctionnalité, veuillez soulever un problème.
Les recettes sont conçues pour être génériques afin que l'on puisse les utiliser pour n'importe quel ensemble de données. Pour appliquer des recettes à votre propre ensemble de données, vous devrez mettre tous les fichiers WAV dans un seul répertoire plat. c'est-à-dire,
> tree -L 1 ~/data/LJSpeech-1.1/wavs/ | head
/Users/ryuichi/data/LJSpeech-1.1/wavs/
├── LJ001-0001.wav
├── LJ001-0002.wav
├── LJ001-0003.wav
├── LJ001-0004.wav
├── LJ001-0005.wav
├── LJ001-0006.wav
├── LJ001-0007.wav
├── LJ001-0008.wav
├── LJ001-0009.wav
C'est ça! La dernière étape consiste à modifier db_root dans run.sh ou donner db_root en tant qu'argment de ligne de commande pour run.sh.
./run.sh --stage 0 --stop-stage 0 --db-root ~/data/LJSpeech-1.1/wavs/
Une recette se compose généralement de plusieurs étapes. Il est fortement recommandé d'exécuter la recette étape par étape pour comprendre comment cela fonctionne pour la première fois. Pour ce faire, spécifiez stage et stop_stage comme suit:
./run.sh --stage 0 --stop-stage 0
./run.sh --stage 1 --stop-stage 1
./run.sh --stage 2 --stop-stage 2
Dans des situations typiques, vous devrez spécifier des appareils CUDA exprécialement de manière explicite pour l'étape de formation.
CUDA_VISIBLE_DEVICES="0,1" ./run.sh --stage 2 --stop-stage 2
Les outils de ligne de commande sont écrits avec docopt. Voir chaque docstring pour les usages de base.
Vider des hyperparamètres dans un fichier JSON.
Usage:
python tojson.py --hparams="parameters you want to override" <output_json_path>
Usage:
python preprocess.py wavallin ${dataset_path} ${out_dir} --preset=<json>
Remarque: Pour la formation multi-GPU, vous feriez mieux de vous assurer que Batch_Size% num_gpu == 0
Usage:
python train.py --dump-root=${dump-root} --preset=<json>
--hparams="parameters you want to override"
Étant donné un Directoy qui contient des caractéristiques de conditionnement locales, synthétisez les formes d'onde pour eux.
Usage:
python evaluate.py ${dump_root} ${checkpoint} ${output_dir} --dump-root="data location"
--preset=<json> --hparams="parameters you want to override"
Options:
--num-utterances=<N> : nombre d'énoncés à générer. S'il n'est pas spécifié, générez toutes les échelles. Ceci est utile pour le débogage. AVIS : Cela ne fonctionne probablement pas maintenant. Veuillez utiliser Evaluate.py à la place.
Synthétiser la forme d'onde donne une fonction de conditionnement.
Usage:
python synthesis.py ${checkpoint_path} ${output_dir} --preset=<json> --hparams="parameters you want to override"
Options importantes:
--conditional=<path> : (requis pour le wavenet conditionnel) Chemin des caractéristiques conditionnelles locales (.NPY). Si cela est spécifié, le nombre d'étapes de temps à générer est déterminé par la taille de la fonction conditionnelle.AVIS : Cela ne fonctionne probablement pas maintenant. Veuillez consulter V0.1.1 pour la version de travail.
python train.py --dump-root=./data/cmu_arctic/
--hparams="cin_channels=-1,gin_channels=-1"
Vous devez désactiver le conditionnement global et local en définissant gin_channels et cin_channels sur des valeurs négatives.
python train.py --dump-root=./data/cmu_arctic/ --speaker-id=0
--hparams="cin_channels=80,gin_channels=-1"
AVIS : Cela ne fonctionne probablement pas maintenant. Veuillez consulter V0.1.1 pour la version de travail.
python train.py --dump-root=./data/cmu_arctic/
--hparams="cin_channels=80,gin_channels=16,n_speakers=7"
Les journaux sont jetés dans le répertoire ./log par défaut. Vous pouvez surveiller les journaux par Tensorboard:
tensorboard --logdir=log
Merci beaucoup!! Si vous en trouvez un nouveau, veuillez soumettre un PR.