othrif commited on
Commit
589292b
1 Parent(s): 65f6f80

added egyptian arabic model

Browse files
README.md ADDED
@@ -0,0 +1,127 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ language: arz
3
+ datasets:
4
+ - https://arabicspeech.org/
5
+ metrics:
6
+ - wer
7
+ tags:
8
+ - audio
9
+ - automatic-speech-recognition
10
+ - speech
11
+ - xlsr-fine-tuning-week
12
+ license: apache-2.0
13
+ model-index:
14
+ - name: `XLSR Wav2Vec2 Egyptian Arabic by Othmane Rifki`
15
+ results:
16
+ - task:
17
+ name: Speech Recognition
18
+ type: automatic-speech-recognition
19
+ dataset:
20
+ name: arabicspeech.org MGB-3
21
+ type: arabicspeech.org MGB-3
22
+ args: ar
23
+ metrics:
24
+ - name: Test WER
25
+ type: wer
26
+ value: 55.2
27
+ ---
28
+
29
+ # Wav2Vec2-Large-XLSR-53-Egyptian-Arabic
30
+
31
+ Fine-tuned [facebook/wav2vec2-large-xlsr-53](https://huggingface.co/facebook/wav2vec2-large-xlsr-53) in Egyptian using the [arabicspeech.org MGB-3](https://arabicspeech.org/mgb3-asr/)
32
+ When using this model, make sure that your speech input is sampled at 16kHz.
33
+
34
+ ## Usage
35
+
36
+ The model can be used directly (without a language model) as follows:
37
+
38
+ ```python
39
+ import torch
40
+ import torchaudio
41
+ from datasets import load_dataset
42
+ from transformers import Wav2Vec2ForCTC, Wav2Vec2Processor
43
+
44
+ test_dataset = load_dataset("common_voice", "ar", split="test[:2%]")
45
+
46
+ processor = Wav2Vec2Processor.from_pretrained("othrif/wav2vec2-large-xlsr-egyptian")
47
+ model = Wav2Vec2ForCTC.from_pretrained("othrif/wav2vec2-large-xlsr-egyptian")
48
+
49
+ resampler = torchaudio.transforms.Resample(48_000, 16_000)
50
+
51
+ # Preprocessing the datasets.
52
+ # We need to read the audio files as arrays
53
+ def speech_file_to_array_fn(batch):
54
+ speech_array, sampling_rate = torchaudio.load(batch["path"])
55
+ batch["speech"] = resampler(speech_array).squeeze().numpy()
56
+ return batch
57
+
58
+ test_dataset = test_dataset.map(speech_file_to_array_fn)
59
+ inputs = processor(test_dataset["speech"][:2], sampling_rate=16_000, return_tensors="pt", padding=True)
60
+
61
+ with torch.no_grad():
62
+ logits = model(inputs.input_values, attention_mask=inputs.attention_mask).logits
63
+
64
+ predicted_ids = torch.argmax(logits, dim=-1)
65
+
66
+ print("Prediction:", processor.batch_decode(predicted_ids))
67
+ print("Reference:", test_dataset["sentence"][:2])
68
+ ```
69
+
70
+
71
+ ## Evaluation
72
+
73
+ The model can be evaluated as follows on the Arabic test data of Common Voice.
74
+
75
+
76
+ ```python
77
+ import torch
78
+ import torchaudio
79
+ from datasets import load_dataset, load_metric
80
+ from transformers import Wav2Vec2ForCTC, Wav2Vec2Processor
81
+ import re
82
+
83
+ test_dataset = load_dataset("common_voice", "ar", split="test")
84
+ wer = load_metric("wer")
85
+
86
+ processor = Wav2Vec2Processor.from_pretrained("othrif/wav2vec2-large-xlsr-egyptian")
87
+ model = Wav2Vec2ForCTC.from_pretrained("othrif/wav2vec2-large-xlsr-egyptian")
88
+ model.to("cuda")
89
+
90
+ chars_to_ignore_regex = '[\؛\—\_get\«\»\ـ\ـ\,\?\.\!\-\;\:\"\“\%\‘\”\�\#\،\☭,\؟]'
91
+ resampler = torchaudio.transforms.Resample(48_000, 16_000)
92
+
93
+ # Preprocessing the datasets.
94
+ # We need to read the audio files as arrays
95
+ def speech_file_to_array_fn(batch):
96
+ batch["sentence"] = re.sub(chars_to_ignore_regex, '', batch["sentence"]).lower()
97
+ speech_array, sampling_rate = torchaudio.load(batch["path"])
98
+ batch["speech"] = resampler(speech_array).squeeze().numpy()
99
+ return batch
100
+
101
+ test_dataset = test_dataset.map(speech_file_to_array_fn)
102
+
103
+ # Preprocessing the datasets.
104
+ # We need to read the audio files as arrays
105
+ def evaluate(batch):
106
+ inputs = processor(batch["speech"], sampling_rate=16_000, return_tensors="pt", padding=True)
107
+
108
+ with torch.no_grad():
109
+ logits = model(inputs.input_values.to("cuda"), attention_mask=inputs.attention_mask.to("cuda")).logits
110
+
111
+ pred_ids = torch.argmax(logits, dim=-1)
112
+ batch["pred_strings"] = processor.batch_decode(pred_ids)
113
+ return batch
114
+
115
+ result = test_dataset.map(evaluate, batched=True, batch_size=8)
116
+
117
+ print("WER: {:2f}".format(100 * wer.compute(predictions=result["pred_strings"], references=result["sentence"])))
118
+ ```
119
+
120
+ **Test Result**: 55.2
121
+
122
+
123
+ ## Training
124
+
125
+ The Common Voice `train`, `validation` datasets were used for training.
126
+
127
+ The script used for training can be found [here](https://github.com/othrif/xlsr-wav2vec2)
config.json ADDED
@@ -0,0 +1,76 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "_name_or_path": "facebook/wav2vec2-large-xlsr-53",
3
+ "activation_dropout": 0.0,
4
+ "apply_spec_augment": true,
5
+ "architectures": [
6
+ "Wav2Vec2ForCTC"
7
+ ],
8
+ "attention_dropout": 0.1,
9
+ "bos_token_id": 1,
10
+ "conv_bias": true,
11
+ "conv_dim": [
12
+ 512,
13
+ 512,
14
+ 512,
15
+ 512,
16
+ 512,
17
+ 512,
18
+ 512
19
+ ],
20
+ "conv_kernel": [
21
+ 10,
22
+ 3,
23
+ 3,
24
+ 3,
25
+ 3,
26
+ 2,
27
+ 2
28
+ ],
29
+ "conv_stride": [
30
+ 5,
31
+ 2,
32
+ 2,
33
+ 2,
34
+ 2,
35
+ 2,
36
+ 2
37
+ ],
38
+ "ctc_loss_reduction": "mean",
39
+ "ctc_zero_infinity": false,
40
+ "do_stable_layer_norm": true,
41
+ "eos_token_id": 2,
42
+ "feat_extract_activation": "gelu",
43
+ "feat_extract_dropout": 0.0,
44
+ "feat_extract_norm": "layer",
45
+ "feat_proj_dropout": 0.0,
46
+ "final_dropout": 0.0,
47
+ "gradient_checkpointing": true,
48
+ "hidden_act": "gelu",
49
+ "hidden_dropout": 0.1,
50
+ "hidden_size": 1024,
51
+ "initializer_range": 0.02,
52
+ "intermediate_size": 4096,
53
+ "layer_norm_eps": 1e-05,
54
+ "layerdrop": 0.1,
55
+ "mask_channel_length": 10,
56
+ "mask_channel_min_space": 1,
57
+ "mask_channel_other": 0.0,
58
+ "mask_channel_prob": 0.0,
59
+ "mask_channel_selection": "static",
60
+ "mask_feature_length": 10,
61
+ "mask_feature_prob": 0.0,
62
+ "mask_time_length": 10,
63
+ "mask_time_min_space": 1,
64
+ "mask_time_other": 0.0,
65
+ "mask_time_prob": 0.05,
66
+ "mask_time_selection": "static",
67
+ "model_type": "wav2vec2",
68
+ "num_attention_heads": 16,
69
+ "num_conv_pos_embedding_groups": 16,
70
+ "num_conv_pos_embeddings": 128,
71
+ "num_feat_extract_layers": 7,
72
+ "num_hidden_layers": 24,
73
+ "pad_token_id": 43,
74
+ "transformers_version": "4.4.0",
75
+ "vocab_size": 44
76
+ }
optimizer.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:0afe7313e3a58ee05f77356220557a12a7999c69667fff22cb67ac4ec07f91cc
3
+ size 2490437895
preprocessor_config.json ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
1
+ {
2
+ "do_normalize": true,
3
+ "feature_size": 1,
4
+ "padding_side": "right",
5
+ "padding_value": 0.0,
6
+ "return_attention_mask": true,
7
+ "sampling_rate": 16000
8
+ }
pytorch_model.bin ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:455418f744560b3cf4356a8df6b0f13e984c0d73c886d371a7d1d61149befed7
3
+ size 1262114199
scheduler.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:0818666afb82b7b432824bd91f7b1cbfd826c0bbd672aea23cda693e38746b70
3
+ size 623
special_tokens_map.json ADDED
@@ -0,0 +1 @@
 
1
+ {"bos_token": "<s>", "eos_token": "</s>", "unk_token": "[UNK]", "pad_token": "[PAD]"}
tokenizer_config.json ADDED
@@ -0,0 +1 @@
 
1
+ {"unk_token": "[UNK]", "bos_token": "<s>", "eos_token": "</s>", "pad_token": "[PAD]", "do_lower_case": false, "word_delimiter_token": "|"}
trainer_state.json ADDED
@@ -0,0 +1,100 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "best_metric": null,
3
+ "best_model_checkpoint": null,
4
+ "epoch": 18.46153846153846,
5
+ "global_step": 1200,
6
+ "is_hyper_param_search": false,
7
+ "is_local_process_zero": true,
8
+ "is_world_process_zero": true,
9
+ "log_history": [
10
+ {
11
+ "epoch": 3.08,
12
+ "learning_rate": 0.00011999999999999999,
13
+ "loss": 5.8244,
14
+ "step": 200
15
+ },
16
+ {
17
+ "epoch": 3.08,
18
+ "eval_loss": 3.064483404159546,
19
+ "eval_runtime": 32.6688,
20
+ "eval_samples_per_second": 7.071,
21
+ "eval_wer": 0.9981722641078364,
22
+ "step": 200
23
+ },
24
+ {
25
+ "epoch": 6.15,
26
+ "learning_rate": 0.00023999999999999998,
27
+ "loss": 3.0089,
28
+ "step": 400
29
+ },
30
+ {
31
+ "epoch": 6.15,
32
+ "eval_loss": 2.9369325637817383,
33
+ "eval_runtime": 32.3179,
34
+ "eval_samples_per_second": 7.148,
35
+ "eval_wer": 0.9981722641078364,
36
+ "step": 400
37
+ },
38
+ {
39
+ "epoch": 9.23,
40
+ "learning_rate": 0.0002625,
41
+ "loss": 2.2569,
42
+ "step": 600
43
+ },
44
+ {
45
+ "epoch": 9.23,
46
+ "eval_loss": 1.1511069536209106,
47
+ "eval_runtime": 32.4921,
48
+ "eval_samples_per_second": 7.109,
49
+ "eval_wer": 0.7900388393877085,
50
+ "step": 600
51
+ },
52
+ {
53
+ "epoch": 12.31,
54
+ "learning_rate": 0.00018749999999999998,
55
+ "loss": 0.9673,
56
+ "step": 800
57
+ },
58
+ {
59
+ "epoch": 12.31,
60
+ "eval_loss": 0.8750982284545898,
61
+ "eval_runtime": 32.4693,
62
+ "eval_samples_per_second": 7.114,
63
+ "eval_wer": 0.6248572081334247,
64
+ "step": 800
65
+ },
66
+ {
67
+ "epoch": 15.38,
68
+ "learning_rate": 0.0001125,
69
+ "loss": 0.6495,
70
+ "step": 1000
71
+ },
72
+ {
73
+ "epoch": 15.38,
74
+ "eval_loss": 0.8149241805076599,
75
+ "eval_runtime": 32.8858,
76
+ "eval_samples_per_second": 7.024,
77
+ "eval_wer": 0.5716244002741604,
78
+ "step": 1000
79
+ },
80
+ {
81
+ "epoch": 18.46,
82
+ "learning_rate": 3.75e-05,
83
+ "loss": 0.5093,
84
+ "step": 1200
85
+ },
86
+ {
87
+ "epoch": 18.46,
88
+ "eval_loss": 0.8335053324699402,
89
+ "eval_runtime": 32.889,
90
+ "eval_samples_per_second": 7.024,
91
+ "eval_wer": 0.5522047064199224,
92
+ "step": 1200
93
+ }
94
+ ],
95
+ "max_steps": 1300,
96
+ "num_train_epochs": 20,
97
+ "total_flos": 7.999569757266722e+18,
98
+ "trial_name": null,
99
+ "trial_params": null
100
+ }
training_args.bin ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:4a949b13ad5afbc0f1621dd3c424c1db200517da21931d0b7976930beff9c6f6
3
+ size 2287
vocab.json ADDED
@@ -0,0 +1 @@
 
1
+ {"ف": 0, ")": 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, "ث": 28, "ط": 29, "ظ": 30, "ض": 31, "ل": 32, "ي": 33, "ؤ": 34, "ع": 35, "ة": 36, "ه": 37, "إ": 38, "(": 39, "ى": 40, "ص": 41, "|": 27, "[UNK]": 42, "[PAD]": 43}