Downloads · 30 days
0
hdae/karume-irodori-v4.1-small
karume-irodori-v4.1-small is a text-to-speech model from hdae. Use it when you need text read aloud. It is set up for karume. The card lists the license as mit.
A Japanese text-to-speech distribution: the Irodori-TTS v4.1 Small rectified-flow DiT converted into the WebGPU inference runtime Karume's container format (a .krm part sequence whose first part carries the graph and…
Downloads · 30 days
0
Access
Public
Updated Oct 30, 2026
Repo size
15.4 GB
Likes
0
Public
Click a slice to open those files.
.krm365 MB · 100%
From the Hugging Face model README
A Japanese text-to-speech distribution: the Irodori-TTS v4.1 Small rectified-flow DiT
converted into the WebGPU inference runtime Karume's container format (a .krm part
sequence whose first part carries the graph and model descriptors). Runs as-is in the
browser and in Deno.
backbone, the
text_proj and caption_proj condition projectors, the reference-latent speaker
encoder, the duration predictor, the DiT split in two — dit_context (the
conditioning keys / values, once per generation) and dit (one forward per Euler step,
plus one per classifier-free-guidance branch) — and the DACVAE codec (Aratako/Semantic-DACVAE-Japanese-32dim)
as codec_decoder / codec_encoder.generate() returns f32 mono samples at the codec's sample
rate, ready for encodeWav. The decoder is run in tiles so that it also fits GPUs with
the default 128MiB storage-buffer limit; the tiling is bit-exact against a single-shot
decode.decodeWav returns), which codec_encoder turns into a DACVAE
latent, or as such a latent directly. Reference audio must already be at this
distribution's own 48000 Hz: there is no resampler, and a mismatch is refused
rather than silently converted. Unlike the decoder, codec_encoder is not tiled, so a
long reference can exceed the default 128MiB storage-buffer limit.irodori/1.karume/0.15.0. The distribution manifest is karume.json (karume/5).Converted into the container format — the original checkpoint is not distributed here.
backbone component, so that license travels with this repository too.codec_decoder / codec_encoder components so that
text-to-audio runs from this repository alone. Its weights derive from facebook/dacvae-watermarked,
licensed Apache-2.0 (as of retrieval), by way of Aratako/Semantic-DACVAE-Japanese;
the Apache License 2.0 text is included in LICENSE.md for the codec components.NOTICE.md): conversion into the Karume
container format and quantization of the weights — every component is stored
as f32 / f16 / i8 series, and the DiT (dit / dit_context) adds an i4 series
rounded with GPTQ calibration (the quant table below says which storage each quant
selects; f32 is not quantized). The codec stores its weight-normalized convolutions
as effective weights, keeps only the mean half of quantizer.in_proj in
codec_encoder, and bypasses the watermarking branch in codec_decoder; constant
sub-expressions are precomputed. No retraining, no fine-tuning.| Model | Pipeline | Quants | Default quant |
|---|---|---|---|
v4.1-small (default) | irodori/1 | f32 / f16 / i8 / i8-a8 / i8+dit4 | i8-a8 |
model selects one of these; omitted, it is v4.1-small. quant defaults to that model's own default quant.
import { decodeWav, encodeWav } from "jsr:@karume/models";
import { Pipeline } from "jsr:@karume/models/irodori";
await using pipeline = await Pipeline.fromPretrained({
repo: "hdae/karume-irodori-v4.1-small",
// Pin a commit for reproducible builds — without it you track `main`, and a future
// repo update (renamed files, new manifest format) may break your app.
// Copy the full hash from this repo's "Files and versions" tab:
// revision: "<full commit sha>",
}, {
// model: "v4.1-small", // default — available: v4.1-small
// quant: "i8-a8", // default — available: f16 / f32 / i8 / i8+dit4 / i8-a8
});
const audio = await pipeline.generate({
text: "こんにちは、これはテストです。",
// Voice Design — describe the voice in Japanese prose:
// caption: "落ち着いた女性の声で、ゆっくりと丁寧に話している。",
// Voice cloning — condition on a reference speaker. The WAV must already be
// 48000 Hz — any channel count is averaged to mono; there is no resampler,
// so a sample-rate mismatch is refused:
// speaker: { audio: decodeWav(await Deno.readFile("reference.wav")) },
// ...or pass a DACVAE latent you saved earlier instead of the audio:
// speaker: { latent: savedLatent },
seed: 42, // same seed + same inputs → same audio
// durationSeconds: 5, // override the predicted utterance length (seconds)
});
await Deno.writeFile(
"out.wav",
encodeWav(audio.data, audio.sampleRate),
);
generate() returns { data, sampleRate, frames, seed, forwards }, where data is f32
mono already trimmed to the predicted length. generateLatent() is the same run stopped
one stage earlier: it returns { data, frames, latentDim, seed, forwards } with the
patched DACVAE latent, for callers that want the embedding rather than audio.
caption and speaker are both optional: without them the voice is picked by the model
alone, and the guidance branches for the missing conditions are skipped.
Weights are fetched once and cached (verified against karume.json's size / sha256).
| Quant | What it is | Download | Weights | Compute |
|---|---|---|---|---|
f32 | Full precision (f32) — Every graph in f32 storage — the largest download, with no quantization applied. | 3.21 GiB (3.12 GiB shared) | backbone = f32 / text_proj = f32 / caption_proj = f32 / speaker = f32 / duration = f32 / dit = f32 / dit_context = f32 / codec_decoder = f32 / codec_encoder = f32 | — |
f16 | Half size (f16) — Every graph stored as f16 and computed in f32 — half the f32 download, with no audible difference in the listening check. | 1.61 GiB (1.57 GiB shared) | backbone = f16 / text_proj = f16 / caption_proj = f16 / speaker = f16 / duration = f16 / dit = f16 / dit_context = f16 / codec_decoder = f16 / codec_encoder = f16 | — |
i8 | Quarter size (int8) — Every graph stored as int8 and computed in f32 — about a quarter of the f32 download, with the execution path left unchanged. | 829 MiB (808 MiB shared) | backbone = i8 / text_proj = i8 / caption_proj = i8 / speaker = i8 / duration = i8 / dit = i8 / dit_context = i8 / codec_decoder = i8 / codec_encoder = i8 | — |
i8-a8 (default) | Balanced (int8, int8 linear) — The int8 weights with per-token int8 activations in the DiT's linear layers — the same download as plain int8, and faster per Euler step. | 829 MiB (808 MiB shared) | backbone = i8 / text_proj = i8 / caption_proj = i8 / speaker = i8 / duration = i8 / dit = i8 / dit_context = i8 / codec_decoder = i8 / codec_encoder = i8 | linearCompute = a8 |
i8+dit4 | Lowest memory (int4 DiT) — The DiT in GPTQ-calibrated int4 (group-32) while the other seven graphs stay int8 — the smallest download and the least resident memory. | 713 MiB (490 MiB shared) | backbone = i8 / text_proj = i8 / caption_proj = i8 / speaker = i8 / duration = i8 / dit = i4 / dit_context = i4 / codec_decoder = i8 / codec_encoder = i8 | — |
If no quant is given, it runs as i8-a8 (this model's recommended default).
Per-file size and sha256 live in karume.json — verify against that at the fetch layer.
Dtype labels use the runtime's storage dtype vocabulary (f16 / bf16 / i8 / i4 / i2), not the fp16 spelling common elsewhere in the ecosystem.
Weights ship as Karume container files (.krm), split into numbered parts; a part is fetched and verified on its own.
Some components are fetched from hdae/karume-irodori-v4-small at commit 485bbee5f0331db5… — those bytes are identical to this model's own, so they are not stored here a second time.
Derived from the checkpoint's own config, and checked against the exported graphs when this repository was assembled.
The sampler knobs are fixed by the manifest — generate() takes none of them.
initScale 0.999)durationSeconds is passed)seed is the one knob the manifest does not carry — it defaults to 0, and the same
seed with the same request gives the same audio.