Views
No views yet
1# requirement packages
2!pip install git+https://github.com/huggingface/datasets.git
3!pip install git+https://github.com/huggingface/transformers.git
4!pip install torchaudio
5!pip install librosa
6!pip install jiwer1import librosa
2import torch
3import torchaudio
4from transformers import Wav2Vec2ForCTC, Wav2Vec2Processor
5from datasets import load_dataset
6
7import numpy as np
8import re
9import string
10
11import IPython.display as ipd
12
13chars_to_ignore = [
14 ",", "?", ".", "!", "-", ";", ":", '""', "%", "'", '"', "�",
15 "#", "!", "?", "«", "»", "(", ")", "؛", ",", "?", ".", "!", "-", ";", ":", '"',
16 "“", "%", "‘", "�", "–", "…", "_", "”", '“', '„'
17]
18chars_to_mapping = {
19"\u200c": " ", "\u200d": " ", "\u200e": " ", "\u200f": " ", "\ufeff": " ",
20}
21
22def multiple_replace(text, chars_to_mapping):
23 pattern = "|".join(map(re.escape, chars_to_mapping.keys()))
24 return re.sub(pattern, lambda m: chars_to_mapping[m.group()], str(text))
25
26def remove_special_characters(text, chars_to_ignore_regex):
27 text = re.sub(chars_to_ignore_regex, '', text).lower() + " "
28 return text
29
30def normalizer(batch, chars_to_ignore, chars_to_mapping):
31 chars_to_ignore_regex = f"""[{"".join(chars_to_ignore)}]"""
32 text = batch["sentence"].lower().strip()
33
34 text = text.replace("\u0307", " ").strip()
35 text = multiple_replace(text, chars_to_mapping)
36 text = remove_special_characters(text, chars_to_ignore_regex)
37
38 batch["sentence"] = text
39 return batch
40
41
42def speech_file_to_array_fn(batch):
43 speech_array, sampling_rate = torchaudio.load(batch["path"])
44 speech_array = speech_array.squeeze().numpy()
45 speech_array = librosa.resample(np.asarray(speech_array), sampling_rate, 16_000)
46
47 batch["speech"] = speech_array
48 return batch
49
50
51def predict(batch):
52 features = processor(batch["speech"], sampling_rate=16_000, return_tensors="pt", padding=True)
53
54 input_values = features.input_values.to(device)
55 attention_mask = features.attention_mask.to(device)
56
57 with torch.no_grad():
58 logits = model(input_values, attention_mask=attention_mask).logits
59
60 pred_ids = torch.argmax(logits, dim=-1)
61
62 batch["predicted"] = processor.batch_decode(pred_ids)[0]
63 return batch
64
65
66device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
67processor = Wav2Vec2Processor.from_pretrained("m3hrdadfi/wav2vec2-large-xlsr-turkish")
68model = Wav2Vec2ForCTC.from_pretrained("m3hrdadfi/wav2vec2-large-xlsr-turkish").to(device)
69
70dataset = load_dataset("common_voice", "et", split="test[:1%]")
71dataset = dataset.map(
72 normalizer,
73 fn_kwargs={"chars_to_ignore": chars_to_ignore, "chars_to_mapping": chars_to_mapping},
74 remove_columns=list(set(dataset.column_names) - set(['sentence', 'path']))
75)
76
77dataset = dataset.map(speech_file_to_array_fn)
78result = dataset.map(predict)
79
80max_items = np.random.randint(0, len(result), 10).tolist()
81for i in max_items:
82 reference, predicted = result["sentence"][i], result["predicted"][i]
83 print("reference:", reference)
84 print("predicted:", predicted)
85 print('---')1reference: ülke şu anda iki federasyona üye
2predicted: ülke şu anda iki federasyona üye
3---
4reference: foruma dört yüzde fazla kişi katıldı
5predicted: soruma dört yüzden fazla kişi katıldı
6---
7reference: mobi altmış üç çalışanları da mutsuz
8predicted: mobia haltmış üç çalışanları da mutsur
9---
10reference: kentin mali esnekliğinin düşük olduğu bildirildi
11predicted: kentin mali esnekleğinin düşük olduğu bildirildi
12---
13reference: fouere iki ülkeyi sorunu abartmamaya çağırdı
14predicted: foor iki ülkeyi soruna abartmamaya çanayordı
15---
16reference: o ülkeden herhangi bir tepki geldi mi
17predicted: o ülkeden herhayın bir tepki geldi mi
18---
19reference: bunlara asla sırtımızı dönmeyeceğiz
20predicted: bunlara asla sırtımızı dönmeyeceğiz
21---
22reference: sizi ayakta tutan nedir
23predicted: sizi ayakta tutan nedir
24---
25reference: artık insanlar daha bireysel yaşıyor
26predicted: artık insanlar daha bir eyselli yaşıyor
27---
28reference: her ikisi de diyaloga hazır olduğunu söylüyor
29predicted: her ikisi de diyaloğa hazır olduğunu söylüyor
30---
31reference: merkez bankasının başlıca amacı düşük enflasyon
32predicted: merkez bankasının başlrıca anatı güşükyen flasyon
33---
34reference: firefox
35predicted: fair foks
36---
37reference: ülke halkı çok misafirsever ve dışa dönük
38predicted: ülke halktı çok isatirtever ve dışa dönük
39---
40reference: ancak kamuoyu bu durumu pek de affetmiyor
41predicted: ancak kamuonyulgukirmu pek deafıf etmiyor
42---
43reference: i ki madende iki bin beş yüzden fazla kişi çalışıyor
44predicted: i ki madende iki bin beş yüzden fazla kişi çalışıyor
45---
46reference: sunnyside park dışarıdan oldukça iyi görünüyor
47predicted: sani sahip park dışarıdan oldukça iyi görünüyor
48---
49reference: büyük ödül on beş bin avro
50predicted: büyük ödül on beş bin avro
51---
52reference: köyümdeki camiler depoya dönüştürüldü
53predicted: küyümdeki camiler depoya dönüştürüldü
54---
55reference: maç oldukça diplomatik bir sonuçla birbir bitti
56predicted: maç oldukça diplomatik bir sonuçla bir birbitti
57---
58reference: kuşların ikisi de karantinada öldüler
59predicted: kuşların ikiste karantinada özdüler
60---1import librosa
2import torch
3import torchaudio
4from transformers import Wav2Vec2ForCTC, Wav2Vec2Processor
5from datasets import load_dataset, load_metric
6
7import numpy as np
8import re
9import string
10
11
12chars_to_ignore = [
13 ",", "?", ".", "!", "-", ";", ":", '""', "%", "'", '"', "�",
14 "#", "!", "?", "«", "»", "(", ")", "؛", ",", "?", ".", "!", "-", ";", ":", '"',
15 "“", "%", "‘", "�", "–", "…", "_", "”", '“', '„'
16]
17chars_to_mapping = {
18 "\u200c": " ", "\u200d": " ", "\u200e": " ", "\u200f": " ", "\ufeff": " ",
19 "\u0307": " "
20}
21
22def multiple_replace(text, chars_to_mapping):
23 pattern = "|".join(map(re.escape, chars_to_mapping.keys()))
24 return re.sub(pattern, lambda m: chars_to_mapping[m.group()], str(text))
25
26def remove_special_characters(text, chars_to_ignore_regex):
27 text = re.sub(chars_to_ignore_regex, '', text).lower() + " "
28 return text
29
30def normalizer(batch, chars_to_ignore, chars_to_mapping):
31 chars_to_ignore_regex = f"""[{"".join(chars_to_ignore)}]"""
32 text = batch["sentence"].lower().strip()
33
34 text = text.replace("\u0307", " ").strip()
35 text = multiple_replace(text, chars_to_mapping)
36 text = remove_special_characters(text, chars_to_ignore_regex)
37 text = re.sub(" +", " ", text)
38 text = text.strip() + " "
39
40 batch["sentence"] = text
41 return batch
42
43
44def speech_file_to_array_fn(batch):
45 speech_array, sampling_rate = torchaudio.load(batch["path"])
46 speech_array = speech_array.squeeze().numpy()
47 speech_array = librosa.resample(np.asarray(speech_array), sampling_rate, 16_000)
48
49 batch["speech"] = speech_array
50 return batch
51
52
53def predict(batch):
54 features = processor(batch["speech"], sampling_rate=16_000, return_tensors="pt", padding=True)
55
56 input_values = features.input_values.to(device)
57 attention_mask = features.attention_mask.to(device)
58
59 with torch.no_grad():
60 logits = model(input_values, attention_mask=attention_mask).logits
61
62 pred_ids = torch.argmax(logits, dim=-1)
63
64 batch["predicted"] = processor.batch_decode(pred_ids)[0]
65 return batch
66
67
68device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
69processor = Wav2Vec2Processor.from_pretrained("m3hrdadfi/wav2vec2-large-xlsr-turkish")
70model = Wav2Vec2ForCTC.from_pretrained("m3hrdadfi/wav2vec2-large-xlsr-turkish").to(device)
71
72dataset = load_dataset("common_voice", "tr", split="test")
73dataset = dataset.map(
74 normalizer,
75 fn_kwargs={"chars_to_ignore": chars_to_ignore, "chars_to_mapping": chars_to_mapping},
76 remove_columns=list(set(dataset.column_names) - set(['sentence', 'path']))
77)
78
79dataset = dataset.map(speech_file_to_array_fn)
80result = dataset.map(predict)
81
82wer = load_metric("wer")
83
84print("WER: {:.2f}".format(100 * wer.compute(predictions=result["predicted"], references=result["sentence"])))train, validation datasets were used for training.