File size: 2,763 Bytes
0d6ed0f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
# Wav2Vec2 Acoustic Model fine-tuned on LibriSpeech

Original model can be found under https://github.com/pytorch/fairseq/tree/master/examples/wav2vec#wav2vec-20.

Paper: https://arxiv.org/abs/2006.11477

## Usage

Make sure you are working on [this branch](https://github.com/huggingface/transformers/tree/add_wav2vec) (which will be merged to master soon hopefully) of transformers:

```bash
$ git checkout add_wav2vec
```

In the following, we'll show a simple example of how the model can be used for automatic speech recognition.

First, let's load the model

```python
from transformers import AutoModelForMaskedLM

model = AutoModelForMaskedLM.from_pretrained("patrickvonplaten/wav2vec2-large-960h")

```

Next, let's load a dummy librispeech dataset

```python
from datasets import load_dataset
import soundfile as sf

libri_speech_dummy = load_dataset("patrickvonplaten/librispeech_asr_dummy", "clean", split="validation")

def map_to_array(batch):
    speech_array, _ = sf.read(batch["file"])
    batch["speech"] = speech_array
    return batch

libri_speech_dummy = libri_speech_dummy.map(map_to_array, remove_columns=["file"])

# check out dataset
print(libri_speech_dummy)

input_speech_16kHz = libri_speech_dummy[2]["speech"]
expected_trans = libri_speech_dummy[2]["text"]
```

Cool, now we can run an inference pass to retrieve the logits:

```python
import torch
logits = model(torch.tensor(input_speech_16kHz)[None, :])

# use highest probability logits
pred_ids = torch.argmax(logits[0], axis=-1)
```

Finally, let's decode the prediction. 
Let's create a simple CTC-Decoder:

```python
  import numpy as np
  from itertools import groupby

  class Decoder:
      def __init__(self, json_dict):
          self.dict = json_dict
          self.look_up = np.asarray(list(self.dict.keys()))
  
      def decode(self, ids):
          converted_tokens = self.look_up[ids]
          fused_tokens = [tok[0] for tok in groupby(converted_tokens)]
          output = ' '.join(''.join(''.join(fused_tokens).split("<s>")).split("|"))
          return output
```

and instantiate with the corresponding dict.

```python
# hard-coded json dict taken from: https://dl.fbaipublicfiles.com/fairseq/wav2vec/dict.ltr.txt
json_dict = {"<s>": 0, "<pad>": 1, "</s>": 2, "<unk>": 3, "|": 4, "E": 5, "T": 6, "A": 7, "O": 8, "N": 9, "I": 10, "H": 11, "S": 12, "R": 13, "D": 14, "L": 15, "U": 16, "M": 17, "W": 18, "C": 19, "F": 20, "G": 21, "Y": 22, "P": 23, "B": 24, "V": 25, "K": 26, "'": 27, "X": 28, "J": 29, "Q": 30, "Z": 31}

decoder = Decoder(json_dict=json_dict)
```

and decode the result

```python   
pred_trans = decoder.decode(pred_ids)
   
print("Prediction:\n", pred_trans)
print("\n" + 50 * "=" + "\n")
print("Correct result:\n", expected_trans)
```

🎉