How does Underdog's Woof read phone numbers right in just 40 megabytes?
Underdog's Woof packs two English voices into 40.6 MB and speaks on one CPU thread. We explain why it reads numbers right, how it was built and measured, and how to try it in the browser or on your own computer.
Most of what voice assistants and phone agents read is not plain prose. They read appointment times, order codes, medication doses and phone numbers. That is exactly where small voice models stumble: they read a phone number as one huge figure or swallow half of a code. So good voices usually come from big models and cloud services. Woof, released by the Underdog team, flips that balance. With both of its voices the model is 40.6 MB, and it speaks on a single laptop CPU thread using nothing but numpy.
Woof comes from Conway, the team behind Underdog, a personal AI assistant that runs on your own device. The one-voice version was announced on 26 October and can be tried in the browser; the two-voice version was uploaded to Hugging Face on 5 November. According to the model page, two-voice Woof gets 1.42% of words wrong on a test made of hard sentences. The closest open model in the comparison, Fish Audio Drama 3, is a 41.5 GB download and gets 1.89% wrong.
What it reads so well
A big part of Woof's secret is a text normalizer that runs before the model. This rule-based normalizer rewrites numbers, dates, times, money, codes and symbols the way people say them. Using the announcement's examples: "020 7946 0018" is read digit by digit in groups, "14/03" as "the fourteenth of March", "$1,249.50" as dollars and cents, "XK-4471" letter by letter and digit by digit, "2.5 mg" as "two point five milligrams". Hard names get a pronunciation lexicon. The normalizer needs nothing beyond Python's standard library, and you can switch it off and do your own.
Long text is split into sentences, and a sentence over 120 characters is split again at commas and semicolons. The model checks each piece after making it. If the audio runs far too long for its text, or has a second or more of silence in the middle, the piece is drawn again up to three more times and the best take is kept. Pass a seed to get the same audio for the same text every time.
How it was built
Woof has two parts: a 22.95-million-parameter speech model and a 15.3-million-parameter audio decoder, 38.24 million parameters in total. The decoder is adapted and changed from the decoder of Mimi, the open audio codec from the French research lab Kyutai. The speech model turns text into audio representations that Mimi understands, and the decoder turns them into 24 kHz mono audio. The two voices, Juno and Mira, live in the same file.
The training data includes two open datasets: LibriTTS-R, cleaned from audiobook recordings by Yuma Koizumi and colleagues, and Emilia-YODAS, collected from a wide range of speech by the Amphion team. All three works are CC BY 4.0. The team has not shared its training steps or duration in detail. The settings on the model page show that audio is refined over several steps, with 16 by default. Fewer steps mean more speed: the one-voice model runs at 18x real time at 16 steps, 24x at 8 and 29x at 4. The one-voice model is compressed to int8 and weighs 31.7 MB.
The team made two sizes. The one-voice model is 31.7 MB and runs in the browser; once loaded it keeps talking with Wi-Fi off, and what you type stays on the device. The two-voice model is 40.6 MB and on Hugging Face, with its own runtime in plain numpy, so not even PyTorch is needed. A curious detail: the two-voice model is lighter at peak memory, 402 MB. About 330 MB of the one-voice model's 852 MB comes from the PyTorch and Transformers libraries themselves.
How it was measured
Voice models are usually scored by word error rate: the model reads a script, a speech recognizer writes down what it heard, and the words that differ from the script are counted. Woof's main test is 500 sentences from Gradium's TTS Hard Cases set, all packed with numbers, dates, prices, codes and web addresses. The team changed the method here. Because something like "14/03" can be written down correctly in more than one way, qwen3.8-omni-flash transcribes the clips and gemma-4-31b-it counts the errors. The team says it ran and scored every model itself this way.
In the results table, two-voice Woof leads at 1.42%. Behind it come Fish Audio Drama 3 (1.89%), the 55.1 MB Phonon 31m (2.16%), and cloud services such as Deepgram, Microsoft MAI-Voice and Mistral Voxtral 3. Among on-device models Kokoro 82M scores 5.17% and Qwen3-TTS 1.7B 11.99%. The only model smaller than Woof is the 27.6 MB Kitten Nano 0.8, at 9.81%. One-voice Woof scores 2.05% on everyday sentences and 0.91% on 30 expressive, conversational lines.
Speed was measured on one CPU thread of an Apple M5 Max. The one-voice model makes 13.2 seconds of speech in 0.73 seconds and says a 2.3-second sentence in 0.12 seconds. The two-voice model runs at 13.8x real time with the Juno voice and 7.2x with Mira.
How to try it
The easiest way is the browser: type a line on underdog.ai/woof and listen. The page also has a small escape room where every voice is generated live by Woof. To run the two-voice model on your own computer, these commands are enough:
pip install numpy
hf download ConwayResearch/Underdog-Woof --local-dir underdog-woof
cd underdog-woof
python -m underdog_woof "Your order ships on March 3rd. Call 415-555-0199." -o hello.wav
python -m underdog_woof "Your order ships on March 3rd. Call 415-555-0199." --voice mira -o mira.wavFrom Python it is called with Woof(voice="mira") and saves a 24 kHz audio file. For now the model speaks English only and comes with two voices.
The license is free for personal projects, research, teaching and non-profits, and audio made with Woof can be published with credit to "Underdog Woof" or "underdog.ai". Use in paid products, ads and monetized videos needs a commercial license from Underdog. Using Woof's audio to train another voice model is not allowed under the license.
All the results shared are the team's own measurements, and other AI models do the transcription and error counting. A 40 MB model speaking this accurately on the device makes server-free voice a much stronger option for app developers; independent listening tests will sharpen the picture.
Sources: Hugging Face model page, Underdog Woof announcement, License, Gradium TTS Hard Cases, Kyutai Mimi