ZEN-TTS 1.2 Runs Japanese Speech Fully In-Browser

Introduction
ZEN-TTS 1.2.0 is a same-day Japanese generative TTS drop you can run without a speech server. On 2026-11-06 (~00:36 UTC) Zenryoku Kikai tagged zenryokukikai/zen-tts v1.2.0 and published the matching voice pack on Zenryokukikai/zen-tts — G2P through an NSF decoder at 44.1 kHz, all on-device in the browser (WebGPU, with WASM SIMD fallback) or under Node.js on CPU.
This is stock-voice text-to-speech, not cloning: four fixed Japanese voices with continuous emotion blends. Community voice Bluesky-chan 1.1.0 landed the same morning on kojira/zen-tts-models for the 1.2.0 runtime.
What Shipped
- Vendor / product: Zenryoku Kikai (全力機械) — ZEN-TTS 1.2.0
- Modality: open Japanese text-to-speech (no voice cloning); optional lip-sync SDK in a sibling repo
- Open vs closed: custom ZEN-TTS License 1.0 — free commercial/non-commercial use with mandatory credit, no modification, no redistribution of weights/code, and no training/distillation on outputs
- Runnable today:
pnpm add github:zenryokukikai/zen-tts#v1.2.0(or npm/yarn); load a.ztmfrom Hugging Face / CDNhttps://tts-models.zenryoku.work/v1.2.0/{voice}.ztm - Concrete fact: each voice is one ~27.7 MB
.ztm(int8 prosody/generator + fp16 NSF); shared G2Pg2p.bin~13.5 MB; CPU kernel WASM ~60 KB; Xeon 1-thread RTF 0.042; browser CPU ~0.09 RTF on Apple M3 Max / ~0.11 on iPhone
1.2.0 specifically refreshes NSF decoder noise and re-trains G2P so numbers and English words read more reliably — the commit message and HF card both call that out as the version bump.
Voices and emotion
Four bundled voices (id → vibe):
marine— soft, calm femalehashiro— calm, deep malekai— resonant low male (~40s)kikka— plain, clear young female
Emotion styles mix as ratios across neutral / happy / sad / angry / apologetic, including mid-sentence transitions on nine named curves. Speed 0.5–1.5 and pitch in semitones (−6…+12) are first-class controls on the browser API.
Run It
Browser (WebGPU, WASM fallback):
import { ZenTts, wavBlob } from './dist/index.js';
const tts = await ZenTts.load({
modelsUrl: './models',
cpuWasmUrl: './cpu/tts-cpu.wasm',
model: './voices/marine.ztm',
});
const r = await tts.speak('本日はご来店いただき、ありがとうございます。', {
emotion: { happy: 70, neutral: 30 },
speed: 1.2,
pitch: 2,
});
const url = URL.createObjectURL(wavBlob(r.audio));Node (CPU):
import { ZenTtsNode, wavBytes } from 'zen-tts/node';
import { writeFileSync } from 'node:fs';
const tts = await ZenTtsNode.load({ model: './kikka.ztm' });
const r = await tts.speak('本日はご来店いただき、ありがとうございます。', {
emotion: { happy: 70, neutral: 30 },
});
writeFileSync('voice.wav', wavBytes(r.pcm)); // 44.1 kHz monoInstall pin:
pnpm add github:zenryokukikai/zen-tts#v1.2.0Weights: HF marine.ztm / hashiro.ztm / kai.ztm / kikka.ztm (each 27,650,080 or 27,650,016 bytes) + g2p/g2p.bin. CDN paths under /v1.2.0/ HEAD 200 with matching sizes. Show the required credit somewhere users can see it: 音声合成:ZEN-TTS(https://zenryokukikai.com ).
Notes for makers
- Not a redistrib of Kokoro / Fish / VoxCPM — Zenryoku’s own NSF stack; Bluesky-chan notes its training voice was synthesized with VoxCPM2, then fit to ZEN-TTS
- License is permissive for shipping apps if you attribute, do not fork the weights, and do not scrape outputs for training — read LICENSE.md before packaging
- No zero-shot cloning; custom voices are a paid Zenryoku request path
- Same-day community voice: kojira Bluesky-chan 1.1.0 (
.ztm, needs runtime ≥1.2.0; open-source-project-only voice license) - Distinct from Ninada / mesm-tts / Underdog Woof browser-or-edge English stacks — Japanese G2P + emotion blend + 44.1 kHz NSF in-tab
- No Gen CTA: Japanese on-device TTS does not map to the Flux / Grok / MiniMax-H3 / Seedream / Seedance Gen loop
Conclusion
If you need Japanese speech that stays on the user’s machine — browser WebGPU/WASM or Node CPU — ZEN-TTS 1.2.0 is today’s runnable pack: four ~27.7 MB voices, retrained number/English G2P, and paste-ready v1.2.0 installs from GitHub + Hugging Face.
—Anabel ♡
