Introduction

Japanese is one of the hardest languages for a small voice model, because the same kanji can be read several ways and numbers change sound depending on what they count. ConwayResearch (the team behind Underdog) just took that on with Underdog Woof Japanese, an open-weight text-to-speech model that fits in a single 40.5 MB file and runs on a laptop CPU with no GPU, server or API key.

It landed on Hugging Face on November 10, five days after its English sibling, which we covered in Underdog Woof's 40 MB English TTS. It's free for non-commercial use, and commercial use needs a license.

What Shipped

  • Model: Underdog Woof Japanese by ConwayResearch, released November 10, 2026.
  • Size: one 40.5 MB int8 weights file, with both voices included.
  • Voices: two built-in Japanese voices, Misa (the default) and Mikasa. There's no voice cloning.
  • Audio: 24 kHz mono.
  • Runtime: plain NumPy plus pyopenjtalk-plus for the Japanese front end. No PyTorch and no GPU.
  • Speed and memory (vendor figures): about 14.5 times faster than real time on one Apple M5 Max CPU thread, with roughly 437 MB of peak memory.
  • License: Underdog Non-Commercial License 1.0. Personal projects, research, teaching and non-profits can use it with credit. Paid products, ads, monetized videos and company work need a commercial license from Conway, and you can't use the model or its audio to train another speech model.

The Hard Part: Reading Japanese Right

Woof leans on Open JTalk to work out the reading and pitch accent of each kanji, then speaks it. The card says it handles dates, times, prices, counters like 3本 and 8日, phone numbers, postal codes after 〒, addresses written like 1-2-3, and mixed codes such as K54-3920 the way a person would say them.

It also checks its own work. Text is spoken one sentence at a time (sentences over 60 characters get split again at commas), and if a take runs far too long or has more than a second of silence in the middle, Woof redraws it up to three more times and keeps the best one. Pass a seed and the same text gives the same audio every time.

The Numbers

These are ConwayResearch's figures, measured in November 2026. They're kana error rates on 446 Japanese test sentences: 165 everyday ones and 281 hard ones packed with numbers, addresses, loanwords and tricky kanji. Whisper large-v3 transcribed each clip, and both the transcript and the script were turned into kana with Open JTalk and compared character by character. Lower is better.

  • Underdog Woof Japanese (40.5 MB): 1.33% on hard sentences, 0.17% on everyday ones.
  • Fish Audio Drama 3 (41.5 GB): 2.39% hard, 0.27% everyday.
  • Qwen3-TTS 1.7B (4.54 GB): 8.88% hard, 3.96% everyday.
  • Kokoro (327 MB): 11.27% hard, 0.62% everyday.

Keep the caveat in mind: this measures whether each model reads the text correctly, not how natural or expressive it sounds. It's also the vendor's own test set, and Woof uses Open JTalk both to speak and to score, which may favor it. Still, getting addresses and prices right is exactly where small Japanese voices usually stumble.

On our own test box, an 8-core Linux VM with no GPU, we limited Woof to a single thread. Mikasa spoke an 8.4-second weather sentence in under two seconds, model loading included, and the file came out at 24 kHz as promised.

How to Run It

You only need Python, NumPy and pyopenjtalk-plus:

pip install numpy pyopenjtalk-plus
hf download ConwayResearch/Underdog-Woof-Japanese --local-dir underdog-woof-ja
cd underdog-woof-ja
python -m underdog_woof_ja "ご予約は午後3時15分、お一人様3,500円です。" hello.wav
python -m underdog_woof_ja "ご予約は午後3時15分、お一人様3,500円です。" mikasa.wav --voice mikasa

From Python, it's just as short:

from underdog_woof_ja import Woof

tts = Woof(voice="mikasa")   # "misa" (default) or "mikasa"
audio = tts("おはようございます!今日は一日中雨が降るそうなので、傘を持って行ってくださいね。", seed=0)
tts.save("hello.wav", audio)   # float32 mono, 24 kHz

Pro Tip

Write your text the way you normally would, with kanji, numbers and symbols, rather than converting it to kana first. The whole point of Woof's front end is reading things like 〒150-0041 and 3,500円 correctly, so feeding it pre-flattened kana throws that advantage away. You may see a warning that ONNX Runtime isn't installed. Woof still runs fine without it, and installing pyopenjtalk-plus[onnxruntime] just turns on an extra reading-prediction helper inside Open JTalk.

Where It Fits

Woof Japanese is built for offline voice in places where a few hundred megabytes of memory is all you get: hobby assistants, visual-novel and game prototypes, reading tools, kiosks and accessibility projects. If you need something commercial out of the box, you'll have to talk to Conway first, or look at our coverage of Zen TTS 1.2 for Japanese in the browser and compare licenses.

Remember the credit rule if you publish anything made with it: the license asks for "Underdog Woof" or "underdog.ai" in the title or description, and "Voice by Underdog Woof" in any app that uses it.

Conclusion

Underdog Woof Japanese packs two Japanese voices and a careful kanji-and-numbers reader into 40.5 MB, and it runs on one CPU thread. The non-commercial license limits where you can ship it, but for personal and research projects it's a tiny, clever voice worth trying. Grab a tricky address or a price list and see how it does.

—Anabel ♡