From 070843497a75368c310793019e14c83724949dba Mon Sep 17 00:00:00 2001 From: Thorsten Mueller Date: Sun, 9 Aug 2020 11:33:37 +0200 Subject: [PATCH] First draft for script/Dockerimage --- README.md | 10 +- models/thorsten-taco2-v0.0.1/Dockerfile | 68 ++++++++ models/thorsten-taco2-v0.0.1/README.md | 0 models/thorsten-taco2-v0.0.1/config.json | 148 ++++++++++++++++++ .../de-test-sentences.txt | 7 + 5 files changed, 232 insertions(+), 1 deletion(-) create mode 100644 models/thorsten-taco2-v0.0.1/Dockerfile create mode 100644 models/thorsten-taco2-v0.0.1/README.md create mode 100644 models/thorsten-taco2-v0.0.1/config.json create mode 100644 models/thorsten-taco2-v0.0.1/de-test-sentences.txt diff --git a/README.md b/README.md index 9275189..0088a1b 100644 --- a/README.md +++ b/README.md @@ -78,6 +78,14 @@ To get an impression what my voice sounds to decide if it fits to your project i > If you trained a model on "thorsten" dataset please file an issue with some information on it. Sharing a trained model is highly appreciated. +## Trained models (with at least acceptable) quality +Inside the "models" (sub)folders are configs and Dockerfiles for a specific training from scratch. +> Thanks to @erogol and @repodiac for brining in idea/code for script/container files. + +| Folder | date of training | branch | description | +|--------|------------------|-------------|---|---| +|thorsten-taco2-v0.0.1|august 2020| dev | pure taco2 training without vocoder| +|thorsten-taco2-v0.0.1|to do| to do | to do | # Feel free to file an issue if you ... * have improvements on dataset @@ -85,7 +93,6 @@ To get an impression what my voice sounds to decide if it fits to your project i * want to share your trained "thorsten" model * get to know about any abuse usage of my voice - # Special thanks I want to thank all open source communities for providing great projects. @@ -111,6 +118,7 @@ Thank you Dominik (@domcross / https://github.com/domcross/) * https://github.com/MycroftAI/mimic-recording-studio * https://voice.mozilla.org/ * https://github.com/mozilla/TTS +(https://github.com/repodiac/tit-for-tat/tree/master/thorsten-TTS) * https://raw.githubusercontent.com/mozilla/voice-web/master/server/data/de/sentence-collector.txt We'll hear us in future :-) diff --git a/models/thorsten-taco2-v0.0.1/Dockerfile b/models/thorsten-taco2-v0.0.1/Dockerfile new file mode 100644 index 0000000..4a6e689 --- /dev/null +++ b/models/thorsten-taco2-v0.0.1/Dockerfile @@ -0,0 +1,68 @@ +# Adapted from @thorstenMueller's training script (https://github.com/thorstenMueller/TTS_recipes) +# Docker file by @repodiac (https://github.com/repodiac/tit-for-tat/thorsten-tts) +# *** Use without warranty and at your own risk! *** + +# Installation folder **inside** Docker container +# (NOTE: if it is changed to another folder, you have to manually change it to the same folder in the last line, ENTRYPOINT ...) +ARG BASEDIR=/tmp/tts + +FROM pytorch/pytorch:1.6.0-cuda10.1-cudnn7-devel as ttts-base +ARG BASEDIR +WORKDIR $BASEDIR + +# Install system libraries etc. +FROM ttts-base as ttts1 +ARG BASEDIR +WORKDIR $BASEDIR + +RUN apt-get update +RUN apt-get install -y --no-install-recommends build-essential gcc espeak-ng espeak-ng-data git git-extras +RUN pip install pip --upgrade +RUN pip install gdown + +# Clone deep-learning-german-tts repo and copy config and test sentences +RUN git clone --single-branch --branch dev https://github.com/thorstenMueller/deep-learning-german-tts.git +RUN cp $BASEDIR/deep-learning-german-tts/models/thorsten-taco2-v0.0.1/de-test-sentences.txt $BASEDIR +RUN cp $BASEDIR/deep-learning-german-tts/models/thorsten-taco2-v0.0.1/config.json $BASEDIR + +# Download and extract "thorsten-TTS" dataset +FROM ttts1 as ttts2 +ARG BASEDIR +WORKDIR $BASEDIR + +RUN cd $BASEDIR +RUN gdown https://drive.google.com/uc?id=1yKJM1LAOQpRVojKunD9r8WN_p5KzBxjc -O thorsten-dataset.tgz +RUN tar -xvzf thorsten-dataset.tgz + +# Prepare shuffled training and validate data (90% train, 10% val) +RUN shuf LJSpeech-1.1/metadata.csv > LJSpeech-1.1/metadata_shuf.csv +RUN head -n 20400 LJSpeech-1.1/metadata_shuf.csv > LJSpeech-1.1/metadata_train.csv +RUN tail -n 2268 LJSpeech-1.1/metadata_shuf.csv > LJSpeech-1.1/metadata_val.csv + +# Install Mozilla TTS repo and dependencies +FROM ttts2 as ttts3 +ARG BASEDIR +WORKDIR $BASEDIR + +RUN git clone --single-branch --branch dev https://github.com/mozilla/TTS $BASEDIR/TTS + +WORKDIR $BASEDIR/TTS +RUN python setup.py develop + +# Add german phoneme cleaner library by @repodiac +FROM ttts3 as ttts4 +ARG BASEDIR + +RUN git clone https://github.com/repodiac/german_transliterate $BASEDIR/german_transliterate +WORKDIR $BASEDIR/german_transliterate +RUN pip install -e . + +WORKDIR $BASEDIR/TTS/mozilla_voice_tts/tts/utils/text +RUN sed '/import re/a from german_transliterate.core import GermanTransliterate' cleaners.py >> cleaners-new.py +RUN mv cleaners-new.py cleaners.py +RUN echo "\ndef german_phoneme_cleaners(text):" >> cleaners.py +RUN echo "\treturn GermanTransliterate(replace={';': ',', ':': ' '}, sep_abbreviation=' -- ').transliterate(text)" >> cleaners.py + +# Run training +WORKDIR $BASEDIR/TTS/mozilla_voice_tts/bin/ +ENTRYPOINT CUDA_VISIBLE_DEVICES="0" python train_tts.py --config_path $BASEDIR/config.json diff --git a/models/thorsten-taco2-v0.0.1/README.md b/models/thorsten-taco2-v0.0.1/README.md new file mode 100644 index 0000000..e69de29 diff --git a/models/thorsten-taco2-v0.0.1/config.json b/models/thorsten-taco2-v0.0.1/config.json new file mode 100644 index 0000000..09942b3 --- /dev/null +++ b/models/thorsten-taco2-v0.0.1/config.json @@ -0,0 +1,148 @@ +{ + "github_branch":"* master", + "restore_path":"", + "model": "Tacotron2", // one of the model in models/ + "run_name": "thorsten-v1.0.0", + "run_description": "thorsten-de v0.0.1", + + // AUDIO PARAMETERS + "audio":{ + // New "dev" branch params + "fft_size": 1024, + "spec_gain": 1.0, + + // Audio processing parameters + "num_mels": 80, // size of the mel spec frame. + "num_freq": 1025, // number of stft frequency levels. Size of the linear spectogram frame. + "sample_rate": 22050, // DATASET-RELATED: wav sample-rate. If different than the original data, it is resampled. + "win_length": 1024, // stft window length in ms. + "hop_length": 256, // stft window hop-lengh in ms. + "frame_length_ms": null, // stft window length in ms.If null, 'win_length' is used. + "frame_shift_ms": null, // stft window hop-lengh in ms. If null, 'hop_length' is used. + "preemphasis": 0.0, //0.98, // pre-emphasis to reduce spec noise and make it more structured. If 0.0, no -pre-emphasis. + "min_level_db": -100, // normalization range + "ref_level_db": 20, // reference level db, theoretically 20db is the sound of air. + "power": 1.5, // value to sharpen wav signals after GL algorithm. + "griffin_lim_iters": 60,// #griffin-lim iterations. 30-60 is a good range. Larger the value, slower the generation. + // Normalization parameters + "signal_norm": true, // normalize the spec values in range [0, 1] + "symmetric_norm": true, // move normalization to range [-1, 1] + "max_norm": 4.0, // scale normalization to range [-max_norm, max_norm] or [0, max_norm] + "clip_norm": true, // clip normalized values into the range. + "mel_fmin": 75.0, // minimum freq level for mel-spec. ~50 for male and ~95 for female voices. Tune for dataset!! + "mel_fmax": 7750.0, // maximum freq level for mel-spec. Tune for dataset!! + "do_trim_silence": true, // enable trimming of slience of audio as you load it. LJspeech (false), TWEB (false), Nancy (true) + "trim_db": 60 // threshold for timming silence. Set this according to your dataset. + }, + + // VOCABULARY PARAMETERS + // if custom character set is not defined, + // default set in symbols.py is used + "characters":{ + "pad": "_", + "eos": "~", + "bos": "^", + "characters": "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!'(),-.:;? äöüÄÖÜß", + "punctuations":"!'(),-.:;? ", + "phonemes":"iyɨʉɯuɪʏʊeøɘəɵɤoɛœɜɞʌɔæɐaɶɑɒᵻʘɓǀɗǃʄǂɠǁʛpbtdʈɖcɟkɡqɢʔɴŋɲɳnɱmʙrʀⱱɾɽɸβfvθðszʃʒʂʐçʝxɣχʁħʕhɦɬɮʋɹɻjɰlɭʎʟˈˌːˑʍwɥʜʢʡɕʑɺɧɚ˞ɫ" + }, + + // DISTRIBUTED TRAINING + "distributed":{ + "backend": "nccl", + "url": "tcp:\/\/localhost:54321" + }, + + "reinit_layers": [], // give a list of layer names to restore from the given checkpoint. If not defined, it reloads all heuristically matching layers. + + // TRAINING + "batch_size": 32, // Batch size for training. Lower values than 32 might cause hard to learn attention. It is overwritten by 'gradual_training'. + "eval_batch_size":16, + "r": 7, // Number of decoder frames to predict per iteration. Set the initial values if gradual training is enabled. + "gradual_training": [[0, 7, 64], [1, 5, 64], [50000, 3, 32], [100000, 2, 32], [200000, 1, 32]], //set gradual training steps [first_step, r, batch_size]. If it is null, gradual training is disabled. For Tacotron, you might need to reduce the 'batch_size' as you proceeed. + "loss_masking": true, // enable / disable loss masking against the sequence padding. + "ga_alpha": 10.0, // weight for guided attention loss. If > 0, guided attention is enabled. + "apex_amp_level": null, + + // VALIDATION + "run_eval": true, + "test_delay_epochs": 10, //Until attention is aligned, testing only wastes computation time. + "test_sentences_file": "/tmp/tts/de-test-sentences.txt", // set a file to load sentences to be used for testing. If it is null then we use default english sentences. + + // OPTIMIZER + "noam_schedule": false, // use noam warmup and lr schedule. + "grad_clip": 1.0, // upper limit for gradients for clipping. + "epochs": 1000, // total number of epochs to train. + "lr": 0.0005, // Initial learning rate. If Noam decay is active, maximum learning rate. + "wd": 0.000001, // Weight decay weight. + "warmup_steps": 4000, // Noam decay steps to increase the learning rate from 0 to "lr" + "seq_len_norm": false, // Normalize eash sample loss with its length to alleviate imbalanced datasets. Use it if your dataset is small or has skewed distribution of sequence lengths. + + // TACOTRON PRENET + "memory_size": -1, // ONLY TACOTRON - size of the memory queue used fro storing last decoder predictions for auto-regression. If < 0, memory queue is disabled and decoder only uses the last prediction frame. + "prenet_type": "original", // "original" or "bn". + "prenet_dropout": true, // enable/disable dropout at prenet. + + // ATTENTION + "attention_type": "original", // 'original' or 'graves' + "attention_heads": 4, // number of attention heads (only for 'graves') + "attention_norm": "softmax", // softmax or sigmoid. Suggested to use softmax for Tacotron2 and sigmoid for Tacotron. + "windowing": false, // Enables attention windowing. Used only in eval mode. + "use_forward_attn": true, // if it uses forward attention. In general, it aligns faster. + "forward_attn_mask": false, // Additional masking forcing monotonicity only in eval mode. + "transition_agent": false, // enable/disable transition agent of forward attention. + "location_attn": true, // enable_disable location sensitive attention. It is enabled for TACOTRON by default. + "bidirectional_decoder": false, // use https://arxiv.org/abs/1907.09006. Use it, if attention does not work well with your dataset. + + "double_decoder_consistency": true, + "ddc_r": 7, + + + + // STOPNET + "stopnet": true, // Train stopnet predicting the end of synthesis. + "separate_stopnet": true, // Train stopnet seperately if 'stopnet==true'. It prevents stopnet loss to influence the rest of the model. It causes a better model, but it trains SLOWER. + + // TENSORBOARD and LOGGING + "print_step": 25, // Number of steps to log traning on console. + "tb_plot_step": 100, + "print_eval": false, // If True, it prints intermediate loss values in evalulation. + "save_step": 5000, // Number of training steps expected to save traninpg stats and checkpoints. + "checkpoint": true, // If true, it saves checkpoints per "save_step" + "tb_model_param_stats": false, // true, plots param stats per layer on tensorboard. Might be memory consuming, but good for debugging. + + // DATA LOADING + //"text_cleaner": "phoneme_cleaners", + "text_cleaner": "german_phoneme_cleaners", + "enable_eos_bos_chars": false, // enable/disable beginning of sentence and end of sentence chars. + "num_loader_workers": 8, // number of training data loader processes. Don't set it too big. 4-8 are good values. + "num_val_loader_workers": 4, // number of evaluation data loader processes. + "batch_group_size": 0, //Number of batches to shuffle after bucketing. + "min_seq_len": 3, // DATASET-RELATED: minimum text length to use in training + "max_seq_len": 180, // DATASET-RELATED: maximum text length + + // PATHS + "output_path": "/tmp/tts/models/thorsten/", + + // PHONEMES + "phoneme_cache_path": "mozilla_de_phonemes", // phoneme computation is slow, therefore, it caches results in the given folder. + "use_phonemes": true, // use phonemes instead of raw characters. It is suggested for better pronounciation. + "phoneme_language": "de", // depending on your target language, pick one from https://github.com/bootphon/phonemizer#languages + + // MULTI-SPEAKER and GST + "use_speaker_embedding": false, // use speaker embedding to enable multi-speaker learning. + "style_wav_for_test": null, // path to style wav file to be used in TacotronGST inference. + "use_gst": false, // TACOTRON ONLY: use global style tokens + + // DATASETS + "datasets": // List of datasets. They all merged and they get different speaker_ids. + [ + { + "name": "ljspeech", + "path": "/tmp/tts/LJSpeech-1.1", + "meta_file_train": "metadata_train.csv", + "meta_file_val": "metadata_val.csv" + } + ] + + } \ No newline at end of file diff --git a/models/thorsten-taco2-v0.0.1/de-test-sentences.txt b/models/thorsten-taco2-v0.0.1/de-test-sentences.txt new file mode 100644 index 0000000..ff05e7b --- /dev/null +++ b/models/thorsten-taco2-v0.0.1/de-test-sentences.txt @@ -0,0 +1,7 @@ +Die aktuelle Außentemperatur beträgt sieben Grad Celsius und die Regenwahrscheinlichkeit liegt bei zwölf Prozent. +Die aktuelle Außentemperatur beträgt 7°C und die Regenwahrscheinlichkeit liegt bei 12%. +Frankfurt am Main wird auch Mainhattan genannt. +Ich bedanke mich bei euch für euren Support und eure Gedult bei der Erzeugung einer künstlichen Stimme. +Hallo, wie geht es Dir? +Was ist los! +Die wachsende Furcht vor den Folgen des grassierenden Coronavirus für die Weltwirtschaft hat den Dax am Dienstag auf das tiefste Niveau seit Oktober vergangenen Jahres gedrückt. \ No newline at end of file