How to Write Arabic Scripts for Text to Speech

Arabic script for text to speech, with a price rewritten in words on a phone screen
On this page
  1. What Makes a Good Arabic Script for Text to Speech?
  2. Should an Arabic TTS Script Be Written in Fusha or a Dialect?
  3. How Do You Write Numbers, Prices and Dates in an Arabic TTS Script?
  4. When Should You Add Tashkeel to an Arabic Script?
  5. How Should English Words and Brand Names Appear in an Arabic Script?
  6. How Long Should Sentences Be, and How Do You Add Pauses?
  7. Does the Voice’s Gender Change How You Write the Script?
  8. What Does a Rewritten Arabic TTS Script Look Like?
  9. How Can You Check an Arabic Script Before Generating Audio?
  10. Disclaimers

An Arabic text to speech voice can only be as good as the script it reads. Most mistakes people blame on the voice, such as a price read as a string of digits, an abbreviation spelled out letter by letter, or a word read with the wrong vowels, start in the script.

This guide answers the questions writers ask most often about preparing Arabic scripts for an AI voice. It includes a before and after rewrite of a real style of customer service script, a measurement of how much tashkeel adds to script length, and a free Python checker that flags risky text before you generate any audio.

What Makes a Good Arabic Script for Text to Speech?

A good Arabic text to speech script is written for the ear: short sentences, one register, and every number, symbol and abbreviation spelled out as spoken words. If a native speaker could read the script aloud without pausing to decide how to say something, an Arabic AI voice generator usually can too.

Scripts written for reading on a screen rely on the eye to interpret things like 1,250.50 AED, د. or ص.ب. A listener never sees those shortcuts, so the voice has to guess how to say them. Rewriting a script for listening takes six steps:

 Six steps to write an Arabic text to speech script
From choosing the register to listening to the final audio.

For a wider overview of Arabic voices and dialects, see our Arabic AI voice generator guide.

Should an Arabic TTS Script Be Written in Fusha or a Dialect?

Write in formal Arabic (Fusha) when the audience spans several countries or the content is formal, and write in a single dialect when you are speaking to one local market in a conversational tone. Whichever you choose, keep it consistent, because a script that mixes Fusha grammar with dialect words sounds unnatural even with a good voice.

RegisterBest forWatch out for
Fusha (Modern Standard Arabic)Government services, e learning, news, documents, audiences across several Arab countriesCan sound distant in friendly ads and social video
Gulf dialect (Saudi, Emirati)Local ads, customer service, social content for one Gulf marketSpelling of dialect words varies; choose one spelling and keep it
Mixed Fusha and dialectRarely the right choiceListeners notice the switch; voices may change tone mid sentence

Match the voice to the script, too: a dialect script read by a Fusha voice, or the reverse, loses most of its natural feel.

How Do You Write Numbers, Prices and Dates in an Arabic TTS Script?

Write every number that matters as words, in the form you want spoken. Arabic numbers change with grammar, so a voice that reads digits may pick the wrong form, and prices, dates, times and phone numbers each have their own spoken pattern.

Gender agreement is a common trap. With numbers from three to ten, the number takes the opposite gender to the singular noun, as UC Davis’s Arabic grammar notes explain: ثلاثة بيوت (three houses) but ثلاث سيارات (three cars). Writing the number as a word lets you control that form.

Written in the scriptWhy it causes problemsWrite this instead
1,250.50 AEDComma, decimal point and a Latin currency codeألف ومئتان وخمسون درهماً وخمسون فلساً
عندي 3 كتبNumber must agree with the nounعندي ثلاثة كتب
من 8 ص إلى 5 مAbbreviated timesمن الثامنة صباحاً حتى الخامسة مساءً
15%Symbol may be skipped or misreadخمسة عشر بالمئة
29/10Day and month order is unclearالتاسع والعشرون من أكتوبر
800 1234May be read as one large numberثمانية، صفر، صفر، واحد، اثنان، ثلاثة، أربعة

Currency symbols deserve special care. The UAE Central Bank unveiled a new dirham symbol in March 2025, and the Saudi Central Bank announced a new riyal symbol in February 2025 that Unicode planned to add in version 17.0. Symbols this new may not be read correctly by every system, so write درهم or ريال in full.

When Should You Add Tashkeel to an Arabic Script?

Add tashkeel (vowel marks) only to words that can be read more than one way, plus names and rare words. Fully vowelling a script is rarely necessary for a good Arabic voice, and it makes the script much longer.

Many Arabic words share the same letters and differ only in their vowels. A voice chooses a reading from context, which usually works, but short scripts and headlines give it little context to go on.

