Downloads · 30 days
0
hdae/karume-irodori-v4-small
karume-irodori-v4-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 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 mo…
Downloads · 30 days
0
Access
Public
Updated Oct 31, 2026
Repo size
21.6 GB
Likes
0
Public
Click a slice to open those files.
.krm6.3 GB · 100%
From the Hugging Face model README
A Japanese text-to-speech distribution: the Irodori-TTS v4 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.14.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-small (default) | irodori/1 | f32 / f16 / i8 / i8-a8 / i8+dit4 | i8-a8 |
model selects one of these; omitted, it is v4-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-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-small", // default — available: v4-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 | 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 | 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 | 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 | 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 | 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.
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.