1
---
2
language: pt
3
datasets:
4
- common_voice 
5
- mls
6
- cetuc
7
- lapsbm
8
- voxforge
9
metrics:
10
- wer
11
tags:
12
- audio
13
- speech
14
- wav2vec2
15
- pt
16
- portuguese-speech-corpus
17
- automatic-speech-recognition
18
- speech
19
- PyTorch
20
license: apache-2.0
21
model-index:
22
- name: Lucas Gris XLSR Wav2Vec2 Large 53 Brazilian Portuguese 
23
  results:
24
  - task: 
25
      name: Speech Recognition
26
      type: automatic-speech-recognition
27
    metrics:
28
       - name: Test WER
29
         type: wer
30
         value: 12.905054857823264%
31
---
32
33
# Wav2vec 2.0 With Open Brazilian Portuguese Datasets
34
35
This a the demonstration of a fine-tuned Wav2vec model for Brazilian Portuguese using the following datasets:
36
37
- [CETUC](http://www02.smt.ufrj.br/~igor.quintanilha/alcaim.tar.gz): contains approximately 145 hours of Brazilian Portuguese speech distributed among 50 male and 50 female speakers, each pronouncing approximately 1,000 phonetically balanced sentences selected from the [CETEN-Folha](https://www.linguateca.pt/cetenfolha/) corpus.
38
- [Multilingual Librispeech (MLS)](https://arxiv.org/abs/2012.03411): a massive dataset available in many languages. The MLS is based on audiobook recordings in public domain like [LibriVox](https://librivox.org/). The dataset contains a total of 6k hours of transcribed data in many languages. The set in Portuguese [used in this work](http://www.openslr.org/94/) (mostly Brazilian variant) has approximately 284 hours of speech, obtained from 55 audiobooks read by 62 speakers.
39
- [VoxForge](http://www.voxforge.org/): is a project with the goal to build open datasets for acoustic models. The corpus contains approximately 100 speakers and 4,130 utterances of Brazilian Portuguese, with sample rates varying from 16kHz to 44.1kHz.
40
- [Common Voice 6.1](https://commonvoice.mozilla.org/pt) (_only train_): is a project proposed by Mozilla Foundation with the goal to create a wide open dataset in different languages to train ASR models. In this project, volunteers donate and validate speech using the [oficial site](https://commonvoice.mozilla.org/pt). The set in Portuguese (mostly Brazilian variant) used in this work is the 6.1 version (pt_63h_2020-12-11) that contains about 50 validated hours and 1,120 unique speakers.
41
- [Lapsbm](https://github.com/falabrasil/gitlab-resources): "Falabrasil - UFPA" is a dataset used by the Fala Brasil group to benchmark ASR systems in Brazilian Portuguese. Contains 35 speakers (10 females), each one pronouncing 20 unique sentences, totalling  700 utterances in Brazilian Portuguese. The audios were recorded in 22.05 kHz without environment control.
42
43
These datasets were combined to build a larger Brazilian Portuguese dataset. All data was used for training except Common Voice dev/test sets, that were used for validation/test respectively.
44
45
The original model was fine-tuned using [fairseq](https://github.com/pytorch/fairseq). This notebook uses a converted version of the original one. The link to the original fairseq model is available [here](https://drive.google.com/drive/folders/1XTKIUB4kp3oYOavwH97wq8IPFsxP5sNz?usp=sharing).
46
47
This model was trained in 80k updates.
48
49
#### Datasets in number of instances and number of frames
50
51
The following image shows the overall distribution of the dataset:
52
53
![datasets](https://drive.google.com/uc?export=view&id=1DF2_PehB2pZlEJLcBA7yeZQ9EAuLGh_r)
54
55
#### Transcription examples
56
57
| Text                                                                                                       | Transcription                                                                                                |
58
|------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------|
59
| É comum os usuários confundirem software livre com software livre                                          | É comum os __usuares__ __confunder em__ __softwerlivr__ com __softwerlivre__                                          |
60
| Ele fez tanto ghostwriting que ele começa a se sentir como um fantasma também                              | Ele fez tanto __golstraitn__ que ele __começou__ a se sentir como um fantasma também                           |
61
| Arnold apresentou um gráfico mostrando quantas cegonhas ele havia contado nos últimos dez anos             | Arnold apresentou um gráfico mostrando quantas __segonhas__ ele havia contado nos últimos dez anos            |
62
| Mais cedo ou mais tarde eles descobrirão como ler esses hieróglifos                                        | Mais __sedo__ ou mais tarde eles descobriram como __de__ esses __ierogrôficos__                                 |
63
| Viver juntos compartilhar objetivos e ter um bom relacionamento                                            | __E ver__ juntos __signafica__ viver juntos ou __fartlhar__ objetivos ter um bom __relacionamentoo__             |
64
| Da mesma forma uma patente pode impedir que concorrentes desenvolvam produtos similares                    | Da mesma forma uma patente pode impedir que concorrentes __desenvolva__ produtos similares                    |
65
| Duas mulheres e uma menina levantam com troféus                                                            | Duas mulheres e uma menina levantam com __trofés__                                                            |
66
| Esse acrobata de circo deve ter um sistema vestibular bem treinado pensou o espectador                     | Esse acrobata de __cirko__ deve ter um sistema vestibular __bemtreinado__ pensou o espectador                  |
67
| Durante a exposição o tribunal pode fazer quaisquer perguntas ou esclarecimentos que considere apropriados | Durante a exposição o tribunal pode fazer quaisquer perguntas ou esclarecimentos que considere __apropriado__ |
68
69
## Imports and dependencies
70
71
72
```python
73
%%capture
74
!pip install datasets
75
!pip install jiwer
76
!pip install torchaudio
77
!pip install transformers
78
!pip install soundfile
79
```
80
81
82
```python
83
import torchaudio
84
from datasets import load_dataset, load_metric
85
from transformers import (
86
    Wav2Vec2ForCTC,
87
    Wav2Vec2Processor,
88
)
89
import torch
90
import re
91
import sys
92
```
93
94
## Preparation
95
96
97
```python
98
chars_to_ignore_regex = '[\,\?\.\!\;\:\"]'  # noqa: W605
99
wer = load_metric("wer")
100
device = "cuda"
101
```
102
103
```python
104
model_name = 'lgris/wav2vec2-large-xlsr-open-brazilian-portuguese'
105
model = Wav2Vec2ForCTC.from_pretrained(model_name).to(device)
106
processor = Wav2Vec2Processor.from_pretrained(model_name)
107
```
108
109
```python
110
def map_to_pred(batch):
111
    features = processor(batch["speech"], sampling_rate=batch["sampling_rate"][0], padding=True, return_tensors="pt")
112
    input_values = features.input_values.to(device)
113
    attention_mask = features.attention_mask.to(device)
114
    with torch.no_grad():
115
        logits = model(input_values, attention_mask=attention_mask).logits
116
    pred_ids = torch.argmax(logits, dim=-1)
117
    batch["predicted"] = processor.batch_decode(pred_ids)
118
    batch["predicted"] = [pred.lower() for pred in batch["predicted"]]
119
    batch["target"] = batch["sentence"]
120
    return batch
121
```
122
123
## Tests
124
125
### Test against Common Voice (In-domain)
126
127
128
```python
129
dataset = load_dataset("common_voice", "pt", split="test", data_dir="./cv-corpus-6.1-2020-12-11")
130
131
resampler = torchaudio.transforms.Resample(orig_freq=48_000, new_freq=16_000)
132
133
def map_to_array(batch):
134
    speech, _ = torchaudio.load(batch["path"])
135
    batch["speech"] = resampler.forward(speech.squeeze(0)).numpy()
136
    batch["sampling_rate"] = resampler.new_freq
137
    batch["sentence"] = re.sub(chars_to_ignore_regex, '', batch["sentence"]).lower().replace("’", "'")
138
    return batch
139
```
140
141
```python
142
ds = dataset.map(map_to_array)
143
result = ds.map(map_to_pred, batched=True, batch_size=1, remove_columns=list(ds.features.keys()))
144
print(wer.compute(predictions=result["predicted"], references=result["target"]))
145
for pred, target in zip(result["predicted"][:10], result["target"][:10]):
146
    print(pred, "|", target) 
147
```
148
149
    0.12905054857823264
150
    nem o varanin os altros influmindo os de teterno um bombederster | nem o radar nem os outros instrumentos detectaram o bombardeiro stealth
151
    pedir dinheiro é emprestado das pessoas do aldeia | pedir dinheiro emprestado às pessoas da aldeia
152
    oito | oito
153
    teno calcos | trancá-los
154
    realizaram a investigação para resolver o problema | realizar uma investigação para resolver o problema
155
    iotube ainda é a melhor plataforma de vídeos | o youtube ainda é a melhor plataforma de vídeos
156
    menina e menino beijando nas sombras | menina e menino beijando nas sombras
157
    eu sou o senhor | eu sou o senhor
158
    duas metcas sentam-se para baixo randes jornais | duas mulheres que sentam-se para baixo lendo jornais
159
    eu originalmente esperava | eu originalmente esperava
160
161
162
**Result**: 12.90%
163
164
### Test against [TEDx](http://www.openslr.org/100/) (Out-of-domain)
165
166
167
```python
168
!gdown --id 1HJEnvthaGYwcV_whHEywgH2daIN4bQna
169
!tar -xf tedx.tar.gz
170
```
171
172
```python
173
dataset = load_dataset('csv', data_files={'test': 'tedx/test.csv'})['test']
174
175
def map_to_array(batch):
176
    speech, _ = torchaudio.load(batch["path"])
177
    batch["speech"] = speech.squeeze(0).numpy()
178
    batch["sampling_rate"] = resampler.new_freq
179
    batch["sentence"] = re.sub(chars_to_ignore_regex, '', batch["sentence"]).lower().replace("’", "'")
180
    return batch
181
```
182
183
```python
184
ds = dataset.map(map_to_array)
185
result = ds.map(map_to_pred, batched=True, batch_size=1, remove_columns=list(ds.features.keys()))
186
print(wer.compute(predictions=result["predicted"], references=result["target"]))
187
for pred, target in zip(result["predicted"][:10], result["target"][:10]):
188
    print(pred, "|", target) 
189
```
190
191
    0.35215851987208774
192
    com isso a gente vê que essa rede de pactuação de de deparcerias nos remete a um raciocínio lógico que ao que a gente crê que é a prevenção | com isso a gente vê que essa rede de pactuação de parcerias nos remete a um raciocínio lógico que é o que a gente crê que é a prevenção
193
    ente vai para o resultado | e aí a gente vai pro resultado
194
    curiosidade hé o que eu descobri desde que comecei a fazer pesquisa lá no ensino médio | e a curiosidade é algo que descobri desde que comecei a fazer pesquisa lá no ensino médio
195
    val des quemesho | há vários caminhos
196
    que é uma opcissão por comer soldado | que é uma obsessão por comer saudável
197
    isso é tão é forte algoltão universal que existem dados que mostram que setenta e cinco por cento das reuniões são dominadas pela voz masculina | e isso é tão forte é algo tão universal que existem dados que mostram que  das reuniões são dominadas pela voz masculina
198
    não era exatamente isso não estávamos deveto | e não era exatamente isso que nós estávamos a ver
199
    durante meci do médio ofiz pesquisa estudei numa escola que chamam a fundação liberate ficava relativamente próximo daqui | durante o ensino médio eu fiz pesquisa estudei numa escola que se chama fundação liberato que fica relativamente próxima daqui
200
    oito anos atrás eu fui apresentado por uma doença que até então eu não conhecia e que é bem provável que a maior parte de nós todos aqui não conheçamos | oito anos atrás fui apresentado para uma doença que até então eu não conhecia e que é bem provável que a maior parte de nós todos aqui não conheçamos
201
    o terceiro é o museu do ripiopeco | o terceiro é o museu do hip hop
202
203
204
**Result**: 35.21%