LFM2.5-Audio-1.5B (text to speech)
Liquid AI's LFM2.5-Audio-1.5B as a speech synthesizer, exported for loom.cpp: the LFM2.5 hybrid LM drawing Mimi-codebook frames through its depthformer, and its LFM2-based detokenizer. Encodes text itself; four voices.
This is a loom.cpp export: a single self-describing GGUF that carries its own graph topologies, tokenizer (if any) and driver script, produced by loom-exporter.
Original model
Exported from LiquidAI/LFM2.5-Audio-1.5B. Weights are unmodified; this repo packages the same parameters into
loom.cpp's GGUF format.
License
LFM Open License v1.0 -- inherited from the base model above.
Language(s)
en
Usage
Run it with loom-py -- loom-py-rt on PyPI:
pip install -U "loom-py-rt[hub]"
import loom
model = loom.Model.from_pretrained("loom-ai-org/lfm2.5-audio-1.5b-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 model's voices are the four system prompts its README names. The file speaks as us_male when you
name none; the other three ship in this repo as voice files under voices/, and a name is enough:
print(model.voices) # the built-in one first, then the voice files
audio = model.text2speech.infer("Hello there.", voice="uk_female")
audio.save("uk_female.wav")
| voice | the system prompt it stands for |
|---|---|
us_male (built in) | "Perform TTS. Use the US male voice." |
us_female | "Perform TTS. Use the US female voice." |
uk_male | "Perform TTS. Use the UK male voice." |
uk_female | "Perform TTS. Use the UK female voice." |
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 for the API and
loom.cpp for what the engine does between the two.
Known limitations
The text-to-speech door only. LFM2.5-Audio also transcribes (a separate file, lfm2.5-audio-1.5b-asr) and chats speech-to-speech (interleaved generation, not exported).
Sampled by default, as the README's TTS call samples: each frame's codes at temperature 0.8, top-k 64; the text before and after the speech is greedy. Two calls differ; pass seed to reproduce one, or temperature=0 for the greedy decode the export is verified with -- every frame's codes as liquid-audio draws them, and the waveform within 4.1e-06.
One generation per call, up to about 80 s of speech (1024 steps); split long text into sentences.
English only.
Files
lfm2.5-audio-1.5b-tts.gguf-- the model, exported with loom-exporter.voices/*.gguf-- the README's other three voices as loom voice files (each is its system prompt's ids), written byloom_exporter.lfm25_audio_voices. Only needed to pick a voice other thanus_male.