Word without tashkeelPossible meaningsWith tashkeel
علمknowledge, flag, he knewعِلْم ، عَلَم ، عَلِمَ
كتبhe wrote, books, it was writtenكَتَبَ ، كُتُب ، كُتِبَ
ملكking, ownership, he ownedمَلِك ، مُلْك ، مَلَكَ
حبlove, seeds or grainsحُبّ ، حَبّ

We measured what tashkeel does to script length. Across three everyday sentences, full tashkeel added 64% to 83% more characters, 72% overall. Marking only the one ambiguous word in a sentence added 14%.

Bar chart comparing the character count of an Arabic sentence with no, partial and full tashkeel
Our measurement, October 2026: partial tashkeel keeps scripts short.

Length matters because many text to speech tools, Munsit included, count usage in characters, and long scripts are also harder to proofread. For formal text that does need full vowels, such as teaching material or religious content, Munsit’s API offers a tashkeel tool that adds the marks automatically. Our guide to how natural Arabic text to speech works explains why vowels shape pronunciation and rhythm.

How Should English Words and Brand Names Appear in an Arabic Script?

Keep a brand name in Latin letters if the voice pronounces it the way the brand wants, and write it in Arabic letters if it does not. Test both versions once, then use the same spelling every time the name appears.

Gulf audiences switch between Arabic and English all the time, so a natural script often includes English terms. Our guide to dialects and code switching in Arabic covers why that matters for voice technology. Three rules keep it under control:

  • Spell out abbreviations. Write ضريبة القيمة المضافة rather than VAT, unless your audience says the letters.
  • Choose one Arabic spelling for each name. Brand names often have several Arabic spellings; pick the one closest to how your customers say it.
  • Avoid English in the middle of an Arabic phrase where possible. Place English names at natural breaks so the voice does not change rhythm mid sentence.

How Long Should Sentences Be, and How Do You Add Pauses?

Keep most sentences under about 20 words, with one idea each, and let punctuation create natural pauses. Use pause tags only when you need an exact silence, such as before a menu option or between sections.

How to pauseWhat it doesRules to know
Full stop or question mark (؟)Ends the sentence; the tone falls or risesUse the Arabic question mark in Arabic text
Arabic comma (،)Short breath inside a sentenceToo many commas make speech choppy
New sentence instead of “و”Breaks a long chain of clauses joined with andArabic writing often links clauses with و; split them for listening
Pause tag <break time="1s"/>Inserts an exact silenceIn Munsit, time needs a unit (s or ms), up to 3 seconds per tag, up to 20 tags and about 30 seconds of pauses per request

Speed can also be adjusted in the voice settings. Munsit supports speeds from 0.7 to 1.2, so slow down a dense script slightly rather than adding pauses everywhere. Our guide to designing Arabic voice UX covers pacing for phone menus and voice assistants.

Does the Voice’s Gender Change How You Write the Script?

Yes. Arabic marks gender in adjectives and many verbs, so a script must match the speaker’s gender and, where it addresses the listener, the listener’s gender too. A female voice saying أنا جاهز instead of أنا جاهزة (I am ready) sounds wrong to every native listener.

When one script must work for any voice or any listener, use neutral phrasing. يسعدني أساعدك (I am happy to help you) works for a male or female speaker, and plural or impersonal forms avoid choosing the listener’s gender.

What Does a Rewritten Arabic TTS Script Look Like?

A rewritten script replaces every digit, code, abbreviation and long sentence with plain spoken Arabic, and keeps pause tags short and valid. The example below shows a typical customer service message before and after rewriting for text to speech.

An Arabic customer service script before and after rewriting for text to speech
Example script written for this article. Highlights show what changed.

The rewrite is slightly longer, but every line now has one obvious spoken form. For more examples of phone scripts, see our guide to the best Arabic text to speech voices for call centres.

How Can You Check an Arabic Script Before Generating Audio?

Before you send a script to any AI voice generator, run it through a quick automated check for digits, symbols, abbreviations, long sentences and invalid pause tags, then listen to every line once. The automated check catches mechanical problems in seconds; listening catches the rest.

We wrote a small Python checker for this article. It flags numbers, symbols and Latin or Arabic abbreviations, sentences over 25 words, pause tags without a unit or longer than 3 seconds, and scripts with more than 20 pause tags or more than 30 seconds of pauses.

