pytorch wav2vec2 automatic-speech-recognition km transformers openslr robust-speech-event generated_from_trainer hf-asr-leaderboard license:apache-2.0 model-index
---
language:
- km
license: apache-2.0
tags:
- automatic-speech-recognition
- openslr
- robust-speech-event
- km
- generated_from_trainer
- hf-asr-leaderboard
model-index:
- name: xls-r-300m-km
  results:
  - task:
      name: Speech Recognition
      type: automatic-speech-recognition
    dataset:
      name: OpenSLR km
      type: openslr
      args: km
    metrics:
    - name: Test WER
      type: wer
      value: 25.7
    - name: Test CER
      type: cer
      value: 7.03
  - task:
      name: Automatic Speech Recognition
      type: automatic-speech-recognition
    dataset:
      name: Robust Speech Event - Dev Data
      type: speech-recognition-community-v2/dev_data
      args: km
    metrics:
    - name: Test WER
      type: wer
      value: 25.7
    - name: Test CER
      type: cer
      value: 7.03
---

# 

This model is a fine-tuned version of [facebook/wav2vec2-xls-r-300m](https://huggingface.co/facebook/wav2vec2-xls-r-300m) on the openslr dataset.
It achieves the following results on the evaluation set:
- Loss: 0.3281
- Wer: 0.3462

# Evaluation results on OpenSLR "test" (self-split 10%) (Running ./eval.py):
- WER: 0.3216977389924633
- CER: 0.08653361193169537

# Evaluation results with language model on OpenSLR "test" (self-split 10%) (Running ./eval.py):
- WER: 0.257040856802856
- CER: 0.07025001801282513

## Installation
Install the following libraries on top of HuggingFace Transformers for the supports of language model.
```
pip install pyctcdecode
pip install https://github.com/kpu/kenlm/archive/master.zip
```

## Usage 

**Approach 1:** Using HuggingFace's pipeline, this will cover everything end-to-end from raw audio input to text output.
```python
from transformers import pipeline

# Load the model
pipe = pipeline(model="vitouphy/wav2vec2-xls-r-300m-khmer")

# Process raw audio
output = pipe("sound_file.wav", chunk_length_s=10, stride_length_s=(4, 2))
```

**Approach 2:** More custom way to predict phonemes.
```python
from transformers import Wav2Vec2Processor, Wav2Vec2ForCTC 
import librosa
import torch

# load model and processor
processor = Wav2Vec2Processor.from_pretrained("vitouphy/wav2vec2-xls-r-300m-khmer")
model = Wav2Vec2ForCTC.from_pretrained("vitouphy/wav2vec2-xls-r-300m-khmer")

# Read and process the input
speech_array, sampling_rate = librosa.load("sound_file.wav", sr=16_000)
inputs = processor(speech_array, sampling_rate=16_000, return_tensors="pt", padding=True)

with torch.no_grad():
    logits = model(inputs.input_values, attention_mask=inputs.attention_mask).logits

predicted_ids = torch.argmax(logits, axis=-1)      
predicted_sentences = processor.batch_decode(predicted_ids)
print(predicted_sentences)
```

## Intended uses & limitations

The data used for this model is only around 4 hours of recordings. 
- We split into 80/10/10. Hence, the training hour is 3.2 hours, which is very very small.
- Yet, its performance is not too bad. Quite interesting for such small dataset, actually. You can try it out.
- Its limitation is:
  - Rare characters, e.g. ឬស្សី ឪឡឹក 
  - Speech needs to be clear and articulate.
- More data to cover more vocabulary and character may help improve this system.

## Training procedure

### Training hyperparameters

The following hyperparameters were used during training:
- learning_rate: 5e-05
- train_batch_size: 8
- eval_batch_size: 8
- seed: 42
- gradient_accumulation_steps: 4
- 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: 100
- mixed_precision_training: Native AMP

### Training results

| Training Loss | Epoch | Step | Validation Loss | Wer    |
|:-------------:|:-----:|:----:|:---------------:|:------:|
| 5.0795        | 5.47  | 400  | 4.4121          | 1.0    |
| 3.5658        | 10.95 | 800  | 3.5203          | 1.0    |
| 3.3689        | 16.43 | 1200 | 2.8984          | 0.9996 |
| 2.01          | 21.91 | 1600 | 1.0041          | 0.7288 |
| 1.6783        | 27.39 | 2000 | 0.6941          | 0.5989 |
| 1.527         | 32.87 | 2400 | 0.5599          | 0.5282 |
| 1.4278        | 38.35 | 2800 | 0.4827          | 0.4806 |
| 1.3458        | 43.83 | 3200 | 0.4429          | 0.4532 |
| 1.2893        | 49.31 | 3600 | 0.4156          | 0.4330 |
| 1.2441        | 54.79 | 4000 | 0.4020          | 0.4040 |
| 1.188         | 60.27 | 4400 | 0.3777          | 0.3866 |
| 1.1628        | 65.75 | 4800 | 0.3607          | 0.3858 |
| 1.1324        | 71.23 | 5200 | 0.3534          | 0.3604 |
| 1.0969        | 76.71 | 5600 | 0.3428          | 0.3624 |
| 1.0897        | 82.19 | 6000 | 0.3387          | 0.3567 |
| 1.0625        | 87.66 | 6400 | 0.3339          | 0.3499 |
| 1.0601        | 93.15 | 6800 | 0.3288          | 0.3446 |
| 1.0474        | 98.62 | 7200 | 0.3281          | 0.3462 |


### Framework versions

- Transformers 4.17.0.dev0
- Pytorch 1.10.2+cu102
- Datasets 1.18.2.dev0
- Tokenizers 0.11.0
