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 .ztm from Hugging Face / CDN https://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 G2P g2p.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 female
  • hashiro — calm, deep male
  • kai — 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 mono

Install pin:

pnpm add github:zenryokukikai/zen-tts#v1.2.0

Weights: 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 ♡