Indic-Mio-LiteRT / README.md
aufklarer's picture
Indic-Mio LiteRT graph bundle (fp16 LM, masked spec-head decoder, ref encoder)
8c9c758 verified
|
Raw
History Blame Contribute Delete
3.91 kB
---
license: apache-2.0
language:
- hi
- en
tags:
- text-to-speech
- hindi
- indic
- emotion-control
- voice-cloning
- litert
- tflite
base_model: SPRINGLab/Indic-Mio
pipeline_tag: text-to-speech
---
# Indic-Mio-LiteRT
LiteRT (`.tflite`) graph bundle of [SPRINGLab/Indic-Mio](https://huggingface.co/SPRINGLab/Indic-Mio)
(Qwen3-0.6B speech-token LM, Apache-2.0) with its
[Aratako/MioCodec-25Hz-24kHz](https://huggingface.co/Aratako/MioCodec-25Hz-24kHz)
codec (MIT), for CPU inference on Windows/Linux x86_64 through
[speech-core](https://github.com/soniqo/speech-core). Emotion is controlled with
end-of-utterance suffix tags; voice cloning conditions on a 128-dim global
speaker embedding extracted from reference audio.
LiteRT cannot express the autoregressive loop, so the bundle ships static
graphs and the host owns the loop.
## Graphs
| File | Inputs | Outputs |
|---|---|---|
| `indicmio-text-prefill.tflite` (fp16) | `ids[1,64]` i64 (right-pad with 151643), `last_index` scalar i64 | `logits[1,164480]` f32, `k/v[28,1,8,512,128]` f32 |
| `indicmio-token-step.tflite` (fp16) | `id[1,1]`, `pos[1,1]`, `write_index` scalar, `k/v in` | `logits[1,164480]`, `k/v out` |
| `indicmio-audio-decoder.tflite` (fp32) | `codes[1,384]` i64 (zero-pad), `global[1,128]` f32, `valid_tokens` scalar i64 | STFT `real[1,961,768]`, `imag[1,961,768]` f32 |
| `indicmio-ref-encoder.tflite` (fp32) | `audio24k[1,240000]` f32 (10 s bucket) | `global[1,128]` f32 |
`config.json` carries the manifest (token offsets, stop ids, prompt template,
bucket sizes); `fidelity.json` the parity results; the HF tokenizer files are
included for host-side tokenization.
## Host contract
- **Prompt**: `<|im_start|>user\n{text}<|im_end|>\n<|im_start|>assistant\n`,
right-padded to 64 tokens with `151643`; pass the real last position as
`last_index`. Emotion tags go at the end of the sentence:
`<happy> <sad> <angry> <disgust> <fear> <surprise>`.
- **AR loop**: sample from `logits` (upstream reference: temperature 0.9,
top-p 0.9; suppress EOS until the first speech token), feed the sampled id
back through `token-step` with `pos = write_index = current length`. Stop on
`151645` or `151643`. Speech codes are `id - 151669` (12800 codes, 25 Hz,
960 samples/token at 24 kHz).
- **Decode**: zero-pad the codes to 384, set `valid_tokens` to the real count
(the graph masks attention and normalization statistics so padding cannot
contaminate the result), then reconstruct audio from the spectrum frames:
complex spec = `real + i·imag`, inverse rFFT per frame (n_fft 1920), Hann
window, overlap-add at hop 480, divide by the (constant, precomputable)
window envelope, trim `(win-hop)/2` at both ends and keep
`valid_tokens*960` samples, guarding the final ~8 hops of the tail.
- **Cloning**: crop/pad the reference to 10 s at 24 kHz and run the ref
encoder (prefer cropping — zero-padding slightly dilutes the embedding);
pass the result as `global`. Without a reference, pass zeros.
## Parity (vs the upstream PyTorch stack)
| Check | Result |
|---|---|
| Prefill logits corr | ~1.000000 |
| Token-step logits corr (non-zero write index) | ~1.000000 |
| Decoder PCM corr vs exact-length upstream decode | 0.998 |
| Reference-encoder cosine | 0.999 |
| Hindi ASR roundtrip (keyword recovery, 4 cases) | pass; emotion tags styled, never spoken |
## Licensing
The language model derives from SPRINGLab/Indic-Mio (Apache-2.0); the codec
weights derive from Aratako/MioCodec-25Hz-24kHz (MIT) and its WavLM-base+
speaker path. This bundle preserves upstream weights (fp16/fp32) with no
fine-tuning.
## Links
- [Speech Studio](https://soniqo.audio/speech-studio) - local speech generation and voice cloning app
- [speech-core](https://github.com/soniqo/speech-core) - C++ runtime
- [Docs](https://soniqo.audio/getting-started) - install and CLI docs
- [soniqo.audio](https://soniqo.audio) - website