DuplexLedger: Benchmarking Transactional Memory in Full-Duplex Speech Agents
Organizations: Nanyang Technological University · Peking University · Beijing University of Technology · Xidian University ·
Abstract
Full-duplex speech agents must update persistent memory while listening and speaking, yet it remains unclear which events should be stored, revised, or excluded. Existing benchmarks isolate interaction timing from memory outcomes, obscuring the state transitions behind a correct answer. We introduce DuplexLedger, a bilingual benchmark of 1,094 persistent sessions aligning four full-duplex scenarios with event-level Write/Update/Ignore/Retain supervision, explicit pre/post memory states, and 6,564 same-session questions and checks. Evaluating five full-duplex models reveals an interaction-memory gap: no system combines strong boundary control with coherent final-state memory, and the best final-state fact coverage is 2.01%. We propose ACT-Mem, an 8.92M-parameter sidecar comprising an event controller, a versioned transactional ledger, and a typed retriever coupled with a frozen MiniCPM-o 4.5 backbone. On 219 held-out sessions, ACT-Mem increases latest-value accuracy from 4.11% to 8.68% while reducing stale assertions and distractor adoption. It improves interaction boundaries but slows interruption stopping. These results motivate selective, auditable full-duplex memory rather than indiscriminate transcript retention. Code is available at https://github.com/lyx-researcher/DuplexLedger.
Figures & tables
| Duplex | Memory | |||||||
| Dataset | Scale | Hrs | Adaptive interaction | FD scenarios | State / Memory eval. | Update QA | Distractor reject | Event state |
| FDB v1/v1.5 | 727/499 | NR | ✗ | 4/4 | ✗ | ✗ | ✗ | ✗ |
| HumDial-FDBench | 15,698 | ✗ | 9 | ✗ | ✗ | ✗ | ✗ | |
| MultiTalkBench | 104 | 56.5 | ✗ | N/A | ✓ | ✗ | ✗ | ✗ |
| FDB v2 | 200 | N/A | ✓ | 4 | ✓ | ✗ | ✗ | ✗ |
| EchoChain | 200 | NR | ✓ | 1 | ✓ | ✗ | ✗ | ✗ |
| Scenario | ZH | EN | Sess. | Events | Chal. | QA |
|---|---|---|---|---|---|---|
| Pause handling | 149 | 127 | 276 | 1,932 | 552 | 1,656 |
| Speech to others | 150 | 126 | 276 | 2,208 | 1,104 | 1,656 |
| User backchannel | 146 | 137 | 283 | 2,545 | 1,130 | 1,698 |
| User interruption | 132 | 127 | 259 | 1,554 | 518 | 1,554 |
| Total | 577 | 517 | 1,094 | 8,239 | 3,304 | 6,564 |
| (a) Full-duplex interaction | |||||||
|---|---|---|---|---|---|---|---|
| Model | RCR † | cFD | Early | Pre-end | Win-Intr. | [email protected] | Stop (s) |
| MiniCPM -o 4.5 | 73.51 | 40.23 | 18.70 | 44.38 | 59.47 | 55.69 | 1.032 |
| Freeze-Omni | 86.17 | 28.40 | 49.76 | 91.82 | 73.64 | 45.75 | 1.239 |
| Moshi | 44.63 | 37.36 | 66.59 | 72.25 | 45.11 | 60.79 | 0.777 |
| Lychee-FD | 75.64 | 47.32 | 24.68 | 57.14 | 53.89 | 90.12 | 0.312 |
| PersonaPlex | 93.54 | 22.74 | 46.64 | 72.73 | 90.62 | 16.40 | 1.689 |
| Full-duplex interaction | Memory fidelity | ||||||
|---|---|---|---|---|---|---|---|
| Variant | cFD | Early | Pre-end | Latest | Stale | D-Adopt | Final |
| FIFO memory | 34.63 | 37.21 | 48.65 | 7.08 | 2.28 | 12.33 | 1.61 |
| w/o addressee gating | 40.14 | 31.48 | 46.36 | 6.39 | 0.91 | 17.35 | 1.75 |
| Untyped retrieval | 40.33 | 29.98 | 44.61 | 9.59 | 1.60 | 19.63 | 1.82 |
| ACT-Mem | 41.19 | 16.03 | 41.82 | 8.68 | 0.46 | 11.42 | 2.00 |
| 0.35 | 0.45 | 0.50 | 0.55 | 0.65 | 0.75 | |
|---|---|---|---|---|---|---|
| Recall (%) | 55.26 | 55.26 | 54.74 | 53.68 | 50.53 | 48.95 |
| F1 (%) | 71.19 | 71.19 | 70.75 | 69.86 | 67.13 | 65.72 |
Appendix figures & tables18 assets
Supplementary material from the paper’s appendix.
Appendix
| Quantity | Value |
|---|---|
| Sessions | 1,094 |
| Chinese / English | 577 / 517 |
| Interruption / backchannel sessions | 259 / 283 |
| Pause / talking-to-other sessions | 276 / 276 |
| Development / test sessions | 237 / 857 |
| Memory questions | 6,564 |
| Stage | Purpose | Execution semantics |
|---|---|---|
| play_audio | Context delivery | Plays the bounded audio window associated with a user event and preserves the event’s speaker, addressee, and dialogue-act metadata. |
| wait_for_assistant_ state | State-triggered synchronization | Waits for decoded assistant speech to satisfy a target state and a minimum active-speech duration. The stage terminates on satisfaction or timeout. |
| inject_interruption | Interruption challenge | Delivers the interruption audio only after the preceding speaking-state trigger has been satisfied. |
| inject_backchannel | Backchannel challenge | Delivers a backchannel only after the assistant has produced the required amount of active speech. |
| play_side_talk | Non-addressee speech | Plays speech addressed to another participant and then observes whether the assistant responds during the observation interval. |
| wait | Annotated pause or observation | Advances the scheduler for a fixed duration without fabricating user speech. A pause inside a turn is not treated as a semantic turn boundary. |
| Parameter | Value | Parameter | Value |
|---|---|---|---|
| Input chunk | Scheduler poll | ||
| Event padding | Assistant-start timeout | ||
| Interruption trigger speech | Backchannel trigger speech | ||
| Minimum response speech | Assistant-end timeout | ||
| Post-event silence | Stable assistant silence | ||
| Side-talk observation | QA pre-input quiet |
| Metric | Direction | Denominator or interpretation |
|---|---|---|
| protocol_valid | Attempted samples. | |
| behaviorally_observable | Attempted samples; requires usable decoded assistant speech. | |
| challenge_realization_rate | Distinct planned challenge identifiers. | |
| conditional_cfd | Challenge instances eligible for conditional behavioral scoring. | |
| adaptive_fd | Sample-level adaptive full-duplex score; auxiliary summary. | |
| trigger_timeout_rate | Distinct planned challenges. |
| Metric | Direction | Denominator or interpretation |
|---|---|---|
| response_rate | All memory questions. | |
| no_response_rate | All memory questions; complementary to response rate. | |
| latest_value_accuracy | All latest-value questions, including unanswered questions. | |
| superseded_value_error | All latest-value questions. | |
| distractor_adoption_rate | All distractor-ignore questions. | |
| distractor_rejection_accuracy | All distractor-ignore questions; rejection additionally requires a response. |
| Model | Native interface | Input / output | Chunk or inference window | Model-specific condition | GPU |
|---|---|---|---|---|---|
| MiniCPM -o 4.5 | Native streaming worker | kHz | ms input; ms native window | Greedy decoding, fixed seed, fixed reference audio | 1 |
| Freeze-Omni | Socket.IO-based streaming service | kHz | ms native input block | , , temperature ; neutral system prompt | 1 |
| Moshi | WebSocket streaming service | kHz | ms input block | Native server decoding; no evaluator-side task-specific sampling override | 1 |
| Lychee-FD | vLLM-backed streaming service | kHz | ms input; ms native inference window | Fixed prompt voice; native backend decoding | 2 |
| PersonaPlex -7B-v1 | Native WebSocket streaming service | kHz | ms input block | Fixed voice prompt and fixed random seed | 1 |
| Parameter | Value |
|---|---|
| Reference input chunk | |
| Evaluator polling interval | |
| Event-window padding | |
| Assistant-start timeout | |
| Assistant-end timeout | |
| Interruption trigger speech |
| Question type | Retrieval behavior | Maximum items |
|---|---|---|
| Latest-value QA | Selects the target entity’s current active value after ranking candidate facts. | 2 candidates, 1 final value |
| Ordinary memory QA | Retrieves active facts relevant to the question. | 4 |
| Final-summary QA | Aggregates active facts across entities and memory types. | 8 |
| Distractor-ignore QA | Routes directly to rejection behavior without memory retrieval. | 0 |
| Configuration | Value |
|---|---|
| Session split | train/validation/calibration/held-out |
| Trainable parameters | M |
| Controller parameters | M |
| Retriever parameters | M |
| Optimization stages | Joint training followed by retriever adaptation |
| Optimizer | AdamW |
| Model | Protocol valid | Behaviorally observable | Challenge realization | Conditional cFD | Adaptive FD | Trigger timeout | Response coverage | Speech duration (s) |
|---|---|---|---|---|---|---|---|---|
| MiniCPM -o 4.5 | 100.00 | 100.00 | 73.51 | 40.23 | 35.28 | 6.04 | 28.38 | 78.35 |
| Freeze-Omni | 100.00 | 100.00 | 86.17 | 28.40 | 30.41 | 0.53 | 76.03 | 203.16 |
| Moshi | 100.00 | 100.00 | 44.63 | 37.36 | 13.08 | 27.67 | 12.61 | 29.23 |
| Lychee-FD | 99.82 | 100.00 | 75.64 | 47.32 | 48.19 | 1.09 | 35.30 | 99.19 |
| PersonaPlex -7B-v1 | 100.00 | 100.00 | 93.54 | 22.74 | 35.41 | 1.73 | 32.43 | 74.20 |
| Model | Premature onset | Carry- in | Pre-end overlap | Pause intrusion | Stop P50 | Stop P90 | Stop@ 0.8 s |
|---|---|---|---|---|---|---|---|
| MiniCPM -o 4.5 | 18.70 | 25.86 | 44.38 | 59.47 | 1.032 | 1.446 | 55.69 |
| Freeze-Omni | 49.76 | 42.44 | 91.82 | 73.64 | 1.239 | 1.802 | 45.75 |
| Moshi | 66.59 | 5.49 | 72.25 | 45.11 | 0.777 | 0.864 | 60.79 |
| Lychee-FD | 24.68 | 32.96 | 57.14 | 53.89 | 0.312 | 0.440 | 90.12 |
| PersonaPlex -7B-v1 | 46.64 | 26.23 | 72.73 | 90.62 | 1.689 | 2.104 | 16.40 |
| Model | Response rate | No-response rate | Latest-value accuracy | Superseded-value error | Accuracy given response |
|---|---|---|---|---|---|
| MiniCPM -o 4.5 | 98.90 | 1.10 | 4.30 | 0.59 | 4.32 |
| Freeze-Omni | 99.94 | 0.06 | 11.61 | 3.38 | 11.61 |
| Moshi | 54.31 | 45.69 | 2.19 | 0.32 | 3.60 |
| Lychee-FD | 92.41 | 7.59 | 25.50 | 1.65 | 30.80 |
| PersonaPlex -7B-v1 | 96.40 | 3.60 | 5.85 | 2.29 | 5.93 |
| Model | Distractor adoption | Distractor rejection | Summary fact coverage | Legacy token |
|---|---|---|---|---|
| MiniCPM -o 4.5 | 14.17 | 85.19 | 2.01 | 29.45 |
| Freeze-Omni | 65.90 | 34.10 | 0.00 | 15.42 |
| Moshi | 44.15 | 8.32 | 0.04 | 7.64 |
| Lychee-FD | 48.17 | 51.55 | 1.06 | 21.36 |
| PersonaPlex -7B-v1 | 79.71 | 17.46 | 0.24 | 7.70 |
| Model | Attempted sessions | Protocol-valid sessions | Observable sessions | Memory questions | Latest-value questions |
|---|---|---|---|---|---|
| MiniCPM -o 4.5 | 1,094 | 1,094 | 1,094 | 6,564 | 2,188 |
| Freeze-Omni | 1,094 | 1,094 | 1,094 | 6,564 | 2,188 |
| Moshi | 1,094 | 1,094 | 1,094 | 6,564 | 2,188 |
| Lychee-FD | 1,094 | 1,092 | 1,094 | 6,564 | 2,188 |
| PersonaPlex -7B-v1 | 1,094 | 1,094 | 1,094 | 6,564 | 2,188 |
| Scenario | Expected behavior | Observed evidence | Diagnosis |
|---|---|---|---|
| Interruption | Stop the current response, replace Saturday evening with Saturday morning , and replace twenty-five minutes with ten minutes . | Both interruptions were realized, with median stopping latency s and [email protected] of . The model recovered Saturday morning , but did not recover ten minutes . When asked about the side information, it answered that the distractor should be saved. | Fast interruption stopping was accompanied by only partial factual revision and incorrect admission. This separates acoustic interruption recovery from transactional memory updating. |
| Pause handling | Remain silent during within-turn pauses, then commit the completed correction: Thursday morning and fifteen minutes . | For the same session, both examined models intruded into every evaluated pause. One model rejected the distractor but recovered neither scored latest value. The other recovered Thursday morning , but answered “I will save all the details into the final memory” for the distractor question and later included a travel toothbrush in its summary. | The first behavior is a missed update; the second is an admission failure followed by summary contamination. Both occur together with incorrect pause-boundary control. |
| Backchannel | Continue the current response without treating the backchannel as a new turn or a persistent fact. | All three challenges were realized, but session cFD was . The model nevertheless recalled the stable requirement to avoid hazelnut flavoring and retain whole beans, and correctly stated that the kitchen-clutter detail should not be saved. Its final summary remained incomplete. | Correct retention and distractor rejection can coexist with poor continuation behavior. Backchannel handling and final-state consolidation therefore require separate attribution. |
| Speech to others | Do not answer the non-addressed speech and do not admit its content into memory. | The session obtained RCR and cFD . The model explicitly rejected the side information, but failed both latest-value questions and produced an incomplete final summary. | Rejecting a queried distractor does not establish that the system maintained the intended active state. Addressee control, supersession, and later answer generation remain distinct stages. |
| Stage | Gold transition | Predicted transaction | Consequence |
|---|---|---|---|
| Initial request | Write provisional review time and budget constraints. | The controller predicted Write and committed extracted entity–value slots. | The initial values became active and were available to subsequent retrieval. |
| Correction | Update the review time to this Saturday morning and the electricity cap to $150 ; supersede both provisional values. | The controller predicted Update , but the extracted correction was represented as one compound slot with an entity key different from the provisional slots. | A new item was created, while the original items remained active and no supersession link was formed. The failure therefore occurred after the operation decision, during slot normalization and ledger resolution. |
| Distractor-bearing event | Commit the relevant condition and Ignore the explicitly excluded side detail. | The relevant condition was written, but the exclusion clause “just a side detail and should not be saved” was also extracted as an active fact. | The ledger became contaminated even though the user’s utterance explicitly expressed non-persistence. This is an incorrect-admission failure rather than a retrieval-only failure. |
| Latest-value QA | Retrieve the active corrected electricity cap and answer $150 . | No spoken answer was produced. | The case remains incorrect under the fixed denominator. The trace localizes the outcome to unresolved state construction followed by answer realization. |
| Distractor QA | Produce an explicit rejection without exposing the side detail as evidence. | No spoken answer was produced. | Neither adoption nor successful rejection is credited; silence is kept separate from selective exclusion. |
| Failure | Observable criterion |
|---|---|
| Trigger timeout | A speech-dependent challenge is planned but cannot be injected because the required assistant-speech condition is not reached. |
| Boundary violation | The assistant begins before a completed user turn, speaks during a protected pause, or intrudes into a non-response window. |
| Slow interruption stop | Assistant speech continues beyond the stopping threshold after an interruption is delivered. |
| Missed write | An admissible new fact produces no committed memory item. |
| Incorrect admission | Non-addressed, incomplete, backchannel, or explicitly excluded content is committed as persistent memory. |
| Failed supersession | A valid correction is detected, but the prior active value is not linked and marked as superseded. |
| Artifact group | Representative records | Reproducibility role |
|---|---|---|
| Session inputs | source.json , session audio, event audio | Defines language, scenario, event order, speaker roles, timing, and the rendered input waveform. |
| Interaction manifests | interactive_manifest.json , challenge and timing manifests | Specifies challenge conditions, observation windows, trigger rules, and the fixed execution order. |
| Memory supervision | memory_qa.json , reference-state records, update links | Provides question types, accepted and forbidden values, expected operations, supporting evidence, and final-state supervision. |
| Reference behavior | reference_behavior.json | Stores the intended interaction response for each challenge and the corresponding state-transition constraints. |
| Runtime execution | runtime_events.jsonl , VAD and timing records | Records challenge realization, response boundaries, interruption stopping, overlap, pauses, and execution failures. |
| Generated outputs | Assistant waveform, raw predictions, QA windows, frozen-ASR transcripts | Preserves the model output and the temporal windows used for answer attribution and transcription. |