enochlev commited on
Commit
b36044c
·
verified ·
1 Parent(s): 47b36ae

Model card: add FullDuplexBench v1.0 + v1.5 results vs base

Browse files
Files changed (1) hide show
  1. README.md +66 -12
README.md CHANGED
@@ -9,18 +9,72 @@ tags:
9
 
10
  # MiniCPM-duplex-rl
11
 
12
- RL-trained **full-duplex** conversational model tuned for natural turn-taking the training
13
- goal is to **avoid interrupting the user** while still responding promptly once they finish.
 
 
 
 
14
 
15
- - **Base:** [enochlev/MiniCPM-duplex](https://huggingface.co/enochlev/MiniCPM-duplex)
16
- - **Method:** REINFORCE over turn-taking reward functions (interruption penalty, timely-response
17
- reward, idle/silence shaping). This checkpoint is seed 2 ("run9"), best avg_reward +1.35.
18
- - **Serving:** text-only full-duplex server (`server.py --cpm`), ~1.7 s decision blocks,
19
- monotonic ASR commit.
20
 
21
- ## Evaluation (FullDuplexBench)
22
 
23
- Scored with GPT-4o behavior classification over ~90–175 real conversations per task. On the
24
- "don't interrupt" objective (lower RESPOND / higher RESUME = interrupts less), this seed
25
- interrupts less than the base and less than an independent same-config seed — on 3 of 4 tasks
26
- (largest gains on `background_speech` and `talking_to_other`; `user_backchannel` already at floor).
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
 
10
  # MiniCPM-duplex-rl
11
 
12
+ A full-duplex turn-taking RL fine-tune of
13
+ [`enochlev/MiniCPM-duplex`](https://huggingface.co/enochlev/MiniCPM-duplex)
14
+ (MiniCPM-duplex, from `xinrongzhang2022/MiniCPM-duplex`). The model decides every
15
+ ~1.7 s block whether to speak or stay silent while the user may also be speaking;
16
+ this checkpoint was trained with REINFORCE over block-level turn-taking rewards
17
+ (interruption penalties, timely-response rewards, silence penalties) for 180 steps.
18
 
19
+ **Effect:** compared to the base model it interrupts the user less, yields to
20
+ barge-ins, and resumes after overlapping speech trading away some take-turn
21
+ responsiveness on direct interruptions.
 
 
22
 
23
+ Training + serving code: [enochlev/text-only-duplex-model](https://github.com/enochlev/text-only-duplex-model)
24
 
25
+ ## Serving
26
+
27
+ Serve **bf16** (fp8 + greedy sampling breaks the idle/speak decision):
28
+
29
+ ```bash
30
+ vllm serve enochlev/MiniCPM-duplex-rl \
31
+ --served-model-name cpm-text-duplex --max-model-len 3000 \
32
+ --gpu_memory_utilization 0.30 --trust-remote-code
33
+ ```
34
+
35
+ then point the repo's `server.py --cpm` at it for the real-time audio stack
36
+ (Kokoro TTS + Parakeet ASR + WebSocket client protocol).
37
+
38
+ ## FullDuplexBench results (base vs this model)
39
+
40
+ Evaluated with [Full-Duplex-Bench](https://github.com/DanielLin94144/Full-Duplex-Bench)
41
+ (GPT-4o behavior classification).
42
+
43
+ ### v1.5 — behavior distribution + stop/response latency (pooled, seconds)
44
+
45
+ | Task (desired) | Model | n | RESPOND | RESUME | Stop (s) | Resp (s) |
46
+ |---|---|---|---|---|---|---|
47
+ | user_interruption (RESPOND ↑) | base | 200 | **0.65** | 0.20 | 2.17 | 1.93 |
48
+ | | rl | 175 | 0.49 | 0.36 | 2.21 | 2.60 |
49
+ | user_backchannel (RESUME ↑) | base | 98 | 0.00 | 0.52 | 0.73 | 1.93 |
50
+ | | rl | 98 | 0.00 | **0.63** | 0.67 | 2.03 |
51
+ | talking_to_other (RESUME ↑) | base | 100 | 0.47 | 0.24 | 1.43 | 1.90 |
52
+ | | rl | 100 | 0.28 | **0.43** | 1.53 | 2.18 |
53
+ | background_speech (RESUME ↑) | base | 100 | 0.63 | 0.25 | 1.21 | 2.27 |
54
+ | | rl | 98 | 0.45 | **0.31** | 1.19 | 2.32 |
55
+
56
+ The RL model wins the three tasks whose desired behavior is *staying quiet /
57
+ resuming* (backchannels, third-party speech, background speech) and is less eager
58
+ on direct user interruptions.
59
+
60
+ ### v1.0 — turn-taking dimensions
61
+
62
+ | Metric | base | rl |
63
+ |---|---|---|
64
+ | Candor Pause Handling · take-turn | 0.916 | 0.635 |
65
+ | Candor Turn Taking · take-turn / latency | 0.992 / 0.31s | 0.861 / 0.85s |
66
+ | ICC Backchannel · JSD / TOR / Freq | 0.44 / 0.71 / 0.44 | 0.69 / 0.73 / 0.15 |
67
+ | Synthetic Pause Handling · take-turn | 0.934 | 0.653 |
68
+ | Synthetic User Interruption · rating / take-turn / latency | 4.15 / 1.0 / 0.71s | 4.04 / 0.98 / 1.76s |
69
+
70
+ v1.0's take-turn/latency conventions favor the eager base model; the consistent
71
+ direction across both versions reflects the RL objective — restraint over
72
+ eagerness.
73
+
74
+ ## Training summary
75
+
76
+ - 180 REINFORCE steps, lr 5e-6, 32 episodes/step, γ=0.90, per-batch z-scored advantages
77
+ - Block-level rewards: interruption penalty, timely-response reward, silence
78
+ penalty, missed-turn penalty, backchannel-loop penalty
79
+ - Seed-reproducible (two independent seeds: best avg reward +1.36 / +1.35);
80
+ replay eval cut stale-overlap speech ~45% vs base without going over-silent