Docs · Build
Pipelines
How the Hebrish components fit together with other open models. The main one goes from text to speech: an AI writes English with Hebrew words in it, and a voice reads it with the Hebrew words said as Hebrew. The second goes the other way, from speech to text.
Text to speech for code-switched English
English text-to-speech reads makolet as "MACK-oh-let". Romanized Hebrew is written in the same Latin letters as the English around it, so nothing in the text tells the voice that the language changed. The stack below makes every switch explicit before the voice sees the text: find the Hebrew words, write them in Hebrew letters with vowel points, and voice each piece in its own language.
- Step 1 Generate An AI writes English with Hebrew words in Latin letters. Any LLM third-party
- Step 2 Detect Find each span of romanized Hebrew, with its character offsets. Hebrew-Latin Token Classifier Hebrish
- Step 3 Hebrew script Write each span in Hebrew letters. Lexicon, then TaatikNet third-party
- Step 4 Niqqud Add the vowel points, so the voice does not guess the pronunciation. DICTA nakdan third-party
- Step 5 Speak Split at every language boundary; voice each piece in its language, one voice throughout. Chatterbox Multilingual or Azure third-party not run yet
One sentence through every step
The sentence is the pipeline repository's worked example, and the outputs below are its real outputs (run on 2026-10-20, CPU), except the audio, which has not been produced yet.
-
1 · Generate third-party
An AI writes the text
The pipeline was built for My Weird Prompts, an AI-generated podcast produced in Jerusalem: a script-writing agent writes each episode in English, and when an episode is about life in Israel, Hebrew terms arrive in Latin letters. Any LLM output, or any human writing, works the same way: nothing is asked of the writer. Hebrish has no component here. Its own training sentences are written by an LLM using the canonical romanizations in the lexicon (
terms.csv), and that spelling list is a useful thing to give a writing model.I need to go to Bituach Leumi before the makolet closes. -
2 · Detect Hebrish
The classifier identifies the romanized Hebrew
The Hebrew-Latin Token Classifier (Hugging Face, MIT) marks each span of Hebrew in Latin letters, with character offsets and a confidence score; multi-word terms come out as one span. Span F1 is 0.941 on terms it never saw in training. It flags by pronunciation, not etymology: Shabbat and kosher are left alone, because English already says them. It is the one step that had no existing model, and the reason the rest of the chain can work.
I need to go to Bituach Leumi before the makolet closes.Bituach Leumi16–29, score 0.998 ·makolet41–48, score 0.999 -
3 · Hebrew script third-party
Convert to Hebrew characters
A curated lexicon of expected terms first, then TaatikNet (
malper/taatiknet, a ByT5 transliteration model) one word at a time for anything not in it. TaatikNet guesses each word without context, and in the same run it got two of four wrong: savta came out סַוְטָה (should be סַבְתָּא) and iriya started with the wrong letter. That is why the lexicon comes first.Not built yet: the lexicon in the repository is a four-entry demo. The Hebrish term list has the canonical romanization of 1,166 terms but a Hebrew spelling for almost none of them, so a production lexicon is still to be made.
Bituach Leumi→ ביטוח לאומי ·makolet→ מכולת (both from the lexicon) -
4 · Niqqud third-party
Add the vowel points
Hebrew is normally written without vowels, so the same letters can be read more than one way. DICTA's nakdan (
dicta-il/dictabert-large-char-menaked, CC-BY-4.0) adds niqqud (nikud) to the lexicon forms. TaatikNet's output is already pointed and passes through. It needstransformers<5: under 5.x it silently returns the text without points.בִּטּוּחַ לְאֻמִּי · מַכֹּלֶת
-
5 · Speak third-party not run yet
TTS with the language boundaries marked
First plain code, not a model: split the sentence at every switch, one language per piece. That part runs, and its output is below. Then each piece goes to the voice with its language. Chatterbox Multilingual (MIT) takes a
language_idper call and has no inline switch, so each piece is voiced separately with the same voice prompt and the clips are joined. Among hosted engines, Azure's multilingual voices accept an inline<lang xml:lang="he-IL">tag in SSML; Google documents Hebrew in that tag as unsupported, and Amazon Polly has no Hebrew. The Chatterbox script and the Azure SSML generator are written but have not been run, so no audio is published yet.("I need to go to ", en)(בִּטּוּחַ לְאֻמִּי, he)(" before the ", en)(מַכֹּלֶת, he)(" closes.", en) -
Out
One voice, with the Hebrew words said as Hebrew
examples/.What is built, and what is not
| Step | Component | Whose | Status |
|---|---|---|---|
| 1 · Generate | Any LLM | Third-party | Input; nothing required of it |
| 2 · Detect | Hebrish/Hebrew-Latin-Token-Classifier | Hebrish | Published (v1, 2026-10-15); demo Space and Replicate API |
| 3 · Hebrew script | Curated lexicon, then malper/taatiknet | Third-party model; lexicon to be built | Runs; the lexicon is a four-entry demo |
| 4 · Niqqud | dicta-il/dictabert-large-char-menaked | Third-party (DICTA) | Runs |
| 5 · Speak | Segmenting code; Chatterbox Multilingual or Azure SSML | Plain code; third-party TTS | Segmenting runs; the TTS call is written, not run |
It is a documented pipeline, not a packaged service. The repository has the code for steps 2 to 5, the real outputs and the traps found along the way, and there is a white paper (PDF, 5 pages). Anyone is welcome to wrap it in a container, put it on Replicate or a Space, and share it.
# Steps 2 to 4 and the split (CPU is fine; the first run downloads about 3.5 GB of models)
uv run --with torch --with "transformers<5" --with sentencepiece \
python pipeline/text_stages.py "I need to go to Bituach Leumi before the makolet closes."
Why the switches are decided in code. Every switch is visible before the voice sees the text, so what was detected can be read, tested and fixed one word at a time. A single multilingual voice trusted to switch on its own gets no signal from romanized Hebrew, and gives no handle on its decisions. Each detected span costs a split, an extra TTS call and an audio seam, so the classifier is tuned for precision: a missed word only gives today's English reading.
The other route: one model. Meorav is the Hebrish text-to-speech model: a full fine-tune of Qwen3-TTS that reads code-switched English with romanized Hebrew directly, with none of steps 2 to 4, and learned the Hebrew words from recordings. It speaks in one voice, Daniel's. It is experimental and not evaluated yet. The pipeline above works with any voice its TTS engine offers; Meorav needs no Hebrew script at all.
The other direction: dictation
The Hebrish speech recognition models go from speech to the same kind of text: English with the Hebrew words romanized.
-
1 · Speak
Dictate into the Hebrish app
The Hebrish apps (Android keyboard, desktop) run the model on the device; the audio does not leave it.
-
2 · Transcribe Hebrish
Sabich or Jachnun
Sabich, the recommended model (code-switching and tech vocabulary), or Jachnun (code-switching only): fine-tunes of NVIDIA Parakeet TDT 0.6B v2 that write the Hebrew words in Latin letters instead of guessing English ones. This is Jachnun v1.0's verbatim output on a recording it was not trained on (public benchmark, 2026-10-19):
Yes, you can pay with a kartis ashrai, but if you pay mezuman there's a small discount. -
3 · Optional Hebrish
Find the Hebrew in the transcript
The transcript is code-switched text, so the token classifier can mark its Hebrew spans, for highlighting, for a glossary, or to hand the text on to steps 3 to 5 of the pipeline above.
Sources: the pipeline repository (README and docs/pipeline.md, checked 2026-10-20), the classifier page and the Meorav page. See also Integrate and Stack.