--- language: en license: apache-2.0 tags: - phoneme-recognition - generated_from_trainer datasets: - w11wo/ljspeech_phonemes base_model: Wav2Vec2-Base inference: parameters: function_to_apply: none model-index: - name: Wav2Vec2 LJSpeech Gruut results: - task: type: automatic-speech-recognition name: Automatic Speech Recognition dataset: name: LJSpeech type: ljspeech_phonemes metrics: - type: per value: 0.0099 name: Test PER (w/o stress) - type: cer value: 0.0058 name: Test CER (w/o stress) --- # Wav2Vec2 LJSpeech Gruut Wav2Vec2 LJSpeech Gruut is an automatic speech recognition model based on the [wav2vec 2.0](https://arxiv.org/abs/2006.11477) architecture. This model is a fine-tuned version of [Wav2Vec2-Base](https://huggingface.co/facebook/wav2vec2-base) on the [LJSpech Phonemes](https://huggingface.co/datasets/w11wo/ljspeech_phonemes) dataset. Instead of being trained to predict sequences of words, this model was trained to predict sequence of phonemes, e.g. `["h", "ɛ", "l", "ˈoʊ", "w", "ˈɚ", "l", "d"]`. Therefore, the model's [vocabulary](https://huggingface.co/bookbot/wav2vec2-ljspeech-gruut/blob/main/vocab.json) contains the different IPA phonemes found in [gruut](https://github.com/rhasspy/gruut). This model was trained using HuggingFace's PyTorch framework. All training was done on a Google Cloud Engine VM with a Tesla A100 GPU. All necessary scripts used for training could be found in the [Files and versions](https://huggingface.co/bookbot/wav2vec2-ljspeech-gruut/tree/main) tab, as well as the [Training metrics](https://huggingface.co/bookbot/wav2vec2-ljspeech-gruut/tensorboard) logged via Tensorboard. ## Model | Model | #params | Arch. | Training/Validation data (text) | | ------------------------- | ------- | ----------- | ------------------------------- | | `wav2vec2-ljspeech-gruut` | 94M | wav2vec 2.0 | `LJSpech Phonemes` Dataset | ## Evaluation Results The model achieves the following results on evaluation: | Dataset | PER (w/o stress) | CER (w/o stress) | | ---------------------------- | :--------------: | :--------------: | | `LJSpech Phonemes` Test Data | 0.99% | 0.58% | ## Usage ```py from transformers import AutoProcessor, AutoModelForCTC, Wav2Vec2Processor import librosa import torch from itertools import groupby from datasets import load_dataset def decode_phonemes( ids: torch.Tensor, processor: Wav2Vec2Processor, ignore_stress: bool = False ) -> str: """CTC-like decoding. First removes consecutive duplicates, then removes special tokens.""" # removes consecutive duplicates ids = [id_ for id_, _ in groupby(ids)] special_token_ids = processor.tokenizer.all_special_ids + [ processor.tokenizer.word_delimiter_token_id ] # converts id to token, skipping special tokens phonemes = [processor.decode(id_) for id_ in ids if id_ not in special_token_ids] # joins phonemes prediction = " ".join(phonemes) # whether to ignore IPA stress marks if ignore_stress == True: prediction = prediction.replace("ˈ", "").replace("ˌ", "") return prediction checkpoint = "bookbot/wav2vec2-ljspeech-gruut" model = AutoModelForCTC.from_pretrained(checkpoint) processor = AutoProcessor.from_pretrained(checkpoint) sr = processor.feature_extractor.sampling_rate # load dummy dataset and read soundfiles ds = load_dataset("patrickvonplaten/librispeech_asr_dummy", "clean", split="validation") audio_array = ds[0]["audio"]["array"] # or, read a single audio file # audio_array, _ = librosa.load("myaudio.wav", sr=sr) inputs = processor(audio_array, return_tensors="pt", padding=True) with torch.no_grad(): logits = model(inputs["input_values"]).logits predicted_ids = torch.argmax(logits, dim=-1) prediction = decode_phonemes(predicted_ids[0], processor, ignore_stress=True) # => should give 'b ɪ k ʌ z j u ɚ z s l i p ɪ ŋ ɪ n s t ɛ d ə v k ɔ ŋ k ɚ ɪ ŋ ð ə l ʌ v l i ɹ z p ɹ ɪ n s ə s h æ z b ɪ k ʌ m ə v f ɪ t ə l w ɪ θ n b oʊ p ɹ ə ʃ æ ɡ i s ɪ t s ð ɛ ɹ ə k u ɪ ŋ d ʌ v' ``` ## Training procedure ### Training hyperparameters The following hyperparameters were used during training: - `learning_rate`: 0.0001 - `train_batch_size`: 16 - `eval_batch_size`: 8 - `seed`: 42 - `gradient_accumulation_steps`: 2 - `total_train_batch_size`: 32 - `optimizer`: Adam with `betas=(0.9,0.999)` and `epsilon=1e-08` - `lr_scheduler_type`: linear - `lr_scheduler_warmup_steps`: 1000 - `num_epochs`: 30.0 - `mixed_precision_training`: Native AMP ### Training results | Training Loss | Epoch | Step | Validation Loss | Wer | Cer | | :-----------: | :---: | :---: | :-------------: | :----: | :----: | | No log | 1.0 | 348 | 2.2818 | 1.0 | 1.0 | | 2.6692 | 2.0 | 696 | 0.2045 | 0.0527 | 0.0299 | | 0.2225 | 3.0 | 1044 | 0.1162 | 0.0319 | 0.0189 | | 0.2225 | 4.0 | 1392 | 0.0927 | 0.0235 | 0.0147 | | 0.0868 | 5.0 | 1740 | 0.0797 | 0.0218 | 0.0143 | | 0.0598 | 6.0 | 2088 | 0.0715 | 0.0197 | 0.0128 | | 0.0598 | 7.0 | 2436 | 0.0652 | 0.0160 | 0.0103 | | 0.0447 | 8.0 | 2784 | 0.0571 | 0.0152 | 0.0095 | | 0.0368 | 9.0 | 3132 | 0.0608 | 0.0163 | 0.0112 | | 0.0368 | 10.0 | 3480 | 0.0586 | 0.0137 | 0.0083 | | 0.0303 | 11.0 | 3828 | 0.0641 | 0.0141 | 0.0085 | | 0.0273 | 12.0 | 4176 | 0.0656 | 0.0131 | 0.0079 | | 0.0232 | 13.0 | 4524 | 0.0690 | 0.0133 | 0.0082 | | 0.0232 | 14.0 | 4872 | 0.0598 | 0.0128 | 0.0079 | | 0.0189 | 15.0 | 5220 | 0.0671 | 0.0121 | 0.0074 | | 0.017 | 16.0 | 5568 | 0.0654 | 0.0114 | 0.0069 | | 0.017 | 17.0 | 5916 | 0.0751 | 0.0118 | 0.0073 | | 0.0146 | 18.0 | 6264 | 0.0653 | 0.0112 | 0.0068 | | 0.0127 | 19.0 | 6612 | 0.0682 | 0.0112 | 0.0069 | | 0.0127 | 20.0 | 6960 | 0.0678 | 0.0114 | 0.0068 | | 0.0114 | 21.0 | 7308 | 0.0656 | 0.0111 | 0.0066 | | 0.0101 | 22.0 | 7656 | 0.0669 | 0.0109 | 0.0066 | | 0.0092 | 23.0 | 8004 | 0.0677 | 0.0108 | 0.0065 | | 0.0092 | 24.0 | 8352 | 0.0653 | 0.0104 | 0.0063 | | 0.0088 | 25.0 | 8700 | 0.0673 | 0.0102 | 0.0063 | | 0.0074 | 26.0 | 9048 | 0.0669 | 0.0105 | 0.0064 | | 0.0074 | 27.0 | 9396 | 0.0707 | 0.0101 | 0.0061 | | 0.0066 | 28.0 | 9744 | 0.0673 | 0.0100 | 0.0060 | | 0.0058 | 29.0 | 10092 | 0.0689 | 0.0100 | 0.0059 | | 0.0058 | 30.0 | 10440 | 0.0683 | 0.0099 | 0.0058 | ## Disclaimer Do consider the biases which came from pre-training datasets that may be carried over into the results of this model. ## Authors Wav2Vec2 LJSpeech Gruut was trained and evaluated by [Wilson Wongso](https://w11wo.github.io/). All computation and development are done on Google Cloud. ## Framework versions - Transformers 4.26.0.dev0 - Pytorch 1.10.0 - Datasets 2.7.1 - Tokenizers 0.13.2 - Gruut 2.3.4