Michael Chen

Tech & Building

Teaching a local speech model when to ask for help

By Michael ChenPublished

Release discussed: v0.9.1, October 2026.

My LFM2.5-Audio Delegate project takes a spoken request, answers locally when it chooses that route, or asks a stronger text model for help. The local model then speaks the answer, including answers that are still arriving from the other model.

It runs on a 24 GB M4 Mac mini. It's experimental and half-duplex: it listens or speaks, rather than doing both at once. Cancellation is typed. Factual answers and routing from a room microphone are still weak, and it hasn't been validated in live-human conversation. Those limits matter as much as the working demo. (Corrected model card (documentation commit 59c0adf); Acceptance criteria and retained failures)

What was already there

The base is Liquid AI's pretrained LFM2.5-Audio-1.5B. It already has connected components for understanding audio, processing it through a shared core and generating speech. My project adds training for delegation and the software that handles the handoff. It wasn't trained from scratch. (Liquid AI's pretrained base model; Retained E1 training configuration)

Incoming audio passes through a FastConformer encoder and an adapter into the shared LFM2 core. A depthformer audio head and a causal detokenizer turn its output into speech. The base already has a path from hearing to speaking. This isn't a separate transcription model feeding a chat model that calls an unrelated voice generator. (Corrected model card (documentation commit 59c0adf); Liquid AI's pretrained base model)

Only small additions to the shared core were trained. These are LoRA adapters, which adjust selected parts of a pretrained model while leaving its original weights fixed. The audio encoder, its adapter, the speech-generation head and the detokenizer stayed frozen.

The retained adapter, E1, trained on 2,000 synthetic conversations covering local answers and delegation, including some two-turn exchanges. Prompts combined generated examples with math and programming tasks. Kokoro supplied synthetic speech; local-answer targets came from the base model itself. Real-speech VoiceBench recordings were used for development and testing of E1, not its training. (Retained E1 training configuration; Data provenance and split rules)

What asking for help looks like

The shared core can produce a structured delegate call containing a query. The runtime sends it to a stronger text model, then feeds the returned text back into the local core. The same audio head speaks both local and delegated answers. Choosing to answer locally isn't proof that the answer will be right. (Corrected model card (documentation commit 59c0adf); Runtime documentation)

The surrounding software groups incoming text into roughly sentence-aligned segments, handles formatting problems, manages cancellation and supplies recent-answer context. Those are runtime features, not abilities learned by the adapter.

The public demo starts with a local capital question, then a local answer about Lisbon's history that contains factual errors and is cancelled. A delegated family-trip plan corrects those errors, and a follow-up refers to the plan's third day. Text from the stronger model is still arriving after playback starts. (R3 four-turn playback report)

That run uses prerecorded synthetic input, a real external-model connection and actual device playback. Its recording captures output callbacks, not sound travelling through a room. It isn't a human conversation. (Public synthetic-input R3 demo, output-callback recording)

Keeping track of what was actually spoken

Cancellation makes context more complicated. The model can generate text ahead of the audio someone has heard. Passing the entire answer into the next request can include material that never played.

The runtime supplies the last three spoken-answer entries and estimates how much of a cancelled answer was spoken. That estimate isn't an exact transcript. The model's own context can still contain text ahead of the audio. The successful follow-up in the demo doesn't establish that training improved its conversational memory. (R3 four-turn playback report; Runtime documentation)

Listening is disabled during replies. After speaking, the runtime waits through a guard period and quiet check, with a timeout fallback. Anything started while listening is off is discarded and has to be repeated. To cancel, type c and press Enter. Spoken interruption isn't supported in the accepted mode. (Acceptance criteria and retained failures; Runtime documentation)

The numbers, with their limits

Training updated about 11.1 million adapter parameters over 500 steps. It took 3,648 seconds, with a 23.5 GB memory high-water mark and 5.2 GB peak swap. Those are training figures, not the memory needed to run the finished adapter. (Retained E1 training configuration; Experiment ledger, including retained and rejected work)

