I live in Jerusalem and speak English, so I talk like this all day:
"I have to go to Bituach Leumi tomorrow."
"Can you grab some bamba from the makolet?"
"We're doing Motzei Shabbat at my savta's."
The sentences are English, but a few of the words are Hebrew, and nobody uses an English
word in their place. This is code-switching, and speech recognition handles it badly.
Today I'm releasing
**[Parakeet-TDT-0.6B-v2-English-Hebrew-Codeswitching](https://huggingface.co/danielrosehill/Parakeet-TDT-0.6B-v2-English-Hebrew-Codeswitching)**,
a fine-tune of NVIDIA's `parakeet-tdt-0.6b-v2`
that writes those Hebrew words correctly, in Latin letters. It comes as .nemo, GGUF, ONNX
and sherpa-onnx, and it runs offline on an Android phone.
| Transcript | |
|---|---|
| Stock Parakeet v2 | I want to go to the Micollette today to buy my groceries. |
| This fine-tune | I want to go to the makolet today to buy my groceries. |
Makolet (מכולת) is the Israeli corner grocery shop. Stock v2 has never heard the word, so
it guesses an English-looking name.
On a held-out test set where none of the Hebrew words appear in training:
| | Stock v2 | This fine-tune (v2) |
|---|---|---|
| Code-switching WER | 9.9% | 4.8% | | Hebrew words never seen in training, correct | 29% | 50% | | Hebrew words seen in training, correct | 38% | 75% | | Long-form dictation WER (~3 min files) | 7.8% | 4.5% | | My plain English WER | 2.7% | 2.4% | | LibriSpeech test-clean WER | 1.2% | 1.1% |
Code-switching errors halved, and English did not get worse.
Parakeet v2 is one of the most accurate English models small enough to run on a phone. NVIDIA
also released v3, which adds 25 European languages, but in my own dictation v2 was more
accurate for English. Since most of what I say is English, I fine-tuned v2.
v2's tokenizer has no Hebrew characters. Replacing the tokenizer would re-initialise the
decoder and need far more data than I have. So the model writes Hebrew words in Latin letters, with one canonical spelling per word:
Before training, I ran stock v2 over every code-switched recording I had: 1,154 occurrences
of 615 Hebrew terms. It got 28% of them right.
The 165 terms it always gets right are mostly names, well-known places, and words that are
already English: Shabbat, Pesach, Bamba. The 390 it never gets right are the everyday
vocabulary of life in Israel: Misrad Hapnim, Bituach Leumi, tzaharon, rofe mishpacha,
Earlier attempts used a desktop microphone. This time every new recording was made on the
phone that runs the model (a OnePlus Nord 3), with its built-in microphone, in the rooms
where I actually dictate.
I built a small capture app in the style of Mozilla Common Voice: it shows a sentence, I
read it, play it back, keep it or retake it, and move on. Takes are pushed in batches to a
public Hugging Face dataset. The sentences come from a bank of about 7,700 prompts, each built around one or two Hebrew terms, and recording is weighted toward the words stock v2
gets wrong.
Everything is public, audio included:
Read-Aloud-Voice-Sentences`` English-Hebrew-Codeswitching-Sentences
The code-switching literature is blunt about one risk: fine-tune only on mixed-language
speech and the model's English collapses. In one study, Whisper-small went from 3.4% to
13.3% WER on LibriSpeech after fine-tuning on code-switched data alone
(Liu et al. 2025). Mixing monolingual data back in fixes most of it. Even 10% replay of the original domain cuts forgetting sharply
(Pekarek Rosin & Siegert 2023). So the training mix, by audio duration, is about:
| Share | Data |
|---|---|
| ~70% | Code-switching takes |
| ~20% | My own plain English, recorded on the same phone |
| ~10% | LibriSpeech replay, with cased and punctuated LibriSpeech-PC transcripts |
A version is only published if neither my own English nor LibriSpeech gets worse than stock
v2. Neither has so far.
| | v1 | **v2 (current)** |
|---|---|---|
| Code-switching training audio | 77 min | 120 min | | Plus English | ~30% | 29 min own + 17 min LibriSpeech | | Training time | 19 min, one GPU | 23 min, one GPU |
Both versions and stock v2 are scored on the same test split, so the bars compare like with
like:
What the extra 43 minutes did: words the model has recordings of improved from 67% to 75%,
and phone dictation got slightly better. Words it has never heard stayed flat (52% vs 50%
is a difference of 3 hits out of 113, which is noise). The real gain on unseen words came
in v1. The model learned how my Hebrew maps to the romanization, not only the training words, and almost doubled its recall on words it had never heard.
Training is cheap: about twenty minutes on one GPU. The bottleneck is recording.
My own test set is drawn from my own dataset, so I also built a separate, frozen benchmark:
the [English-Hebrew Code-Switching ASR Benchmark](https://huggingface.co/datasets/danielrosehill/English-Hebrew-Codeswitching-ASR-Benchmark),
with a [runner](https://github.com/danielrosehill/English-Hebrew-Codeswitching-ASR-Benchmark)
and a [leaderboard](https://huggingface.co/spaces/danielrosehill/English-Hebrew-Codeswitching-ASR-Leaderboard).
Its headline metric is term recall: the share of Hebrew words written with the canonical
spelling. A model can post a low WER and still mangle every Hebrew word.
The fine-tune gets 65.7% of Hebrew terms right, against 45.9% for Whisper Large V3 and 32.6%
for the stock Parakeet it started from, and it has the lowest WER of the group (4.2%). The benchmark is early and has known issues; all of them are documented on the leaderboard.
| You want to… | Get | Run it with |
|---|---|---|
| Dictate on Android | GGUF Q8_0 (730 MB) | Offline Voice Input |
| Android with ≤ 4 GB RAM | GGUF Q4_K_M (475 MB) | Offline Voice Input |
| Dictate on a desktop | GGUF Q8_0 | [Handy](https://github.com/cjpais/Handy) |
| sherpa-onnx apps (Voxtype and others) | [sherpa-onnx int8](https://huggingface.co/danielrosehill/Parakeet-TDT-0.6B-v2-English-Hebrew-Codeswitching-sherpa-onnx-int8) | sherpa-onnx |
| Python on CPU | [ONNX](https://huggingface.co/danielrosehill/Parakeet-TDT-0.6B-v2-English-Hebrew-Codeswitching-ONNX) (int8 / fp32) | [onnx-asr](https://github.com/istupakov/onnx-asr) |
| GPU, or fine-tune it further | [`.nemo`](https://huggingface.co/danielrosehill/Parakeet-TDT-0.6B-v2-English-Hebrew-Codeswitching) (2.47 GB) | NVIDIA NeMo |
On Android, [Offline Voice Input](https://play.google.com/store/apps/details?id=dev.notune.transcribe)
is the one voice keyboard I found that loads arbitrary Parakeet weights. Import the Q8_0 file
and set the app as the system voice input, or use a keyboard whose mic key opens it
(SwiftKey, HeliBoard, FlorisBoard). On five held-out clips, Q8_0 matched the full-precision
model word for word.
Or just try it in the browser: the
demo Space runs stock v2 and the fine-tune side by side on your own audio.
Everything is collected on the
project page and in the
Hugging Face collection. v3 is planned at 180 minutes of code-switching audio, with a comparison of 0%, 10%, 20% and
30% English to find how little English the mix can get away with. The sentence bank keeps
growing: place names, hospitals, Israeli brands and acronyms, and the vocabulary of the 2026
election.
If you speak English in Israel and want this to work for your voice too, recordings from
other speakers are the most useful contribution there is. Get in touch through
[danielrosehill.com/contact](https://www.danielrosehill.com/contact). For professional
work or collaboration, reach me at [carrotcakeai.com](https://carrotcakeai.com).
The model, the data and the benchmark are all CC-BY-4.0, like the base model.