enochlev/MiniCPM-duplex-rl
MiniCPM-duplex-rl
A full-duplex turn-taking RL fine-tune of `enochlev/MiniCPM-duplex` (MiniCPM-duplex, from xinrongzhang2022/MiniCPM-duplex). The model decides every ~1.7 s block whether to speak or stay silent while the user may also be speaking; this checkpoint was trained with REINFORCE over block-level turn-taking rewards (interruption penalties, timely-response rewards, silence penalties) for 180 steps.
Effect: compared to the base model it interrupts the user less, yields to barge-ins, and resumes after overlapping speech — trading away some take-turn responsiveness on direct interruptions.
Training + serving code: enochlev/text-only-duplex-model
Serving
Serve bf16 (fp8 + greedy sampling breaks the idle/speak decision):
vllm serve enochlev/MiniCPM-duplex-rl \
--served-model-name cpm-text-duplex --max-model-len 3000 \
--gpu_memory_utilization 0.30 --trust-remote-codethen point the repo's server.py --cpm at it for the real-time audio stack (Kokoro TTS + Parakeet ASR + WebSocket client protocol).
FullDuplexBench results (base vs this model)
Evaluated with Full-Duplex-Bench (GPT-4o behavior classification).
v1.5 — behavior distribution + stop/response latency (pooled, seconds)
The RL model wins the three tasks whose desired behavior is staying quiet / resuming (backchannels, third-party speech, background speech) and is less eager on direct user interruptions.
v1.0 — turn-taking dimensions
v1.0's take-turn/latency conventions favor the eager base model; the consistent direction across both versions reflects the RL objective — restraint over eagerness.
Training summary
- 180 REINFORCE steps, lr 5e-6, 32 episodes/step, γ=0.90, per-batch z-scored advantages
- Block-level rewards: interruption penalty, timely-response reward, silence penalty, missed-turn penalty, backchannel-loop penalty
- Seed-reproducible (two independent seeds: best avg reward +1.36 / +1.35); replay eval cut stale-overlap speech ~45% vs base without going over-silent