python
check_script.py
  import re
  import sys
   
  BREAK = re.compile(r'<break\s+time="([^"]*)"\s*/>')
  TIME = re.compile(r"^(\d+(?:\.\d+)?)(ms|s)$")
  NUMBER = re.compile(r"\d[\d,.:/]*")
  SYMBOL = re.compile(r"[%$\u20ac\u00a3&@#+=/\\]|\u20c1")
  CAPS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  LATIN_CAPS = re.compile(rf"\b[{CAPS}]{{2,6}}\b")
  AR_ABBR = re.compile(r"(?<!\S)(\w)\.(?=\s|$)")  # one letter + dot
  SENTENCE = re.compile(r"[^.!?\u061f\u061b\n]+")
  HIDDEN = re.compile("[\u0640\u200e\u200f\u202a\u202b\u202c\u202d\u202e]")
  MAX_WORDS = 25
   
   
  def check(text):
      issues = []
      for n, raw in enumerate(text.splitlines(), 1):
          line = BREAK.sub(" ", raw)               # ignore pause tags here
          for m in NUMBER.finditer(line):
              issues.append((n, "number", m.group()))
          for m in SYMBOL.finditer(line):
              issues.append((n, "symbol", m.group()))
          for m in LATIN_CAPS.finditer(line):
              issues.append((n, "abbreviation", m.group()))
          for m in AR_ABBR.finditer(line):
              if "\u0600" <= m.group(1) <= "\u06ff":   # Arabic letters only
                  issues.append((n, "abbreviation", m.group()))
          if HIDDEN.search(line):
              issues.append((n, "hidden mark or tatweel", ""))
          for s in SENTENCE.findall(line):
              words = len(s.split())
              if words > MAX_WORDS:
                  issues.append((n, "long sentence", f"{words} words"))
      tags = BREAK.findall(text)
      total = 0.0
      for value in tags:
          m = TIME.match(value)
          if not m:
              issues.append((0, "pause has no unit", value))
              continue
          seconds = float(m.group(1)) / (1000 if m.group(2) == "ms" else 1)
          if seconds > 3:
              issues.append((0, "pause over 3s", value))
          total += min(seconds, 3)
      if len(tags) > 20:
          issues.append((0, "too many pause tags", str(len(tags))))
      if total > 30:
          issues.append((0, "pauses over 30s in total", f"{total:.1f}s"))
      return issues
   
   
  if __name__ == "__main__":
      script = open(sys.argv[1], encoding="utf8").read()
      issues = check(script)
      if not issues:
          print("no issues found")
      for line, kind, detail in issues:
          where = f"line {line}" if line else "whole script"
          print(f"{where:<13} {kind:<24} {detail}")

Run it with python check_script.py script.txt. On the “before” script above it found 12 issues in four lines. The rewritten script passed with none.

 Output of a Python checker listing problems in an Arabic text to speech script
Our checker’s report on the example script.

Once the script passes, paste it into the Munsit text to speech studio to listen, or send it through the API. Our Arabic text to speech API guide for developers shows how to automate the same checks before every request.

Disclaimers

  • The tashkeel measurement used three short sentences we wrote and vowelled for this test in October 2026. Other texts will give different percentages.
  • The example script and checker were written for this article. The checker flags common risks; it does not guarantee correct pronunciation, so always listen to the audio.
  • Munsit settings and limits, including pause tag rules and speed range, come from its public documentation reviewed in October 2026 and may change.
  • Grammar examples are simplified. Usage varies between Fusha and dialects.
  • Product names belong to their respective owners. Their mention does not imply affiliation or endorsement.

Frequently asked questions

Should I write numbers as digits or words in an Arabic text to speech script?

Write numbers as words whenever the exact spoken form matters, such as prices, dates, times and phone numbers, because Arabic numbers change with grammar and a voice reading digits may choose the wrong form.

Do Arabic text to speech scripts need full tashkeel?

Arabic text to speech scripts rarely need full tashkeel; vowel marks are most useful on words with more than one reading, names and rare words, while full tashkeel made our test sentences 64% to 83% longer.

Should an Arabic voiceover script be in Fusha or dialect?

An Arabic voiceover script should be in Fusha for formal content or audiences across several countries, and in one dialect for conversational content aimed at one local market, without mixing the two.

How do I add a pause in an Arabic text to speech script?

Use Arabic punctuation for natural pauses and a pause tag such as <break time="1s"/> for exact silences; in Munsit the time needs a unit, each tag allows up to 3 seconds, and a request allows up to 20 tags.

How should currency appear in an Arabic text to speech script?

Currency in an Arabic text to speech script should be written in words, such as درهم or ريال, rather than codes like AED or the new dirham and riyal symbols introduced in 2025.

How long should sentences be in an Arabic text to speech script?

Sentences in an Arabic text to speech script work best at under about 20 words with one idea each, which keeps the voice’s rhythm natural and makes errors easier to find.

ShareLinkedInXWhatsApp