File size: 6,738 Bytes
1ac1132 f7c4e02 1ac1132 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 | ---
license: apache-2.0
library_name: rubato
pipeline_tag: voice-activity-detection
tags:
- turn-taking
- endpointing
- spoken-dialogue
- survival-analysis
- realtime
- rubato
---
# Rubato — turn-taking timing model
**Predict the silence as a distribution, then decide when to speak.**
A 3,137-parameter model that answers one question at 50 Hz: *given
everything heard so far, how much longer will this silence last?* A dynamic
program turns that distribution into a start/wait decision under an explicit,
tunable asymmetry between talking over someone and answering late.
It decides **when** to talk. It does not decide **what** to say, and it contains
no speech recogniser, no language model and no synthesiser. It is a middle layer
you drop into an existing pipeline.
## Three lines
```python
from rubato import load_pretrained, CostWeights
taker = load_pretrained(hf_repo="NagaYu/rubato-timing", weights=CostWeights.from_seconds_per_collision(2.0))
should_speak = taker.push_audio(chunk).should_speak # one 20 ms frame of float audio
```
`seconds_per_collision` is the whole configuration surface: *how many seconds of
extra latency is one talk-over worth to you?* Small values give an eager agent,
large values a patient one, and the sweep between them is the Pareto front below.
Framework adapters: `rubato.integrations.pipecat_processor.RubatoTurnGate` and
`rubato.integrations.livekit_plugin.RubatoTurnDetector`.
Source, benchmark protocol, ablations and sensitivity analyses: **https://github.com/NagaYu/rubato**
## What it was measured to do

*Both axes are minimised. A fixed threshold can only ever trace the outer curve -- one threshold buys one point. The inset is the band real systems ship in.*
Held out on **5988 silences** from speakers never seen in training (maptask, CC-BY-4.0).
| | |
|---|---|
| covers the fixed-threshold frontier | **86%** of its points |
| covers the semantic-completeness frontier | **100%** of its points |
| latency saved at matched talk-over | **84 ms** vs fixed, 96 ms vs semantic |
| talk-over removed at matched latency | **2.8 pp** vs fixed, 2.1 pp vs semantic |
| hazard calibration (ECE) | 0.0007 |
| CRPS skill over a covariate-free hazard | +0.173 |
| layer cost per 20 ms frame | **0.26 ms** median, 0.49 ms p99 |
At the operating point matched to a 1000 ms threshold: latency **1000 → 772 ms** (95 % CI 707–831), talk-over **6.3% → 6.5%** (95 % CI 5.6%–7.6%). Intervals are a conversation-level cluster bootstrap.
## How it works
1. **Discrete-time hazard.** `h_k = P(partner resumes in frame k+1 | silent
through k, evidence up to k)`, from a one-hidden-layer network over a causal
feature vector: a radial-basis expansion of log elapsed silence, turn-so-far
duration and pause count, transcript completeness (gated by ASR lag, because a
real recogniser has not delivered the last word yet), terminal prosody where
audio exists, acoustic precursor cues such as in-breaths, and a running
per-partner posterior.
2. **Optimal stopping.** A backward dynamic program over the forecast survival
curve minimises `alpha * P(collision) + beta * latency`. Being pre-empted --
the human carries on while the agent is still silent -- costs nothing, which
is what produces the human-like behaviour: when a resumption looks likely,
waiting is nearly free; when the floor is clearly open, the agent can start at
zero gap.
3. **Online entrainment.** Conjugate posteriors over each partner's pause and gap
distributions, and an EMA of their speech rate, shrinking to a population
prior so the first thirty seconds are never worse than not adapting.
## Inputs, outputs, and what it needs from you
| you provide | per frame |
|---|---|
| 20 ms of mono audio (any rate; 16 kHz assumed) | required |
| the ASR's partial transcript | optional, improves accuracy |
| a partner id | optional, enables entrainment |
| you get back | |
|---|---|
| `should_speak` | the decision |
| `decision.planned_onset_s` | when it currently intends to start |
| `decision.p_overlap_now` | collision probability if it started this instant |
| `prediction.future_hazards` | the full predicted silence distribution |
## Limitations
- **English lexical features.** The temporal and acoustic half transfers; the
completeness features were fitted on English and will mislead elsewhere.
Retrain on target-language data.
- **Task-oriented training data.** Trained on the HCRC Map Task Corpus: two people collaborating on a route-following task. Open-domain conversation has
longer, more variable gaps; expect to retune `seconds_per_collision`.
- **Two-party only.** Multi-party floor management is a different problem.
- **The offline protocol makes an assumption.** On a floor transfer we assume the
floor would have stayed open had the agent not spoken. The alternative is
worse (informative censoring); both are reported in the repository README.
- **It is a timing layer, not a turn-taking oracle.** It cannot know that you
paused because you were about to say something difficult.
## Responsible use
Better timing makes an assistant less irritating. It also makes a synthetic voice
harder to distinguish from a person, and that is a use this model is **not** for.
- **Disclose that the system is an AI.** This model is released on the assumption
that the deployment does so, in the modality the user is actually attending to
-- spoken, not buried in a settings page.
- **Do not use it to impersonate anyone**, to make an automated caller pass as
human, or in any deployment whose value depends on the person not knowing.
Several jurisdictions require disclosure for automated calls; treat that as a
floor, not a target.
- **Do not use it to time interruptions strategically** -- to cut a person off at
a moment calculated to stop them finishing a thought. The asymmetric cost makes
that easy to configure, which is exactly why it is named here.
- The entrainment state is a behavioural profile of an individual. Keep it in
session scope unless you have a reason and consent to persist it.
## Training data
**maptask** (CC-BY-4.0). Anderson et al. (1991), The HCRC Map Task Corpus. Language and Speech 34(4). Annotations (c) 2007 HCRC, Univ. of Edinburgh & Univ. of Glasgow. CC BY 4.0. https://groups.inf.ed.ac.uk/maptask/
No audio was redistributed in building this model.
## Citation
```bibtex
@software{rubato,
title = {Rubato: predicting silence distributions for spoken-dialogue turn-taking},
year = {2026},
url = {https://huggingface.co/NagaYu/rubato-timing}
}
```
|