Views
No views yet
1import re
2import torch
3import torchaudio
4from datasets import load_dataset, load_metric
5from transformers import (
6 Wav2Vec2ForCTC,
7 Wav2Vec2Processor,
8)
9
10
11
12model_name = "Ilyes/wav2vec2-large-xlsr-53-french_punctuation"
13
14
15model = Wav2Vec2ForCTC.from_pretrained(model_name).to('cuda')
16processor = Wav2Vec2Processor.from_pretrained(model_name)
17
18
19ds = load_dataset("common_voice", "fr", split="test")
20
21
22chars_to_ignore_regex = '[\;\:\"\“\%\‘\”\�\‘\’\’\’\‘\…\·\ǃ\«\‹\»\›“\”\\ʿ\ʾ\„\∞\\|\;\:\*\—\–\─\―\_\/\:\ː\;\=\«\»\→]'
23def normalize_text(text):
24 text = text.lower().strip()
25 text = re.sub('œ', 'oe', text)
26 text = re.sub('æ', 'ae', text)
27 text = re.sub("’|´|′|ʼ|‘|ʻ|`", "'", text)
28 text = re.sub("'+ ", " ", text)
29 text = re.sub(" '+", " ", text)
30 text = re.sub("'$", " ", text)
31 text = re.sub("' ", " ", text)
32 text = re.sub("−|‐", "-", text)
33 text = re.sub(" -", "", text)
34 text = re.sub("- ", "", text)
35 text = re.sub(chars_to_ignore_regex, '', text)
36 return text
37
38
39
40def map_to_array(batch):
41 speech, _ = torchaudio.load(batch["path"])
42 batch["speech"] = resampler.forward(speech.squeeze(0)).numpy()
43 batch["sampling_rate"] = resampler.new_freq
44 batch["sentence"] = normalize_text(batch["sentence"])
45 return batch
46
47ds = ds.map(map_to_array)
48
49resampler = torchaudio.transforms.Resample(48_000, 16_000)
50def map_to_pred(batch):
51 features = processor(batch["speech"], sampling_rate=batch["sampling_rate"][0], padding=True, return_tensors="pt")
52 input_values = features.input_values.to(device)
53 attention_mask = features.attention_mask.to(device)
54 with torch.no_grad():
55 logits = model(input_values, attention_mask=attention_mask).logits
56 pred_ids = torch.argmax(logits, dim=-1)
57 batch["predicted"] = processor.batch_decode(pred_ids)
58 batch["target"] = batch["sentence"]
59 # remove duplicates
60 batch["target"] = re.sub('\.+', '.', batch["target"])
61 batch["target"] = re.sub('\?+', '?', batch["target"])
62 batch["target"] = re.sub('!+', '!', batch["target"])
63 batch["target"] = re.sub(',+', ',', batch["target"])
64 return batch
65
66result = ds.map(map_to_pred, batched=True, batch_size=16, remove_columns=list(ds.features.keys()))
67wer = load_metric("wer")
68print(wer.compute(predictions=result["predicted"], references=result["target"]))| Reference | Prediction |
|---|---|
| il vécut à new york et y enseigna une grande partie de sa vie. | il a vécu à new york et y enseigna une grande partie de sa vie. |
| au classement par nations, l'allemagne est la tenante du titre. | au classement der nation l'allemagne est la tenante du titre. |
| voici un petit calcul pour fixer les idées. | voici un petit calcul pour fixer les idées. |
| oh! tu dois être beau avec | oh! tu dois être beau avec. |
| babochet vous le voulez? | baboche, vous le voulez? |
| la commission est, par conséquent, défavorable à cet amendement. | la commission est, par conséquent, défavorable à cet amendement. |