On a historical 812-item held-out suite, handoff success was 93.84%, versus 53.7% for the untrained baseline. Success required the right route and, for delegation, a valid call with query word error rate no higher than 0.3 against a reference. Route choice alone was 98.5%. Neither is factual-answer accuracy. The recorded 95% interval for E1 handoff success was 92.1% to 95.4%. (Corrected model card (documentation commit 59c0adf); Historical held-out routing summary)

On 200 real-speech questions, historical factual QA reference containment was 20.5%, versus 19.5% for the base, with no demonstrated gain. This checks whether the answer contains a reference answer, not comprehensive correctness. Context follow-ups on 101 items also showed no improvement. The voice-quality checks were automated proxies, not human listening ratings. These held-out results weren't rerun on the latest runtime. (Corrected model card (documentation commit 59c0adf); Recorded evaluation results; Historical held-out local-answer summary)

The latest recorded R3 check used four file inputs and real device playback. All seven checks passed with no recorded output gaps or underflows. The two local replies took 0.553 and 0.590 seconds from the end-of-turn decision to the first reply output callback. The two delegated replies took 8.596 and 3.010 seconds. These timings exclude endpoint silence and reported output latency; they aren't measured from the last human syllable to audible sound. MLX peak allocation was 3.637 GB and process peak RSS was 3.945 GB. Neither is total-system memory. (R3 four-turn playback report)

R3 is a small functional check, not a general reliability result. An older sustained-playback run wasn't repeated after the current context and half-duplex changes. A separate cancellation test stopped playback and the provider stream but still failed its full protocol. Those failures remain in the record. (Experiment ledger, including retained and rejected work; Acceptance criteria and retained failures)

Where it still falls short

The physical-microphone tests played synthetic speech through a loudspeaker into a real microphone. They weren't live-human tests. Across four sessions, the trip request was incorrectly answered locally in three. That's a substantial gap between the controlled file-input results and the room setup. (Corrected model card (documentation commit 59c0adf); Acceptance criteria and retained failures)

Adding real-human training clips in a separate experiment produced no measurable routing gain, so that adapter wasn't retained. Full-duplex approaches failed their acceptance rules, and later acoustic augmentation wasn't retained either. The ledger records changes to evaluation rules and an intermittent numerical-tolerance test failure. It isn't a record of everything passing. (Experiment ledger, including retained and rejected work)

Audio understanding and generation run locally, but delegated queries and recent-answer text go to an external provider. The release is English-only and adds no safety training or content filter. It isn't production-ready. (Corrected model card (documentation commit 59c0adf); Runtime documentation)

Trying the release

The pinned v0.9.1 files include the adapter, configuration, runtime and recorded results. The model card links the setup instructions; base weights are downloaded separately. Most evaluation audio needs regeneration. (Corrected model card (documentation commit 59c0adf); Data provenance and split rules; Pinned runnable release v0.9.1)

A separate reproduction check ran the quickstart using already-installed dependencies, not a clean dependency installation. Some paired confidence intervals also couldn't be recomputed from the public snapshot because per-item judged results were missing. That isn't a full end-to-end evaluation rebuild. (Unpublished reproduction evidence: October 5, 2026 reproduction check; installed dependencies and missing per-item judged results. Not independently rerun by Editor or Dot.)

The LFM Open License v1.0 has a commercial-use restriction tied to a US$10 million annual-revenue threshold. Component and provider terms also apply. This isn't an unrestricted MIT release. (LFM Open License v1.0; Component and dataset attribution)

The public demo shows the handoff, streamed speech and estimated context working in that recorded run, alongside a wrong local answer. That's what it demonstrates, not a reliable general-purpose assistant. (Public synthetic-input R3 demo, output-callback recording)

File-input delegation demo

Listen to the file-input delegation demo (WAV, 3 min 0.2 s)

Contains factual errors. Prerecorded synthetic requests, a real external-model connection and device playback, captured at the output callback. The sequence is a local capital answer; an incorrect Lisbon-history answer stopped by scripted cancellation; a delegated family plan that corrects the history; and a follow-up about its relaxing day. Silence is retained. This is a summary of the published report, not a verbatim transcript, live-human conversation or room-acoustics recording. No listening study was performed for this article.

LFM2.5-Audio Delegate on ML & Research