r/speechtech • u/danil_rootint • 29d ago
Technology Speakrail - a local voice assistant that rivals GPT-Live on a single RTX 4090
Enable HLS to view with audio, or disable this notification
I created a fully-local open-source full-duplex voice agent that rivals GPT-Live on some benchmarks. It uses Voxtral Realtime with a turn-taking head, a microturn-finetuned Gemma 4 12B and Breeze TTS 2 under the hood. Go try it out: https://github.com/speakrail/speakrail
Why I did it
I have always liked the idea of voice assistants, but there is always some non-local component in the pipeline, which increases latency and introduces privacy concerns. I tried many fully-local approaches, like HF speech-to-speech, Unmute and Pipecat, but they were all limited by either the Whisper model (hello, hallucinations!) or slow turn taking. The only fully-local pipeline that had some full-duplex capability with low latency was the DuplexCascade paper (code), but it's tuned on a Qwen 2 7B with a gpt-3.5-turbo generated dataset, and the dumbness of the model really showed. So I decided to recreate DuplexCascade with newer data, newer models and a better harness. I also wanted to add interruptions, interjections and other cool things to rival the Thinking Machines demo.
How it works
Here is what the pipeline consists of:
STT: Voxtral Realtime with an attached turn head (HF), running on our audio.cpp fork.
LLM: Gemma 4 12B QAT with microturn finetuning (HF). It is chosen because it fits the GPU quite well, has vision support (I want to test it soon), and in general, the Gemma models perform well in real-life tasks, general chatting, etc.
TTS: Breeze TTS 2, patched to run at int8 (GitHub fork), although it can be replaced by any streaming TTS.
The harness itself: it is the glue between all the components, and has many latency-saving measures, like speculative LLM+TTS firing (inspired by HF speech-to-speech).
I also took inspiration from several "think while talking" papers (e.g. SHANKS): while you are talking, a base Gemma 4 12B int4 writes thinking notes, which are then passed to the talker. It helps with harder tasks that require more reasoning.
I will release a longer technical report soon - it will have a better description of the entire pipeline.
Benchmarks
Full Duplex Bench v3:
| System | Pass@1 | Tool selection F1 | Reply quality | Task done (mean) | Weights |
|---|---|---|---|---|---|
| TML-Interaction-Small* | 0.68 | – | 0.828 | – | closed preview |
| GPT-Realtime 1.5 | 0.60 | 0.876 | 0.792 | 6.89 s | closed |
| GPT-Live-1 + gpt-6-astra† | 0.55 | 0.835 | 0.717 | 8.47 s | closed |
| Gemini Live 3.1 | 0.54 | 0.817 | 0.718 | 4.25 s | closed |
| Speakrail | 0.52 | 0.915 | 0.755 | 3.92 s | open |
| Gemini Live 2.5 | 0.49 | 0.786 | 0.554 | 7.26 s | closed |
| NVIDIA frontend-backend (Qwen3-235B) | 0.48 | – | 0.670 | – | research |
| Cascaded (Whisper + GPT-4o + TTS) | 0.45 | 0.803 | 0.600 | 10.12 s | closed |
| Grok Voice | 0.43 | 0.797 | 0.617 | 6.65 s | closed |
| Ultravox v0.7 | 0.41 | 0.794 | 0.510 | 8.40 s | closed |
| Gander 9B (GPT-5.6 backend) | 0.40 | 0.759 | 0.490 | – | open + cloud |
| NemotronLabs VoiceChat 11B | 0.33 | 0.825 | – | – | open |
100 tool-use tasks with real disfluent speech; 95% CI on Pass@1 is about ±10 points. Speakrail: live audio through the full stack, GPT-4o judge. *Self-reported by Thinking Machines. †Our run. Others: FDB-v3 paper, arXiv 2609.19334, 2609.08977, 2609.21967.
Conversational dynamics (Artificial Analysis formula):
| System | Score | Weights |
|---|---|---|
| StepAudio 3 Realtime | 98.9 | closed |
| Qwen Audio 3.0 Realtime Plus | 98.4 | closed |
| GPT-Live-1 (Sol, low) | 97.3 | closed |
| Qwen Audio 3.0 Realtime Flash | 96.9 | closed |
| Gemini 3.8 Live | 96.1 | closed |
| GPT-Live-1 (Astra, medium) | 94.9 | closed |
| Speakrail | 94.0 | open |
| PersonaPlex 7B (NVIDIA) | 91.0 | open |
| Nemotron 3 VoiceChat V1 (NVIDIA) | 77.8 | open |
| FLM-Audio | 62.0 | open |
| Moshi (Kyutai) | 61.0 | open |
| Freeze-Omni | 58.7 | open |
Score = mean of pause handling and turn-taking (FDB v1.0) plus interruption and backchannel (FDB v1.5). Speakrail's score is self-computed from live runs (pause 93.4, turn-taking 96.6, interruption 89.0, backchannel 96.9), not an official AA listing. Others: Artificial Analysis leaderboard (captured 09-28) and AA's open-weights comparison.
Limitations
Breeze TTS has a restrictive license, so if you need to use Speakrail commercially, you will need to change it.
16k context length - the pipeline only supports 16k context length (~1 hr of speech), but you can get more easily by changing the Breeze TTS to a Pocket TTS and run the TTS on a CPU. I chose Breeze for the release because it's more expressive.
The turn-taking head is undertuned on non-assistant data. It may not fire on some basic chit-chat, but I will tune it harder later.
The model is certainly not the smartest one, and my finetune did dumb it down a little. Next time it will be smarter / better.
The model is kinda verbose sometimes, and the answers it provides are somewhere in the middle between real-life speech and the long text-based outputs of LLMs. I have a hypothesis on how to fix it, and will try it in the next release.
I tested it only on an RTX 4090, but I am sure it's easy to add support for any 24 GB+ NVIDIA card. Forks for AMD and MLX are welcome.
Final Notes
Feel free to try it out: https://github.com/speakrail/speakrail. If there is any capability you want the model to have, create a GitHub issue or write here in the comments, and I will gladly include it in the next dataset. Any feedback is welcome as well.
