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 jiwer
7!pip install hazm
8!pip install num2fawords1import librosa
2import torch
3import torchaudio
4from transformers import Wav2Vec2ForCTC, Wav2Vec2Processor
5from datasets import load_dataset
6
7from num2fawords import words, ordinal_words
8import numpy as np
9import hazm
10import re
11import string
12
13import IPython.display as ipd
14
15_normalizer = hazm.Normalizer()
16
17chars_to_ignore = [
18 ",", "?", ".", "!", "-", ";", ":", '""', "%", "'", '"', "�",
19 "#", "!", "؟", "?", "«", "»", "،", "(", ")", "؛", "'ٔ", "٬",'ٔ', ",", "?",
20 ".", "!", "-", ";", ":",'"',"“", "%", "‘", "”", "�", "–", "…", "_", "”", '“', '„',
21 'ā', 'š',
22 # "ء",
23]
24
25# In case of farsi
26chars_to_ignore = chars_to_ignore + list(string.ascii_lowercase + string.digits)
27
28chars_to_mapping = {
29 'ك': 'ک', 'دِ': 'د', 'بِ': 'ب', 'زِ': 'ز', 'ذِ': 'ذ', 'شِ': 'ش', 'سِ': 'س', 'ى': 'ی',
30 'ي': 'ی', 'أ': 'ا', 'ؤ': 'و', "ے": "ی", "ۀ": "ه", "ﭘ": "پ", "ﮐ": "ک", "ﯽ": "ی",
31 "ﺎ": "ا", "ﺑ": "ب", "ﺘ": "ت", "ﺧ": "خ", "ﺩ": "د", "ﺱ": "س", "ﻀ": "ض", "ﻌ": "ع",
32 "ﻟ": "ل", "ﻡ": "م", "ﻢ": "م", "ﻪ": "ه", "ﻮ": "و", 'ﺍ': "ا", 'ة': "ه",
33 'ﯾ': "ی", 'ﯿ': "ی", 'ﺒ': "ب", 'ﺖ': "ت", 'ﺪ': "د", 'ﺮ': "ر", 'ﺴ': "س", 'ﺷ': "ش",
34 'ﺸ': "ش", 'ﻋ': "ع", 'ﻤ': "م", 'ﻥ': "ن", 'ﻧ': "ن", 'ﻭ': "و", 'ﺭ': "ر", "ﮔ": "گ",
35
36 # "ها": " ها", "ئ": "ی",
37
38 "a": " ای ", "b": " بی ", "c": " سی ", "d": " دی ", "e": " ایی ", "f": " اف ",
39 "g": " جی ", "h": " اچ ", "i": " آی ", "j": " جی ", "k": " کی ", "l": " ال ",
40 "m": " ام ", "n": " ان ", "o": " او ", "p": " پی ", "q": " کیو ", "r": " آر ",
41 "s": " اس ", "t": " تی ", "u": " یو ", "v": " وی ", "w": " دبلیو ", "x": " اکس ",
42 "y": " وای ", "z": " زد ",
43 "\u200c": " ", "\u200d": " ", "\u200e": " ", "\u200f": " ", "\ufeff": " ",
44}
45
46def multiple_replace(text, chars_to_mapping):
47 pattern = "|".join(map(re.escape, chars_to_mapping.keys()))
48 return re.sub(pattern, lambda m: chars_to_mapping[m.group()], str(text))
49
50def remove_special_characters(text, chars_to_ignore_regex):
51 text = re.sub(chars_to_ignore_regex, '', text).lower() + " "
52 return text
53
54def normalizer(batch, chars_to_ignore, chars_to_mapping):
55 chars_to_ignore_regex = f"""[{"".join(chars_to_ignore)}]"""
56 text = batch["sentence"].lower().strip()
57
58 text = _normalizer.normalize(text)
59 text = multiple_replace(text, chars_to_mapping)
60 text = remove_special_characters(text, chars_to_ignore_regex)
61 text = re.sub(" +", " ", text)
62 _text = []
63 for word in text.split():
64 try:
65 word = int(word)
66 _text.append(words(word))
67 except:
68 _text.append(word)
69
70 text = " ".join(_text) + " "
71
72 text = text.strip() + " "
73
74 batch["sentence"] = text
75 return batch
76
77
78def speech_file_to_array_fn(batch):
79 speech_array, sampling_rate = torchaudio.load(batch["path"])
80 speech_array = speech_array.squeeze().numpy()
81 speech_array = librosa.resample(np.asarray(speech_array), sampling_rate, 16_000)
82
83 batch["speech"] = speech_array
84 return batch
85
86
87def predict(batch):
88 features = processor(batch["speech"], sampling_rate=16_000, return_tensors="pt", padding=True)
89
90 input_values = features.input_values.to(device)
91 attention_mask = features.attention_mask.to(device)
92
93 with torch.no_grad():
94 logits = model(input_values, attention_mask=attention_mask).logits
95
96 pred_ids = torch.argmax(logits, dim=-1)
97
98 batch["predicted"] = processor.batch_decode(pred_ids)[0]
99 return batch
100
101
102device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
103processor = Wav2Vec2Processor.from_pretrained("m3hrdadfi/wav2vec2-large-xlsr-persian-shemo")
104model = Wav2Vec2ForCTC.from_pretrained("m3hrdadfi/wav2vec2-large-xlsr-persian-shemo").to(device)
105
106dataset = load_dataset("csv", data_files={"test": "/content/fa/dataset/test.csv"}, delimiter="\t")["test"]
107dataset = dataset.map(
108 normalizer,
109 fn_kwargs={"chars_to_ignore": chars_to_ignore, "chars_to_mapping": chars_to_mapping},
110 remove_columns=list(set(dataset.column_names) - set(['sentence', 'path']))
111)
112
113dataset = dataset.map(speech_file_to_array_fn)
114result = dataset.map(predict)
115
116max_items = np.random.randint(0, len(result), 20).tolist()
117for i in max_items:
118 reference, predicted = result["sentence"][i], result["predicted"][i]
119 print("reference:", reference)
120 print("predicted:", predicted)
121 print('---')1reference: همون شبی که قسم خوردی منو از جونت بیشتر دوست داری و تا آخر عمر کنار من می مونی همون شبی که به من وعده دادی بزرگترین جشن های ازدواج رو برام بگیری
2predicted: همون شبی که قسم خوردی منو از جونت بیشتر دوستاری و تا آخر عمر کنار من می مونیمو یبی که به من وعض دادین بزرگترین جشن های ازدواج و برام بگیری
3---
4reference: خودتون دم به ساعت فحشش می دین کتکش می زنین بس نیست
5predicted: خودتون دم به ساعت فشش می دیم کتاکش می زنیم بس نیست
6---
7reference: خونه
8predicted: خونه
9---
10reference: شلوغش نکن
11predicted: شلوغش نکن
12---
13reference: برای بقیه سوییت هایی در نظر گرفتم
14predicted: برای بقی سویید هایی در نظر گرفتم
15---
16reference: برو گمشو برو گمشو برو بیرون
17predicted: برو گمشو برو گمشو برو بیرون
18---
19reference: فقط یک سال بعد از خاتمه جنگ بود که حقیقت رو فهمیدی
20predicted: فقط یک سال بعد از خاتمه جنگ بود که حقیقت و فهمیدید
21---
22reference: غیر از اون دو نفری که اینجا خوابیدند کسان دیگه ای از دوستانشو به تو معرفی نکرده
23predicted: غیر از اون دو نفری که اینجا خوابیدند کسانه دیگه ای از دوستانشو به تو معرفی نکرده
24---
25reference: من می دونم اینجایی درو واز کن کویی کوئک
26predicted: من می دونم این جایی د رو واز کن کوری فکر
27---
28reference: نویسنده باید چهار تا چشم داشته باشه چهار تا گوش
29predicted: نویسند باید چهار تا چشم داشته باشه و چهار تا گوش
30---
31reference: غیر از اون دو نفری که اینجا خوابیدند کسان دیگه ای از دوستانشو به تو معرفی نکرده
32predicted: غیر از اون دو نفری که اینجا خوابیدند کسانه دیگه ای از دوستانشو به تو معرفی نکرده
33---
34reference: پس همراهان من چه می کنن چه می کنن که این سرکرده کولی ها تونسته خودشو اینجا برسونه
35predicted: پس همرا حال من چه می کنن چه می کنن که این سرکرده کلی ها تونسته خودش رو اینجا برسونه
36---
37reference: گوش بدید مادمازل حقیقت اینه که من دلم می خواد به شما کمک کنم زیبایی و جوانی شما دل منو به رحم میاره به من اعتماد کنید دلم می خواد بتونم شما رو از مرگ نجات بدم
38predicted: هوش بدید مادماز حقیقت اینه که من دلم می خواد به شما کمک کنم زیبای و جوانی شما دل منو به رحم می آره به من اعتماد کنید دلم می خواد بتونم شما رو از مرگ نجات بدم
39---
40reference: قربان به نظر می رسه شما نه تنها به مرگ رونالد دریو بلکه به مرگ خانم مونرو هم مشکوکید
41predicted: قربان به نظر می رسه شما نه تن ها به مرگ رونال گریو بلکه به مرگ خانم مونرا مشکوکین
42---
43reference: برای اینکه شما رو دوست دارم
44predicted: برای اینکه شما رو دوست دارم
45---
46reference: مرتبه اول دنبال جسدی می گشتن که انداخته بودن کنار خیابون
47predicted: حر تبه اول دنبال جسدی می گشتند که انداخته بودن کنار خیابون
48---
49reference: خونه
50predicted: خونه
51---
52reference: کدبانوی جدید این طبقه هستم
53predicted: کدبانوی جدید این طبقه هستم
54---
55reference: و این برات خیلی گرون تموم شد
56predicted: و این برات خیلی گرون تموم شد
57---
58reference: خب چرا نمی دین به خودشون
59predicted: خبچرا نمی تون به خودشون1import librosa
2import torch
3import torchaudio
4from transformers import Wav2Vec2ForCTC, Wav2Vec2Processor
5from datasets import load_dataset, load_metric
6
7from num2fawords import words, ordinal_words
8import numpy as np
9import hazm
10import re
11import string
12
13_normalizer = hazm.Normalizer()
14
15chars_to_ignore = [
16 ",", "?", ".", "!", "-", ";", ":", '""', "%", "'", '"', "�",
17 "#", "!", "؟", "?", "«", "»", "،", "(", ")", "؛", "'ٔ", "٬",'ٔ', ",", "?",
18 ".", "!", "-", ";", ":",'"',"“", "%", "‘", "”", "�", "–", "…", "_", "”", '“', '„',
19 'ā', 'š',
20 # "ء",
21]
22
23# In case of farsi
24chars_to_ignore = chars_to_ignore + list(string.ascii_lowercase + string.digits)
25
26chars_to_mapping = {
27 'ك': 'ک', 'دِ': 'د', 'بِ': 'ب', 'زِ': 'ز', 'ذِ': 'ذ', 'شِ': 'ش', 'سِ': 'س', 'ى': 'ی',
28 'ي': 'ی', 'أ': 'ا', 'ؤ': 'و', "ے": "ی", "ۀ": "ه", "ﭘ": "پ", "ﮐ": "ک", "ﯽ": "ی",
29 "ﺎ": "ا", "ﺑ": "ب", "ﺘ": "ت", "ﺧ": "خ", "ﺩ": "د", "ﺱ": "س", "ﻀ": "ض", "ﻌ": "ع",
30 "ﻟ": "ل", "ﻡ": "م", "ﻢ": "م", "ﻪ": "ه", "ﻮ": "و", 'ﺍ': "ا", 'ة': "ه",
31 'ﯾ': "ی", 'ﯿ': "ی", 'ﺒ': "ب", 'ﺖ': "ت", 'ﺪ': "د", 'ﺮ': "ر", 'ﺴ': "س", 'ﺷ': "ش",
32 'ﺸ': "ش", 'ﻋ': "ع", 'ﻤ': "م", 'ﻥ': "ن", 'ﻧ': "ن", 'ﻭ': "و", 'ﺭ': "ر", "ﮔ": "گ",
33
34 # "ها": " ها", "ئ": "ی",
35
36 "a": " ای ", "b": " بی ", "c": " سی ", "d": " دی ", "e": " ایی ", "f": " اف ",
37 "g": " جی ", "h": " اچ ", "i": " آی ", "j": " جی ", "k": " کی ", "l": " ال ",
38 "m": " ام ", "n": " ان ", "o": " او ", "p": " پی ", "q": " کیو ", "r": " آر ",
39 "s": " اس ", "t": " تی ", "u": " یو ", "v": " وی ", "w": " دبلیو ", "x": " اکس ",
40 "y": " وای ", "z": " زد ",
41 "\u200c": " ", "\u200d": " ", "\u200e": " ", "\u200f": " ", "\ufeff": " ",
42}
43
44def multiple_replace(text, chars_to_mapping):
45 pattern = "|".join(map(re.escape, chars_to_mapping.keys()))
46 return re.sub(pattern, lambda m: chars_to_mapping[m.group()], str(text))
47
48def remove_special_characters(text, chars_to_ignore_regex):
49 text = re.sub(chars_to_ignore_regex, '', text).lower() + " "
50 return text
51
52def normalizer(batch, chars_to_ignore, chars_to_mapping):
53 chars_to_ignore_regex = f"""[{"".join(chars_to_ignore)}]"""
54 text = batch["sentence"].lower().strip()
55
56 text = _normalizer.normalize(text)
57 text = multiple_replace(text, chars_to_mapping)
58 text = remove_special_characters(text, chars_to_ignore_regex)
59 text = re.sub(" +", " ", text)
60 _text = []
61 for word in text.split():
62 try:
63 word = int(word)
64 _text.append(words(word))
65 except:
66 _text.append(word)
67
68 text = " ".join(_text) + " "
69
70 text = text.strip() + " "
71
72 batch["sentence"] = text
73 return batch
74
75
76def speech_file_to_array_fn(batch):
77 speech_array, sampling_rate = torchaudio.load(batch["path"])
78 speech_array = speech_array.squeeze().numpy()
79 speech_array = librosa.resample(np.asarray(speech_array), sampling_rate, 16_000)
80
81 batch["speech"] = speech_array
82 return batch
83
84
85def predict(batch):
86 features = processor(batch["speech"], sampling_rate=16_000, return_tensors="pt", padding=True)
87
88 input_values = features.input_values.to(device)
89 attention_mask = features.attention_mask.to(device)
90
91 with torch.no_grad():
92 logits = model(input_values, attention_mask=attention_mask).logits
93
94 pred_ids = torch.argmax(logits, dim=-1)
95
96 batch["predicted"] = processor.batch_decode(pred_ids)[0]
97 return batch
98
99
100device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
101processor = Wav2Vec2Processor.from_pretrained("m3hrdadfi/wav2vec2-large-xlsr-persian-shemo")
102model = Wav2Vec2ForCTC.from_pretrained("m3hrdadfi/wav2vec2-large-xlsr-persian-shemo").to(device)
103
104dataset = load_dataset("csv", data_files={"test": "/content/fa/dataset/test.csv"}, delimiter="\t")["test"]
105dataset = dataset.map(
106 normalizer,
107 fn_kwargs={"chars_to_ignore": chars_to_ignore, "chars_to_mapping": chars_to_mapping},
108 remove_columns=list(set(dataset.column_names) - set(['sentence', 'path']))
109)
110dataset = dataset.map(speech_file_to_array_fn)
111result = dataset.map(predict)
112
113wer = load_metric("wer")
114print("WER: {:.2f}".format(100 * wer.compute(predictions=result["predicted"], references=result["sentence"])))train, validation datasets were used for training.