turn-1-mini (v2)

A 5.4M-parameter model that knows when someone has finished talking, and when someone is cutting in. Streaming, audio only, no transcript, CPU real time. Apache-2.0. Built by Kollaikal Rupesh at p99lab.

Version 2 keeps v1's size class and cost and adds:

  • Fast, multi-party end-of-turn: give it every speaker's channel and it decides that a turn is over when its own speaker has stopped AND someone else has just started to take the floor. Single-channel end-of-turn scores are exactly v1's.
  • An interruption output (INT): P(this speaker is taking the floor), as opposed to a backchannel ("yeah", "mm-hm") or a laugh.
  • Speech-activity (VAD) and floor-claim outputs per channel, shared with the other channels as the REST input.
  • An optional REST input: the other channels of a call, or your agent's own playback. Leave it out and the model runs single-channel, like v1.

Install

pip install "p99turn[torch] @ https://huggingface.co/p99lab/turn-1-mini/resolve/main/dist/p99turn-2.0.0-py3-none-any.whl"

v2 runs with PyTorch on CPU (turn-1-mini-v2.safetensors, 21 MB). The v1 files in this repo (turn-1-mini.safetensors, the 8-bit copy, the ONNX streaming graphs and the 1.2.3 wheel) are unchanged, and Turn1Mini / Turn1MiniOnnx from the 2.0.0 package load them exactly as before. v1's model card: revision e3c8bc7.

Results

Every number below was measured by the benchmark's own scorer, with thresholds chosen on the benchmark's dev split where the protocol says so. v1 is the released turn-1-mini 1.2.3, run by us through the same code.

Benchmark Measure v1 (1.2.3; INT rows: v1 TurnBench interruption head, not released) v2
MultiPartyTurnBench test (2-5 speakers) EOT 86.9% recall, 25.3% FPR, p50 1087 ms 92.2% recall, 3.8% FPR, p50 210 ms
MultiPartyTurnBench test (2-5 speakers) INT 31.3% recall, 9.5% FPR, p50 777 ms 28.5% recall, 5.5% FPR, p50 1021 ms (same output at the earlier threshold: 40.9%, 9.0%, 810 ms)
TurnBench dev (2 speakers) EOT 54.6% recall, 9.9% FPR, p50 811 ms 82.1% recall, 10.0% FPR, p50 525 ms with REST (single channel: 54.6%, 9.9%, 811 ms)
TurnBench dev (2 speakers) INT 96.0% recall, 4.2% FPR, p50 688 ms 96.8% recall, 5.4% FPR, p50 850 ms with REST (single channel: 96.0%, 3.6%, 1083 ms)
eot-bench English (single channel) false cut-offs @ 300 / 600 ms 22.6% / 9.6% 22.6% / 9.6% (unchanged by construction)
eot-bench English (single channel) latency @ 5% / 10% cut-offs 849 / 581 ms 849 / 581 ms (unchanged by construction)

What this supports, and what it does not:

  • MultiPartyTurnBench EOT (192 test conversations; conversation-clustered bootstrap, B = 10,000): recall 92.2% [91.6%, 92.8%], false alarms on mid-turn holds 3.8% [1.2%, 6.7%], median latency 210 ms [200, 221]. Against v1: recall +4.1 to +6.5 points, false alarms -14.4 to -28.6 points. The paper reports VAP at 92.6% recall, 7.5% false alarms and 143 ms: v2's recall is level with VAP's (the intervals overlap), its false-alarm rate is lower, and VAP decides about 70 ms earlier. v2 does not beat VAP on latency.
  • How the operating point was chosen: thresholds were selected on the benchmark's dev split with a dev false-alarm budget of 5.5%, stricter than the benchmark's standard 10%. The end-of-turn read-out used with several channels ("fast-onset", below) was designed after inspecting false alarms on that dev split. It was then confirmed on TurnBench dev before the test split was scored. This v2 family has been scored on the MultiPartyTurnBench test split four times during development; this table is the fourth look.
  • INT on MultiPartyTurnBench is not a strength: the same INT output gives 28.5% recall at 5.5% false alarms at the threshold chosen with the 5.5% budget, and 40.9% at 9.0% at the threshold chosen in an earlier round. The paper's best in-budget INT system, Kyutai's semantic VAD, reports 56.2% at 6.6%. On TurnBench dev, INT matches our earlier TurnBench interruption head on recall without needing a separate voice-activity model.
  • TurnBench numbers are on its public dev set (test labels are withheld). With REST, end-of-turn decides 290 ms earlier than v1 at a much higher recall. Its false-alarm rate (10.0%) sits at the 10% budget of that benchmark's sweep. v2's previous REST read-out had 3.8% false alarms at 719 ms there; use read-out 0 if false alarms matter more than speed.
  • Real meetings (report-only): on MultiPartyTurnBench's real-speech AMI slice (15 four-person meetings, 7.1 h; thresholds selected inside the slice, as the paper does), end-of-turn reaches 82.4% recall at 9.3% false alarms (p50 800 ms) and INT 86.2% at 8.7%. The paper reports VAP at 52.1% / 8.2% (EOT) and 35.9% / 5.3% (INT) on that slice. Caveats: the slice has no dev/test split, so in-slice numbers are optimistic. Two of its meetings (TS3004a-b) are in our own development set. Five of its meeting series were in an earlier p99lab training set whose relation to v1's trunk is not re-verified. All eight of its series were excluded from v2's training. Without TS3004 the numbers are 81.2% / 9.7%.
  • eot-bench is single-channel, where v2 is v1 by design (the frozen v1 path; checked on real audio, max difference 1.5e-7).
  • The multi-party gains need the REST input: run all channels together.

