1
---
2
language: ka
3
datasets:
4
- common_voice
5
tags:
6
- audio
7
- automatic-speech-recognition
8
- speech
9
- xlsr-fine-tuning-week
10
license: apache-2.0
11
widget:
12
- label: Common Voice sample 566
13
  src: https://huggingface.co/m3hrdadfi/wav2vec2-large-xlsr-georgian/resolve/main/sample566.flac
14
- label: Common Voice sample 95
15
  src: https://huggingface.co/m3hrdadfi/wav2vec2-large-xlsr-georgian/resolve/main/sample95.flac
16
model-index:
17
- name: XLSR Wav2Vec2 Georgian by Mehrdad Farahani
18
  results:
19
  - task: 
20
      name: Speech Recognition
21
      type: automatic-speech-recognition
22
    dataset:
23
      name: Common Voice ka
24
      type: common_voice
25
      args: ka
26
    metrics:
27
       - name: Test WER
28
         type: wer
29
         value: 43.86
30
        
31
---
32
33
# Wav2Vec2-Large-XLSR-53-Georgian
34
35
Fine-tuned [facebook/wav2vec2-large-xlsr-53](https://huggingface.co/facebook/wav2vec2-large-xlsr-53) in Georgian using [Common Voice](https://huggingface.co/datasets/common_voice). When using this model, make sure that your speech input is sampled at 16kHz.
36
37
## Usage
38
The model can be used directly (without a language model) as follows:
39
40
**Requirements**
41
```bash
42
# requirement packages
43
!pip install git+https://github.com/huggingface/datasets.git
44
!pip install git+https://github.com/huggingface/transformers.git
45
!pip install torchaudio
46
!pip install librosa
47
!pip install jiwer
48
```
49
50
**Normalizer**
51
```bash
52
!wget -O normalizer.py https://huggingface.co/m3hrdadfi/wav2vec2-large-xlsr-lithuanian/raw/main/normalizer.py
53
```
54
55
**Prediction**
56
```python
57
import librosa
58
import torch
59
import torchaudio
60
from transformers import Wav2Vec2ForCTC, Wav2Vec2Processor
61
from datasets import load_dataset
62
63
import numpy as np
64
import re
65
import string
66
67
import IPython.display as ipd
68
69
from normalizer import normalizer
70
71
72
def speech_file_to_array_fn(batch):
73
    speech_array, sampling_rate = torchaudio.load(batch["path"])
74
    speech_array = speech_array.squeeze().numpy()
75
    speech_array = librosa.resample(np.asarray(speech_array), sampling_rate, 16_000)
76
77
    batch["speech"] = speech_array
78
    return batch
79
80
81
def predict(batch):
82
    features = processor(batch["speech"], sampling_rate=16_000, return_tensors="pt", padding=True)
83
84
    input_values = features.input_values.to(device)
85
    attention_mask = features.attention_mask.to(device)
86
87
    with torch.no_grad():
88
        logits = model(input_values, attention_mask=attention_mask).logits 
89
        
90
    pred_ids = torch.argmax(logits, dim=-1)
91
92
    batch["predicted"] = processor.batch_decode(pred_ids)[0]
93
    return batch
94
95
96
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
97
processor = Wav2Vec2Processor.from_pretrained("m3hrdadfi/wav2vec2-large-xlsr-georgian")
98
model = Wav2Vec2ForCTC.from_pretrained("m3hrdadfi/wav2vec2-large-xlsr-georgian").to(device)
99
100
dataset = load_dataset("common_voice", "ka", split="test[:1%]")
101
dataset = dataset.map(
102
    normalizer, 
103
    fn_kwargs={"remove_extra_space": True},
104
    remove_columns=list(set(dataset.column_names) - set(['sentence', 'path']))
105
)
106
107
dataset = dataset.map(speech_file_to_array_fn)
108
result = dataset.map(predict)
109
110
max_items = np.random.randint(0, len(result), 20).tolist()
111
for i in max_items:
112
    reference, predicted =  result["sentence"][i], result["predicted"][i]
113
    print("reference:", reference)
114
    print("predicted:", predicted)
115
    print('---')
116
```
117
118
**Output:**
119
```text
120
reference: პრეზიდენტობისას ბუში საქართველოს და უკრაინის დემოკრატიულ მოძრაობების და ნატოში გაწევრიანების აქტიური მხარდამჭერი იყო
121
predicted: პრეზიდენტო ვისას ბუში საქართველოს და უკრაინის დემოკრატიულ მოძრაობების და ნატიში დაწევრიანების აქტიური მხარდამჭერი იყო
122
---
123
reference: შესაძლებელია მისი დამონება და მსახურ დემონად გადაქცევა
124
predicted: შესაძლებელია მისი დამონებათ და მსახურდემანად გადაქცევა
125
---
126
reference: ეს გამოსახულებები აღბეჭდილი იყო მოსკოვის დიდი მთავრებისა და მეფეების ბეჭდებზე
127
predicted: ეს გამოსახულებები აღბეჭდილი იყო მოსკოვის დიდი მთავრებისა და მეფეების ბეჭდებზე
128
---
129
reference: ჯოლიმ ოქროს გლობუსისა და კინომსახიობთა გილდიის ნომინაციები მიიღო
130
predicted: ჯოლი მოქროს გლობუსისა და კინამსახიობთა გილდიის ნომინაციები მიიღო
131
---
132
reference: შემდგომში საქალაქო ბიბლიოთეკა სარაიონო ბიბლიოთეკად გადაკეთდა გაიზარდა წიგნადი ფონდი
133
predicted: შემდღომში საქალაქო ბიბლიოთეკა სარაიონო ბიბლიოთეკად გადაკეთა გაიზარდა წიგნადი ფოვდი
134
---
135
reference: აბრამსი დაუკავშირდა მირანდას და ორი თვის განმავლობაში ისინი მუშაობდნენ აღნიშნული სცენის თანმხლებ მელოდიაზე
136
predicted: აბრამში და უკავშირდა მირანდეს და ორითვის განმავლობაში ისინი მუშაობდნენა აღნიშნულის ჩენის მთამხლევით მელოდიაში
137
---
138
reference: ამჟამად თემთა პალატის ოპოზიციის ლიდერია ლეიბორისტული პარტიის ლიდერი ჯერემი კორბინი
139
predicted: ამჟამად თემთა პალატის ოპოზიციის ლიდერია ლეიბურისტული პარტიის ლიდერი ჯერემი კორვინი
140
---
141
reference: ორი
142
predicted: ორი
143
---
144
reference: მას შემდეგ იგი კოლექტივის მუდმივი წევრია
145
predicted: მას შემდეგ იგი კოლექტივის ფუდ მივი წევრია
146
---
147
reference: აზერბაიჯანულ ფილოსოფიას შეიძლება მივაკუთვნოთ რუსეთის საზოგადო მოღვაწე ჰეიდარ ჯემალი
148
predicted: აზერგვოიჯანალ ფილოსოფიას შეიძლება მივაკუთვნოთ რუსეთის საზოგადო მოღვაწე ჰეიდარ ჯემალი
149
---
150
reference: ბრონქსში ჯერომის ავენიუ ჰყოფს გამჭოლ ქუჩებს აღმოსავლეთ და დასავლეთ ნაწილებად
151
predicted: რონგში დერომიწ ავენილ პოფს გამ დოლფურქებს აღმოსავლეთ და დასავლეთ ნაწილებად
152
---
153
reference: ჰაერი არის ჟანგბადის ის ძირითადი წყარო რომელსაც საჭიროებს ყველა ცოცხალი ორგანიზმი
154
predicted: არი არის ჯამუბადესის ძირითადი წყარო რომელსაც საჭიროოებს ყველა ცოცხალი ორგანიზმი
155
---
156
reference: ჯგუფი უმეტესწილად ასრულებს პოპმუსიკის ჟანრის სიმღერებს
157
predicted: ჯგუფიუმეტესწევად ასრულებს პოპნუსიკის ჟანრის სიმრერებს
158
---
159
reference: ბაბილინა მუდმივად ცდილობდა შესაძლებლობების ფარგლებში მიეღო ცოდნა და ახალი ინფორმაცია
160
predicted: ბაბილინა მუდმივა ცდილობდა შესაძლებლობების ფარგლებში მიიღო ცოტნა და ახალი ინფორმაცია
161
---
162
reference: მრევლის რწმენით რომელი ჯგუფიც გაიმარჯვებდა მთელი წლის მანძილზე სიუხვე და ბარაქა არ მოაკლდებოდა
163
predicted: მრევრის რწმენით რომელიჯგუფის გაიმარჯვებდა მთელიჭლის მანძილზა სიუყვეტაბარაქა არ მოაკლდებოდა
164
---
165
reference: ნინო ჩხეიძეს განსაკუთრებული ღვაწლი მიუძღვის ქუთაისისა და რუსთაველის თეატრების შემოქმედებით ცხოვრებაში
166
predicted: მინო ჩხეიძეს განსაკუთრებული ღოვაწლი მიოცხვის ქუთაისისა და რუსთაველის თეატრების შემოქმედებით ცხოვრებაში
167
---
168
reference: იგი სამი დიალექტისგან შედგება
169
predicted: იგი სამი დიალეთის გან შედგება
170
---
171
reference: ფორმით სირაქლემებს წააგვანან
172
predicted: ომიცი რაქლემებს ააგვანამ
173
---
174
reference: დანი დაიბადა კოლუმბუსში ოჰაიოში
175
predicted: დონი დაიბაოდა კოლუმბუსში ოხვაიოში
176
---
177
reference: მშენებლობისათვის გამოიყო ადგილი ყოფილი აეროპორტის რაიონში
178
predicted: შენებლობისათვის გამოიყო ადგილი ყოფილი აეროპორტის რაიონში
179
---
180
```
181
182
183
## Evaluation
184
185
The model can be evaluated as follows on the Georgian test data of Common Voice.
186
187
```python
188
import librosa
189
import torch
190
import torchaudio
191
from transformers import Wav2Vec2ForCTC, Wav2Vec2Processor
192
from datasets import load_dataset, load_metric
193
194
import numpy as np
195
import re
196
import string
197
198
from normalizer import normalizer
199
200
201
def speech_file_to_array_fn(batch):
202
    speech_array, sampling_rate = torchaudio.load(batch["path"])
203
    speech_array = speech_array.squeeze().numpy()
204
    speech_array = librosa.resample(np.asarray(speech_array), sampling_rate, 16_000)
205
206
    batch["speech"] = speech_array
207
    return batch
208
209
210
def predict(batch):
211
    features = processor(batch["speech"], sampling_rate=16_000, return_tensors="pt", padding=True)
212
213
    input_values = features.input_values.to(device)
214
    attention_mask = features.attention_mask.to(device)
215
216
    with torch.no_grad():
217
        logits = model(input_values, attention_mask=attention_mask).logits 
218
        
219
    pred_ids = torch.argmax(logits, dim=-1)
220
221
    batch["predicted"] = processor.batch_decode(pred_ids)[0]
222
    return batch
223
224
225
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
226
processor = Wav2Vec2Processor.from_pretrained("m3hrdadfi/wav2vec2-large-xlsr-georgian")
227
model = Wav2Vec2ForCTC.from_pretrained("m3hrdadfi/wav2vec2-large-xlsr-georgian").to(device)
228
229
dataset = load_dataset("common_voice", "ka", split="test")
230
dataset = dataset.map(
231
    normalizer, 
232
    fn_kwargs={"remove_extra_space": True},
233
    remove_columns=list(set(dataset.column_names) - set(['sentence', 'path']))
234
)
235
236
dataset = dataset.map(speech_file_to_array_fn)
237
result = dataset.map(predict)
238
239
wer = load_metric("wer")
240
241
print("WER: {:.2f}".format(100 * wer.compute(predictions=result["predicted"], references=result["sentence"])))
242
```
243
244
245
**Test Result**: 
246
- WER: 43.86%
247
248
249
## Training & Report
250
The Common Voice `train`, `validation` datasets were used for training.
251
252
You can see the training states [here](https://wandb.ai/m3hrdadfi/wav2vec2_large_xlsr_ka/reports/Fine-Tuning-for-Wav2Vec2-Large-XLSR-53-Georgian--Vmlldzo1OTQyMzk?accessToken=ytf7jseje66a3byuheh68o6a7215thjviscv5k2ewl5hgq9yqr50yxbko0bnf1d3)
253
254
The script used for training can be found [here](https://colab.research.google.com/github/m3hrdadfi/notebooks/blob/main/Fine_Tune_XLSR_Wav2Vec2_on_Georgian_ASR_with_%F0%9F%A4%97_Transformers_ipynb.ipynb)
255
256
## Questions?
257
Post a Github issue on the [Wav2Vec](https://github.com/m3hrdadfi/wav2vec) repo.