File size: 13,496 Bytes
60e1260
 
 
 
fa35876
1884736
60e1260
 
1884736
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ce6be78
1884736
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
62eb507
 
1884736
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
096ae71
1884736
 
 
 
 
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
---
library_name: transformers
tags: []
---
# تَشْكِيلُ النُّصُوصِ الْعَرَبِيَّةِ تِلْقَائِياً
This model is trained to add tashkeel (Arabic diacritics) to Arabic text, enhancing readability and pronunciation. It may be also helpful for data synthesis training models on other tasks, such as text-to-speech, language modeling, and more.

## Model Details
The model is based on the [Google's FLAN-T5 small model](https://huggingface.co/google/flan-t5-small) trained on [Arabic Tashkeel Dataset](https://huggingface.co/datasets/Abdou/arabic-tashkeel-dataset).

The tokenizer is trained on a subset of the same dataset.

## How to Use
You can use this model to add tashkeel to Arabic text by using the following code:
```python
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
import torch

model_path = "Abdou/arabic-tashkeel-flan-t5-small"

tokenizer = AutoTokenizer.from_pretrained(model_path)
model = AutoModelForSeq2SeqLM.from_pretrained(model_path)

def vocalize_text(text, model, tokenizer, max_length=256, num_beams=4, temperature=0.2, do_sample=False):
    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    model.to(device)
    model.eval()
    # Tokenize the input text
    inputs = tokenizer(text, return_tensors="pt", max_length=max_length, truncation=True, padding="max_length")
    inputs = {k: v.to(device) for k, v in inputs.items()}
    with torch.no_grad():
        if do_sample:
            outputs = model.generate(
                **inputs,
                max_length=max_length,
                do_sample=True,
                temperature=temperature,
            )
        else:
            outputs = model.generate(
                **inputs,
                max_length=max_length,
                num_beams=num_beams,
                early_stopping=True
            )
    return tokenizer.decode(outputs[0], skip_special_tokens=True)

# Quran texts
quran_texts = [
    "قل هو نبأ عظيم أنتم عنه معرضون",
    "إنما يخشى الله من عباده العلماء",
    "والله غالب على أمره ولكن أكثر الناس لا يعلمون",
    "وعلم ءادم الأسماء كلها ثم عرضهم على الملائكة فقال أنبؤوني بأسماء هؤلاء إن كنتم صادقين",
    "وإذ قال موسى لقومه يا قوم لم تؤذونني وقد تعلمون أني رسول الله إليكم",
    "ولله يسجد ما في السماوات وما في الارض من دابة والملاءكة وهم لا يستكبرون",
    "الذي أحسن كل شيء خلقه وبدأ خلق الإنسان من طين",
]
# Hadith texts
hadith_texts = [
    "إن الله لا ينظر إلى صوركم وأموالكم ولكن ينظر إلى قلوبكم وأعمالكم",
    "عن أبي ذر جندب بن جنادة، وأبي عبدالرحمن معاذ بن جبل رضي الله عنهما، عن رسول الله ﷺ، قال: اتق الله حيثما كنت وأتبع السيئة الحسنة تمحها، وخالق الناس بخلق حسن . رواه الترمذي وقال: حديث حسن.",
    "المسلم من سلم المسلمون من لسانه ويده",
    "المؤمن القوي خير وأحب إلى الله من المؤمن الضعيف ، وفي كل خير.",
]
# some Arabic texts
arabic_texts = [
    "إنما الأمم الأخلاق ما بقيت فإن هم ذهبت أخلاقهم ذهبوا",
    "يعد من أكبر علماء الأندلس وأكبر علماء الإسلام تصنيفًا وتأليفًا بعد الطبري، وهو إمام حافظ. فقيه ظاهري، ومجدد القول به، بل محيي المذهب بعد زواله في الشرق. ومتكلم وأديب وشاعر ونسّابة وعالم برجال الحديث وناقد محلل بل وصفه البعض بالفيلسوف كما عد من أوائل من قال بكروية الأرض، كما كان وزير سياسي لبني أمية، سلك طريق نبذ التقليد وتحرير الأتباع، قامت عليه جماعة من المالكية وشـُرد عن وطنه. توفي لاحقاً في منزله في أرض أبويه منت ليشم المعروفة بمونتيخار حالياً، وهي عزبة قريبة من ولبة. وأصل جده يزيد فارسي، أسلم وأول من دخل منهم بلاد المغرب، وكانت بلدهم قرطبة فولد ابن حزم بها في سلخ نهاية رمضان من سنة أربع وثمانين وثلاثمائة."
]

texts = [
    ("Quran Texts", quran_texts),
    ("Hadith Texts", hadith_texts),
    ("Arabic Texts", arabic_texts)
]
for title, texts in texts:
    print(f"=============== {title} ===============")
    for text in texts:
        vocalized_result = vocalize_text(text, model, tokenizer)
        print(f"Input: \n{text}")
        print("="*10)
        print(f"Prediction: \n{vocalized_result}")
        print("="*10)
```
**Output:**

```plaintext
=============== Quran Texts ===============
Input: 
قل هو نبأ عظيم أنتم عنه معرضون
==========
Prediction: 
قُلْ هُوَ نَبَأٌ عَظِيمٌ أَنْتُمْ عَنْهُ مُعْرِضُونَ
==========
Input: 
إنما يخشى الله من عباده العلماء
==========
Prediction: 
إِنَّمَا يَخْشَى ٱللَّهَ مِنْ عِبَادِهِ ٱلْعُلَمَآءُ
==========
Input: 
والله غالب على أمره ولكن أكثر الناس لا يعلمون
==========
Prediction: 
وَٱللَّهُ غَالِبٌ عَلَىٰٓ أَمْرِهِۦ وَلَٰكِنَّ أَكْثَرَ ٱلنَّاسِ لَا يَعْلَمُونَ
==========
Input: 
وعلم ءادم الأسماء كلها ثم عرضهم على الملائكة فقال أنبؤوني بأسماء هؤلاء إن كنتم صادقين
==========
Prediction: 
وَعَلِّمْ ءَادَمَ ٱلْأَسْمَآءَ كُلَّهَا ثُمَّ عَرَضَهُمْ عَلَى ٱلْمَلاَئِكَةِ فَقَالَ أَنبَؤُونِي بِأَسْمَاءِ هَٰٓؤُلَآءِ إِن كُنتُمْ صَادِقِينَ
==========
Input: 
وإذ قال موسى لقومه يا قوم لم تؤذونني وقد تعلمون أني رسول الله إليكم
==========
Prediction: 
وَإِذْ قَالَ مُوسَىٰ لِقَوْمِهِ يَا قَوْمِ لِمَ تُؤْذُونَنِي وَقَدْ تَعْلَمُونَ أَنِّي رَسُولُ اللَّهِ إِلَيْكُمْ
==========
Input: 
ولله يسجد ما في السماوات وما في الارض من دابة والملاءكة وهم لا يستكبرون
==========
Prediction: 
وَلِلَّهِ يَسْجُدُ مَا فِي السَّمَاوَاتِ وَمَا فِي الْارْضِ مِنْ دَابَّةٍ وَالْمَلَائِكَةُ وَهُمْ لَا يَسْتَكْبِرُونَ
==========
Input: 
الذي أحسن كل شيء خلقه وبدأ خلق الإنسان من طين
==========
Prediction: 
الَّذِي أَحْسَنَ كُلَّ شَيْءٍ خَلْقَهُ وَبَدَأَ خَلْقَ الْإِنْسَانِ مِنْ طِينٍ
==========
=============== Hadith Texts ===============
Input: 
إن الله لا ينظر إلى صوركم وأموالكم ولكن ينظر إلى قلوبكم وأعمالكم
==========
Prediction: 
إِنَّ اللَّهَ لَا يَنْظُرُ إِلَىٰ صُوَرِكُمْ وَأَمْوَالِكُمْ وَلَكِنْ يَنْظُرُ إِلَىٰ قُلُوبِكُمْ وَأَعْمَالِكُمْ
==========
Input: 
عن أبي ذر جندب بن جنادة، وأبي عبدالرحمن معاذ بن جبل رضي الله عنهما، عن رسول الله ﷺ، قال: اتق الله حيثما كنت وأتبع السيئة الحسنة تمحها، وخالق الناس بخلق حسن . رواه الترمذي وقال: حديث حسن.
==========
Prediction: 
عَنْ أَبِي ذَرٍّ جُنْدُبِ بْنِ جُنَادَةَ، وَأَبِي عَبْدِالرَّحْمَنِ مُعَاذِ بْنِ جَبَلٍ رَضِيَ اللَّهُ عَنْهُمَا، عَنْ رَسُولِ اللَّهِ صَلَّى اللَّهُ عَلَيْهِ وَسَلَّمَ، قَالَ: اتَّقِ اللَّهَ حَيْثُمَا كُنْتَ وَأَتْبِعِ السَّيِّئَةَ الْحَسَنَةَ تَمْحُهَا، وَخَالِقِ النَّاسَ بِخُلُقٍ حَسَنٍ . رَوَاهُ التِّرْمِذِيُّ وَقَالَ: حَدِيثٌ حَسَنٌ.
==========
Input: 
المسلم من سلم المسلمون من لسانه ويده
==========
Prediction: 
الْمُسْلِمُ مَنْ سَلِمَ الْمُسْلِمُونَ مِنْ لِسَانِهِ وَيَدِهِ
==========
Input: 
المؤمن القوي خير وأحب إلى الله من المؤمن الضعيف ، وفي كل خير.
==========
Prediction: 
الْمُؤْمِنُ الْقَوِيُّ خَيْرٌ وَأَحَبُّ إِلَى اللَّهِ مِنَ الْمُؤْمِنِ الضَّعِيفِ ، وَفِي كُلِّ خَيْرٍ.
==========
=============== Arabic Texts ===============
Input: 
إنما الأمم الأخلاق ما بقيت فإن هم ذهبت أخلاقهم ذهبوا
==========
Prediction: 
إِنَّمَا الأُمَمُ الأَخْلاقُ مَا بَقِيَتْ فَإِنْ هُمْ ذَهَبَتْ أَخْلاقُهُمْ ذَهَبُوا
==========
Input: 
يعد من أكبر علماء الأندلس وأكبر علماء الإسلام تصنيفًا وتأليفًا بعد الطبري، وهو إمام حافظ. فقيه ظاهري، ومجدد القول به، بل محيي المذهب بعد زواله في الشرق. ومتكلم وأديب وشاعر ونسّابة وعالم برجال الحديث وناقد محلل بل وصفه البعض بالفيلسوف كما عد من أوائل من قال بكروية الأرض، كما كان وزير سياسي لبني أمية، سلك طريق نبذ التقليد وتحرير الأتباع، قامت عليه جماعة من المالكية وشـُرد عن وطنه. توفي لاحقاً في منزله في أرض أبويه منت ليشم المعروفة بمونتيخار حالياً، وهي عزبة قريبة من ولبة. وأصل جده يزيد فارسي، أسلم وأول من دخل منهم بلاد المغرب، وكانت بلدهم قرطبة فولد ابن حزم بها في سلخ نهاية رمضان من سنة أربع وثمانين وثلاثمائة.
==========
Prediction: 
يُعَدُّ مِنْ أَكْبَرِ عُلَمَاءِ الْأَنْدَلُسِ وَأَكْبَرِ عُلَمَاءِ الْإِسْلَامِ تَصْنِيفًا وَتَأْلِيفًا بَعْدَ الطَّبَرِيِّ، وَهُوَ إِمَامٌ حَافِظٌ. فَقِيهٌ ظَاهِرِيٌّ، وَمُجَدِّدُ الْقَوْلِ بِهِ، بَلْ مُحْيِي الْمَذْهَبِ بَعْدَ زَوَالِهِ فِي الشَّرْقِ. وَمُتَكَلِّمٌ وَأَدِيبٌ وَشَاعِرٌ وَنَسَّابَةٌ وَعَالِمٌ بِرِجَالِ الْحَدِيثِ وَنَاقِدٌ مُحَلَّلٌ بَلْ وَصَفَهُ الْبَعْضُ بِالْفَيْلَسُوفِ كَمَا عُدَّ مِنْ أَوَائِلِ مَنْ قَالَ بِكُرَوِيَّةِ الْأَرْضِ، كَمَا كَانَ وَزِيرٌ سِيَاسِيٌّ لِبَنِي أُمَيَّةَ، سَلَكَ طَرِيقَ نَبْذِ التَّقْلِيدِ وَتَحْرِيرَ الْأَتْبَاعِ، قَامَتْ عَلَيْهِ جَمَاعَةٌ مِنَ الْمَالِكِيَّةِ وَشَـرُّدٌ عَنْ وَطَنِهِ. تُوُفِّيَ لَاحِقًا فِي مَنْزِلِهِ فِي أَرْضِ أَبَوَيْهِ مُنْتَ لِيَشُمَّ الْمَعْرُوفَةَ بِمُونتِيخَارٍ حَالِيًّا، وَهِيَ عَزْبَةٌ قَرِيبَةٌ مِنْ وَلُبَّةٍ. وَأَصْلُ جَدِّهِ يَزِيدُ فَارِسِيٌّ، أَسْلَمَ وَأَوَّلُ مَنْ دَخَلَ مِنْهُمْ بِلَادَ الْمَغْرِبِ، وَكَانَتْ بَلَدُهُمْ قُرْطُبَةَ فَوُلِدَ ابْنُ حَزْمٍ بِهَا فِي سَلْخِ نِهَايَةِ رَمَضَانَ مِنْ سَنَةِ أَرْبَعٍ وَثَمَانِينَ وَثَلَاثِمِائَةٍ.
==========
```
As you can see, the model is mostly accurate, but may make some mistakes, like `وَعَلِّمْ` instead of `وَعَلَّمَ` or `وَفِي كُلِّ خَيْرٍ` instead of `وَ فِي كُلٍّ خَيْرٌ`.

By default, the above `vocalize_text()` function is using Beam Search decoding (`num_beams=4`), you can use sampling by setting `do_sample=True` and `temperature` to a value between 0 and 1.

## Limitations
As mentioned in the [dataset card](https://huggingface.co/datasets/Abdou/arabic-tashkeel-dataset), the dataset is largely religious classical Arabic texts (~90%), so the model may not be perfect for Modern Standard Arabic or dialects.