File size: 6,031 Bytes
495698c | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 | ---
license: cc-by-4.0
language:
- en
base_model:
- kyutai/pocket-tts
pipeline_tag: text-to-speech
tags:
- loom
- text-to-speech
library_name: loom-py-rt
---
# Pocket TTS (English)
Kyutai's Pocket TTS (English, 2026-09 release), exported for loom.cpp: a 100M-parameter flow language model over Mimi codec latents. Encodes text itself and has a built-in voice.
This is a [loom.cpp](https://github.com/loom-ai-org/loom.cpp) export: a single self-describing GGUF
that carries its own graph topologies, tokenizer (if any) and driver script, produced by
[loom-exporter](https://github.com/loom-ai-org/loom-exporter).
## Original model
Exported from [`kyutai/pocket-tts`](https://huggingface.co/kyutai/pocket-tts). Weights are unmodified; this repo packages the same parameters into
loom.cpp's GGUF format.
## License
`cc-by-4.0`, inherited from the base model above.
## Language(s)
`en`
## Usage
Run it with [loom-py](https://github.com/loom-ai-org/loom-py) -- `loom-py-rt` on PyPI:
```sh
pip install -U "loom-py-rt[hub]"
```
```python
import loom
model = loom.Model.from_pretrained("loom-ai-org/pocket-tts-loom")
# This model encodes text itself -- no phonemiser needed at all.
print(model.tokenizer) # kind, vocabulary size, default language
# sample_rate=24000: a rate is not something a checkpoint necessarily carries, so it is a value
# you have to know from the model's documentation and pass. It is used only if the GGUF declares none;
# a wrong rate does not fail, it plays the voice at the wrong speed.
audio = model.text2speech.infer("hello world", sample_rate=24000)
audio.save("out.wav")
# That uses the voice the file itself defaults to. Whether it carries others is under "Known
# limitations" (and, where it does, a section below says how to pick one).
```
### Choosing a voice
The file carries one voice, `alba`, and uses it when you name none. The other 25 of Kyutai's voices
ship in this repo as voice files under `voices/`, and a name is enough -- it is fetched from this repo
the first time:
```python
print(model.voices) # the built-in one first, then the voice files
audio = model.text2speech.infer("Hello there.", voice="marius")
audio.save("marius.wav")
```
A voice file is the model's own state after hearing the speaker, stamped with a fingerprint of these
weights, so it only fits this model: loom refuses one made for a different release rather than
producing speech that never stops. `voice=` also takes a path to a voice file of your own.
| voice | licence of the recording | voice | licence of the recording |
|---|---|---|---|
| `alba` (built in) | CC-BY-4.0 | `javert` | CC0-1.0 |
| `anna` | CC-BY-4.0 | `jean` | **CC-BY-NC-4.0 (non-commercial)** |
| `azelma` | CC-BY-4.0 | `juergen` | not stated by Kyutai |
| `bill_boerst` | CC0-1.0 | `lola` | CC0-1.0 |
| `caro_davy` | CC0-1.0 | `marius` | CC0-1.0 |
| `charles` | CC-BY-4.0 | `mary` | CC-BY-4.0 |
| `cosette` | **CC-BY-NC-4.0 (non-commercial)** | `michael` | CC-BY-4.0 |
| `eponine` | CC-BY-4.0 | `paul` | CC-BY-4.0 |
| `estelle` | CC0-1.0 | `peter_yearsley` | CC0-1.0 |
| `eve` | CC-BY-4.0 | `rafael` | not stated by Kyutai |
| `fantine` | CC-BY-4.0 | `stuart_bell` | CC0-1.0 |
| `george` | CC-BY-4.0 | `vera` | CC-BY-4.0 |
| `giovanni` | CC0-1.0 | | |
| `jane` | CC-BY-4.0 | | |
Licences are per [`kyutai/tts-voices`](https://huggingface.co/kyutai/tts-voices)' README, by the
dataset each recording comes from; every file also records its own (`loom.voice.license`,
`loom.voice.origin`). CC-BY voices need attribution to their source dataset or speaker.
### The layer underneath
The call above is the high-level door: one per task, named for the modality pair it maps between, with
the windowing, sampling and assembly this model needs already applied. Under it, `model.infer(...)`
passes your arguments straight to the driver this GGUF embeds -- which is where you go for a knob the
door does not name.
`model.driver_source` prints that driver, including a header comment documenting every argument it
accepts for this model, and is the authority on it. See [loom-py](https://github.com/loom-ai-org/loom-py) for the API and
[loom.cpp](https://github.com/loom-ai-org/loom.cpp) for what the engine does between the two.
## Known limitations
**Kyutai's use restrictions apply.** The upstream release prohibits, among other things, voice impersonation or cloning without explicit and lawful consent, and presenting generated audio as a genuine recording of a real person. They travel with the weights.
**One voice is built in (`alba`); the other 25 are voice files** under `voices/`, selected with `voice=` (see above). A voice is the model's own attention state after hearing the speaker, so a voice file only fits these weights, and loom refuses one made for another release. Each voice's licence is its RECORDING's, not the model's -- two are non-commercial -- and the table above lists them. Cloning a voice from a recording needs the Mimi encoder, which this export does not carry; a state you saved yourself with `pocket-tts export-voice` converts with `python -m loom_exporter.pocket_tts_voices --from`.
**Sampled by default**, at the checkpoint's own temperature (0.3), so two calls differ; pass `seed` to reproduce one. Verified against the reference with its random draws pinned: within 1.8e-06 rms of the reference waveform step for step.
**Long text is split, as the reference splits it**: into sentence chunks of at most 50 tokens, each generated separately from the same voice and joined. A single sentence longer than that is cut at its commas.
**English only.** Kyutai's other languages are separate checkpoints and are not this file.
## Files
- `pocket-tts.gguf` -- the model, exported with loom-exporter.
- `voices/*.gguf` -- Kyutai's other predefined voices as loom voice files, converted unchanged from `kyutai/pocket-tts`'s `languages/english_2026-09/embeddings/` by `loom_exporter.pocket_tts_voices`. Only needed to pick a voice other than `alba`.
|