top of page

The Master Guide / 10 Voice and lip sync · Voice and Arabic dialects

Measured checks and the back-check

Every take is transcribed and compared, word by word, with its canonical line. A wrong content word, number or name fails the take.

Every take is transcribed and compared, word by word, with its canonical line. A wrong content word, number or name fails the take.

The transcription engine

ElevenLabs Scribe v2 [official guidance], through the API or the ElevenLabs web app's speech-to-text; it is described in The brief and research → Voice notes into text, and an independent benchmark found it the most robust on Egyptian–English and Saudi–English code-switched speech. Arabic still sits in ElevenLabs' "Good" tier (10–20% word error), so judge mismatches word by word, never by the error rate. A transcript is a measurement: dialect, accent and prosody still go to a native ear.

  • Settings:

    • language automatic;

    • keyterms from your pronunciation sheet;

    • speaker labels on for exchanges, off for single lines;

    • word timestamps on.

  • Egyptian cross-check: run Gemini 3.5 Transcribe, set to Egyptian Arabic, on every Egyptian take. Its custom vocabulary can't be combined with timestamps, so use it for words, not timing.

  • Never use faster-whisper (a free Whisper build) for dialect content: it scored 44–46% word error on Gulf and Najdi. It is for an English caption clock only.

  • Cost: about $0.0045 a minute with keyterms on Scribe, about $0.005 a minute on Gemini (read 19 Oct 2026); small enough for every take. It is paid in US dollars, never in Higgsfield credits.

  • Data: check the client's NDA before uploading their material anywhere. Use Gemini only on a paid key, because the free tier's terms let Google use the data.

The back-check

Run it on every Arabic and English take:

  1. Transcribe the take.

  2. Normalise both texts the same way:

    • strip the vowel marks;

    • turn every form of alif into a plain alif;

    • turn alif maqṣūra into yā', and tā' marbūṭa into hā';

    • write numbers as words;

    • remove the elongation stroke and punctuation;

    • collapse spaces.

  3. Compare word by word with the canonical line, never the engine text. List wrong content words (nouns, verbs, adjectives, the brand), numbers, prices and dates, names, and any English term that came back in Arabic script or the reverse. A brand written in Arabic script in the engine text is expected back in Arabic script: match it by the pronunciation sheet.

  4. The flag: a wrong content word, number or name fails the take; fix the text on the fix ladder and regenerate. Differences in small function words are noted, not failed.

  5. Egyptian: a word both Scribe and Gemini get wrong is a strong flag.

  6. Calibrate the flag over your first 20 or so production takes, measured from takes you made anyway: compare "no wrong content words" with the native reviewer's verdicts. If it fails to predict a pass in more than 2 of 20, tighten the rule, for example by failing on function words too.

Normalise

From

To

Alif forms

«أ إ آ ٱ»

«ا»

Alif maqṣūra

«ى»

«ي»

Tā' marbūṭa

«ة»

«ه»

By hand: normalise the transcript and the canonical line the same way, then compare them word by word; any digit left in either text is a number to check by hand (steps below).

Timing, from the word timestamps of the locked take:

  • the speech onset (the first word's start);

  • the spoken span, from the first word's start to the last word's end, to 0.1 s, padding excluded;

  • every pause of 0.8 s or more;

  • the emphatic beat;

  • words per second (words ÷ span).

A frame is round(seconds × fps) at the sequence rate. Without timestamps, read the pauses off the waveform, or list them with a silence detector set just above the take's noise floor (steps below). Lip-sync timing: see Speaking shots and lip sync → Route 2, the Arabic default.

A worked back-check, written for this guide. The canonical Najdi line:

«وش صار؟ ترى أمك تتصل عليك من الصبح.»

The transcript:

«وش صار ترى امك تسأل عليك من الصبح»

After normalising, one content word differs: "calls" came back as "asks after". The take fails; fix that word on rung a, regenerate, and the native reviewer still judges the take you accept.

Do it yourself

Normalise and compare the two texts (a text editor and a word diff)

Paste the transcript and the canonical line into a text editor, and apply the same three steps to both.

  1. Strip the marks. Turn on regular expressions in Find and Replace, find the class below, and replace it with nothing. It removes every vowel mark (U+064B–U+065F, U+0670 and U+06D6–U+06ED) and the elongation stroke (U+0640). In VS Code (and most editors that use JavaScript-style expressions), write:

[\u064B-\u065F\u0670\u06D6-\u06ED\u0640]
In Notepad++ or Sublime Text, write:
[\x{064B}-\x{065F}\x{0670}\x{06D6}-\x{06ED}\x{0640}]
The first range stops at U+065F because the Arabic-Indic digits start at U+0660, and a wrong number must still show up in the comparison.
  1. Apply the three letter rows of the table above, and remove the punctuation (the Arabic comma, semicolon and question mark and their Latin forms, full stops, ellipses, exclamation marks, and any «» quote marks you pasted), as plain replaces with regular expressions off. Replace each punctuation mark with a space, so two words never run together; the word diff ignores the extra spaces.

  2. Compare the two word by word with any word-level diff, for example git diff --no-index --word-diff canonical.txt transcript.txt. Any digit left in either text is a number to check by hand.

List the pauses without timestamps (ffmpeg)

  1. Run this on the take, setting the noise level just above the take's floor:

ffmpeg -i take.wav -af silencedetect=noise=-35dB:d=0.8 -f null -

Sources

  • Perle AI's code-switching benchmark of Arabic transcription (arXiv 2605.19069); ElevenLabs, speech to text.

bottom of page