Cost

v1 v2 single channel v2 per channel, 2-channel group
CPU per 160 ms step, 1 thread, 1 stream (3 interleaved runs, same core) 2.65-2.66 ms 2.63-2.65 ms 2.68-2.69 ms

No GPU needed. Single channel, v2 costs no more than v1. Per channel in a multi-channel group it costs about 1% more than v1, because each channel shares its speech-activity and floor-claim values with the others. 5,369,033 parameters (v1: 5,262,337).

End-of-turn read-outs

Read-out When What it is
3, "fast-onset" (default with 2 or more human channels) every speaker has a channel (1 - P_speech(own)) x max over the others of P_claim(now) x (1 - max over the others of P_claim 1 s ago): this speaker has stopped and someone else has just started to take the floor
0, trained correction (default with one channel + rest_activity) one human channel + your agent's playback activity v1's score plus a learned correction from the REST input, Platt-calibrated
single channel (no REST) one channel, nothing else exactly v1's score

Choose with m.stream(n_channels, readout=0 or 3). Read-out 3 is a score, not a calibrated probability.

Outputs and default thresholds

Output Meaning Default threshold How it was set
eot, 2+ channels (read-out 3) the turn is over 0.32 highest recall at a 10% false-alarm rate on mid-turn holds, p99lab dev data (AMI / ICSI / otoSpeech held out). The MultiPartyTurnBench rows above use 0.25 (its dev split, 5.5% budget)
eot, one channel + agent playback (read-out 0) same 0.82 same rule
eot, single channel v1's score, unchanged 0.36 same rule, single-channel mode
int this speaker's new vocalisation is a floor-taking interruption 0.70 (with REST), 0.74 (single channel) highest recall at a 10% false-alarm rate on backchannels and laughter, same dev data
vad this speaker is speaking 0.5

Commit rule used for these thresholds and on all three benchmarks: fire on the rising edge above the threshold, then wait 2 s before firing again. Re-tune on your own audio when you can.

Quick start

from p99turn import Turn1MiniV2
m = Turn1MiniV2()                                  # 16 kHz mono float32 in; 4 kHz low-pass applied inside the stream
s = m.stream()                                     # one human channel
for chunk in mic_chunks():
    out = s.push([chunk])                          # one value per finished 20 ms frame
    if len(out["eot"][0]) and out["eot"][0][-1] > 0.36:
        respond()
    if len(out["int"][0]) and out["int"][0][-1] > 0.74 and agent_is_speaking:
        stop_talking()                             # barge-in

s = m.stream(n_channels=4)                         # four people, one channel each (read-out 3): every channel's REST = the other three
out = s.push([c1, c2, c3, c4])                     # end of turn on channel k: out["eot"][k] > 0.32

Training data

All training audio is ours to use and licensed for commercial use (CC BY 4.0):

  • AMI Meeting Corpus, headset channels (AMI Consortium; Carletta et al. 2005).
  • ICSI Meeting Corpus, close-talk channels (Janin et al. 2003).
  • otoSpeech full-duplex processed 141 h and task-oriented 20 h (otoearth).

Labels were derived by p99lab from each speaker's activity and word timings, following TurnBench's published annotation scheme. No benchmark audio or labels were used for training or calibration: not eot-bench, TurnBench (dev or test, or its otoSpeech-turn-104h training set), or MultiPartyTurnBench. MultiPartyTurnBench's dev split was used to choose among candidate models and end-of-turn read-outs (see Results). The AMI meetings in MultiPartyTurnBench's real-speech table (series ES2002, ES2003, ES2004, ES2005, IS1000, IS1001, TS3003, TS3004) were excluded. An audio-level check of all 154 TurnBench dev and test conversations against every otoSpeech session found 0 duplicates (the same check finds 15 of 40 known overlapping sessions between the two otoSpeech releases). The trunk is unchanged from v1.

Limits

  • English only.
  • The 4 kHz band limit of v1 still applies (the stream applies it).
  • The INT output decides between "taking the floor" and "backchannel or laugh". It does not judge whether an interruption is polite, and it does not remove echo of your agent's own voice: use acoustic echo cancellation in front of it.
  • Read-out 3 needs a channel per speaker; it cannot see a speaker who has no channel. On noisy channels its speech-activity output is less reliable (this release's activity module was trained without noise augmentation; a noise-augmented variant is more robust on our noisy dev set but was not faster on MultiPartyTurnBench).
  • Single-channel end-of-turn detection is unchanged from v1 (same score, same limits: pauses inside numbers, letters and email addresses remain the hardest case).

How to credit

"turn-1-mini by p99lab", with a link to https://huggingface.co/p99lab/turn-1-mini. Keep the NOTICE file (Apache-2.0, section 4), which carries the AMI, ICSI and otoSpeech attributions.

Downloads last month
2,491
Inference Providers NEW
This model isn't deployed by any Inference Provider. ๐Ÿ™‹ Ask for provider support

Model tree for p99lab/turn-1-mini

Finetunes
1 model