Hayamimi routes each utterance to a specialist model
Hayamimi's central choice is to avoid one general speech model. It detects the language of an utterance, then sends Japanese, Chinese, Korean, Cantonese, English and selected European languages to different ONNX recognizers. Other languages fall back to an omnilingual model. Voice activity detection decides where speech starts and ends, while partial text updates before the final segment arrives. The whole pipeline runs through sherpa-onnx on a CPU.
This design can beat a one-model compromise for the languages its routes handle well, but language identification becomes part of correctness. Our checkout contained 73 files and about 7,187 source lines, small enough to inspect without wading through a framework monorepo. Release v0.1.1 changed language switching so a new language needs two consecutive agreeing detections. That reduces single bad guesses while making a one-segment foreign phrase less likely to switch routes.
The subtitle output is ready for a browser source
Running with --serve exposes a dashboard, a minimal OBS overlay, and a plain transcript view. The dashboard shows partial speech, final lines, language labels, speaker labels, translation, and later refined text. A file mode can replay a 16 kHz mono WAV without real-time sleeps, which is useful for testing before putting a microphone and live audience in the loop. Final transcripts can also be appended to a file.
The Python environment we measured used 925 MB before separate model downloads. Model weights are lazy-loaded, and an LRU limit evicts non-Japanese routes to keep resident memory bounded as languages change. That is sensible for CPU machines, though the first utterance in a new language may pay a model-loading cost. Operators should preload the languages used in an event and test the same microphone, room, and input device before going live.
What happened when we ran it
We cloned commit 0e383d8 into an unprivileged Python 3.12 Debian container with 3 CPUs, 8 GB of RAM, and no secrets. The 1.9 MB checkout held 73 files and roughly 7,187 source lines. It had one CI workflow file, a tests directory, and no root Dockerfile. Our harness evaluated package installation, the project build, automated tests, and Python dependency advisories.
Installation succeeded in 45 seconds. It added 88 packages and occupied 925 MB. The build completed in 4 seconds. Pytest then finished in 6 seconds with all 23 tests passing and none failing. Pip audit reported 0 known vulnerabilities in the installed dependency set. The run was clean across every stage our harness measured.
Those results cover source health and unit behavior, not speech accuracy or microphone capture. Our sandbox did not download the speech catalog, listen to audio, measure latency, or compare transcripts. The README contains the project's own scorecards and reproduction scripts, which are useful evidence from the author but remain separate from our run. A local acceptance set should include the user's actual languages, speakers, proper nouns, noise, and code-switching habits.
One-language-per-utterance is the hard boundary
Hayamimi can switch routes between complete utterances. It does not support words from two languages inside the same utterance. The README says the minority language may be damaged or dropped, which is common in Japanese conversations that insert English product names. A replacement dictionary can repair known output after decoding, but it cannot restore arbitrary speech that the wrong model never recognized.
Issue 2 also corrects an important control misunderstanding. The documented --lang-switch-guard does not decide when the session changes languages in the implementation examined by the reporter. A separate confirmation count does that, and the issue says it is not exposed through the CLI. In the reported 10-minute Japanese file, 4 of 85 finals routed to Chinese despite a large guard value. Pin one language where the event does not need switching.
Speaker labels and translation have narrow meanings
The --speakers option embeds each finalized voice segment and assigns a nearby speaker label. This works for turn-taking. It is not full diarization and cannot separate two people talking simultaneously. Panels with interruptions, open microphones, or cross-talk need a real recording trial. A plausible-looking S1 or S2 label should not be treated as verified identity.
Translation is limited to Japanese lines going to English, Chinese, or Korean. The README warns about repetition and unreliable number preservation in the Chinese and Korean paths. That rules out price quotes, measurements, and financial captions without human review. Our 23 passing tests do not change that product limit. The English translation model also carries CC BY-SA 4.0 terms for redistributed weights, separate from Hayamimi's MIT-licensed source.
The project is candid and still very young
Release v0.1.1 was published on August 25, 2026, and GitHub recorded another push on August 26. The repository had 4 open issues and pull requests combined. Its release notes publish rejected experiments as well as improvements, including a denoiser that hurt the author's noisy-audio evaluation. That kind of disclosure is useful because speech quality varies with conditions and a tidy demo cannot settle the deployment decision.
Youth remains the largest concern. The project describes Windows 11 as its developed and tested platform, with macOS and Linux expected to work but lacking end-to-end CI coverage. Issue 1 reports Japanese hotwords silently doing nothing with the current tokenization setup. Hayamimi deserves a small local trial, not immediate trust at an event. Its compact codebase and clean 23-test result make that trial easier to justify.

