Views
No views yet
mistralai/Voxtral-Mini-4B-Realtime-2602 that emits ElevenLabs-style expressive tags ([whispers], [sighs], [laughs], [pause], etc.) from audio. Designed for half-duplex AI-therapist voice agents where the planner LLM benefits from a parallel affect channel alongside ASR text.For production, use the RAFT-polished version instead — same architecture, ~5pp lower hallucination. This SFT checkpoint is the unpolished baseline + the input to the RAFT stage.
audio ─┬─ base Voxtral-Mini-4B-Realtime-2602 ─→ ASR text (clean WER ~10%)
└─ this adapter (LoRA on attention) ─→ tag stream
merged: "[whispers] [pause] Listen, I know you're in a meeting"serve_modal.py for a Modal-deployed Mode B reference implementation (two model instances on a single A100-40, parallel forward, top-K tag filter, merged JSON output).| Metric | Base alone | This adapter (Recipe I) |
|---|---|---|
| Tag F1 | 22% | 28% |
| Tag Recall | 22% | 51% |
| Tag Precision | 100% (rarely emits) | 34% (over-emits) |
| Tag Hallucination | 0% | 61% |
| WER (text) | 10% | n/a — adapter doesn't emit text |
1import torch
2from transformers import VoxtralRealtimeForConditionalGeneration, AutoProcessor
3from peft import PeftModel
4
5processor = AutoProcessor.from_pretrained("mistralai/Voxtral-Mini-4B-Realtime-2602")
6base = VoxtralRealtimeForConditionalGeneration.from_pretrained(
7 "mistralai/Voxtral-Mini-4B-Realtime-2602",
8 dtype=torch.bfloat16,
9 device_map="auto",
10)
11tag_model = PeftModel.from_pretrained(base, "YongkangZOU/evoxtral-realtime-sft")
12tag_model.eval()
13# Use `base` for ASR text, `tag_model` for tag stream — see serve_modal.py for the full hybrid.[tag1] [tag2] text output), the project repo ships a Modal-deployed FastAPI server with parallel forward + top-K filter built in.mistralai/Voxtral-Mini-4B-Realtime-2602[p_len, p_len+N), EOS at p_len+N, post-EOS labels=-100. No silence-position training (unlike v3 distributed schema, which over-dilutes sparse tag-only training at 60:1 ratio against content).re.findall(r'\[[^\]]+\]', tagged_text) — text content stripped, only bracket-form tags remain).q_proj, k_proj, v_proj, o_proj).audio_tower, multi_modal_projector, time_embedding (frozen after get_peft_model() to avoid PEFT re-enabling norm grads).prior_work.md for the full Phase 1-3 matrix. Highlights:| Phase | Schema | Outcome |
|---|---|---|
| 1 | matching-shape (v1), full text | bimodal cliff: under-fit (no tags learned) or over-fit (WER 122%, hallucinated content) |
| 2 | distributed targets (v2/v3), full text | greedy hits premature EOS, sampling helps but Tag F1 caps at 27% |
| 3a | distributed (v3) + tags-only | model only emits [ then long stream_pad runs (60:1 stream_pad-vs-content signal dilution) |
| 3b (this) | packed (v1-style) + tags-only | clean tag emission, audio-grounded, +29pp Recall |
top_k=2 filter (Tag F1 → 29%, Precision → 47%).[calm] [pause] [clears throat] as a fallback set. This is a data-side limitation: TTS-synthesized affect signal is too weak to differentiate ambiguous inputs. RAFT does not eliminate it; the RL version only trims it slightly.tag_taxonomy.py (6 emotion + 5 nonverbal + 3 delivery + 1 pause). Out-of-taxonomy concepts won't be tagged.YongkangZOU/evoxtral-realtime-rl — RAFT-polished version of this adapter. Use this in production; the SFT version is the input to the RAFT stage.1@software{evoxtral_realtime_2026,
2 title = {Evoxtral-Realtime: Backchannel-style affect-tag adapter for Voxtral-Mini-4B-Realtime},
3 author = {Yongkang Zou},
4 year = {2026},
5 url = {https://github.com/Tame-Your-Monkey/evoxtral-realtime}
6}
7
8@misc{voxtral_mini_realtime,
9 author = {Mistral AI},
10 title = {Voxtral-Mini-4B-Realtime-2602},
11 year = {2026},
12 url = {https://huggingface.co/mistralai/Voxtral-Mini-4B-Realtime-2602}
13}