File size: 11,633 Bytes
7800076
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
---
language:
- en
license: openmdw-1.1
license_link: LICENSE.md
pipeline_tag: automatic-speech-recognition
base_model:
- nvidia/nemotron-3.5-asr-streaming-0.6b
tags:
- decision-model
- automatic-speech-recognition
- asr
- feature-extraction
- speech-to-speech
- duplex
- full-duplex
- turn-taking
- endpoint-detection
- barge-in
- backchannel
- streaming
- audio
- gru
- pytorch
- safetensors
---

<div align="center">
  <img src="assets/logo.jpeg" alt="NineNineSix" width="460" />
  <h1>TYGER</h1>
  <p>
    <a href="https://discord.gg/NzP3rjB4SB"><img src="https://img.shields.io/badge/Discord-Join_the_community-5865F2" alt="Discord" /></a>
    <a href="https://www.nineninesix.ai/"><img src="https://img.shields.io/badge/Website-NineNineSix-111827" alt="Website" /></a>
    <a href="https://github.com/nineninesix-ai/tyger-s2s"><img src="https://img.shields.io/badge/Voice_agent-tyger--s2s-181717" alt="Voice agent: tyger-s2s" /></a>
    <a href="LICENSE.md"><img src="https://img.shields.io/badge/License-OpenMDW_1.1-blue" alt="License: OpenMDW-1.1" /></a>
  </p>
</div>

**TYGER** - An open-weight speech decision model for real-time, full-duplex voice agents. It knows when to respond, keep listening, yield, and backchannel.


## Example

<audio controls src="https://cdn-uploads.huggingface.co/production/uploads/64fab67bd268b2f1ad8a826b/MG5P0_PpMeOp8OKydH2TC.wav"></audio>

## Use it

[**tyger-s2s**](https://github.com/nineninesix-ai/tyger-s2s) is our open-source
voice agent built on this model (Apache-2.0). You talk to it in the browser, as
on a phone call:

- this model is its ears: it transcribes you, and knows when you've finished,
  when you cut in, and when to say "mm-hm";
- LLM writes the replies, TTS speaks them in a cloned voice;
- it comes as a [Docker image](https://github.com/nineninesix-ai/tyger-s2s#docker),
  and can be the voice backend of
  [your own web app](https://github.com/nineninesix-ai/tyger-s2s#api-mode-tyger-behind-your-own-app).

To run the model in your own code, start from tyger-s2s's runtime
([`app/plugins/ears/tyger/`](https://github.com/nineninesix-ai/tyger-s2s/tree/main/app/plugins/ears/tyger)).

## The model

| | |
| --- | --- |
| Speech recognition | [NVIDIA Nemotron 3.5 ASR Streaming 0.6B](https://huggingface.co/nvidia/nemotron-3.5-asr-streaming-0.6b), unchanged, with its decoder and tokenizer |
| Turn-taker | a causal GRU: 3 layers, width 768 |
| Parameters | 652M: 638M Nemotron + 14M GRU, in FP32 (2.61 GB) |
| Input | two aligned mono 16 kHz streams: the user's mic and the agent's playback |
| Features | Nemotron's layer 15 (1,024 dims), one frame per 80 ms, no lookahead |
| Streaming | 320 ms hops; Nemotron re-encodes 8s window per stream at each hop |
| Output, per frame | the turn state (listen, hold, speak, backchannel) and hazard, barge-in, backchannel and endpoint scores |
| State per conversation | 9 KiB of GRU state, besides the audio windows |
| Language | English |

This repo holds weights and configs, no inference code.

## Events

| Event | When | The app | Default threshold |
| --- | --- | --- | ---: |
| Endpoint | the user has finished | answers | 0.91 |
| Barge-in | the user cuts in while the agent talks | stops the reply at once | 0.50 |
| Backchannel | a "mm-hm" fits while the user talks | plays one; the user keeps the turn | 0.40 |

Guards: 6 warm-up frames, at least 350 ms of speech above -50 dB, 1.2 s between
backchannels, and an endpoint after 1.2 s of silence even if the score stays
low. The state input is LISTEN while the agent listens and SPEAK while it
talks, never the model's own guess. The barge-in and backchannel defaults are
looser than the evaluation's (0.93 and 0.80) and have no measurements of their
own: tune them in your app (tyger-s2s's page has sliders for that).

## Training

The GRU, its input layers and its heads were trained from scratch on
[Open Yap 1K v1.0](https://theagenticdatacompany.com/open-yap-1k) (1,395
training, 107 development and 100 test conversations), with Nemotron frozen.
The labels come automatically from when each side speaks, not from human
annotators: the turn state, an upcoming speaking onset (hazard), when to yield
to an interruption, when a backchannel fits, and whether a pause ends the turn.
One training seed.

## Evaluation

Offline scores for the released weights, at endpoint 0.91, barge-in 0.93 and
backchannel 0.80, set on development data and frozen before test scoring.
[evaluation/README.md](evaluation/README.md) has the definitions and caveats,
and [metrics.json](evaluation/metrics.json) every number.

![Endpoint latency, early cut-ins and misses across three evaluation sets](assets/endpoint-evaluation.png)

**Endpoints,**:

| Set | Turns | Latency, median / mean | Early cut-ins | No endpoint within 1.2 s | Pauses with a false endpoint |
| --- | ---: | ---: | ---: | ---: | ---: |
| Open Yap 1K test | 1,000 | 252.5 / 465.0 ms | 29.90% | 7.40% | 415 of 1,000 |
| Full-Duplex-Bench v1.0, CANDOR | 119 | 307.5 / 383.0 ms | 25.21% | 5.04% | 123 of 277 |
| Internal, not public | 242 | 252.5 / 286.5 ms | 12.40% | 0.00% | 186 of 539 |

- Latency runs from the end of the user's turn, and counts only endpoints that
fired: read it with the early cut-ins (an endpoint before the turn really
ended) and the misses.
- With the fallback off, Open Yap's mean latency is 436.5 ms, and 16.0% of turns
get no endpoint within 1.2 s.

**Turn state, barge-in and backchannel** (Open Yap 1K test):

| Metric | Value |
| --- | ---: |
| Turn-state macro-F1 | 0.9436 |
| Endpoint ROC-AUC / AP | 0.9839 / 0.8149 |
| Barge-in ROC-AUC / AP | 0.9797 / 0.6657 |
| Backchannel ROC-AUC / AP | 0.8976 / 0.3004 |
| Barge-ins caught within 640 ms / median delay | 25.32% / 400 ms |
| False barge-ins per hour of clean speech | 0.00 (none in 4.72 h; not a guarantee) |
| Backchannels caught / median delay | 14.86% / -160 ms (before the labeled moment) |
| Backchannels fired per hour of listening | 135.08 |

**Speed:** the GRU takes 0.805 ms per frame (median; p90 0.823 ms) on an RTX
4090 at batch 1, with 108.76 MiB of peak GPU memory. That leaves out Nemotron
and waiting for audio. In tyger-s2s, the whole model takes ~4 GB of GPU memory
for 4 conversations.

**Limits:**
- Offline diagnostics only: no live voice-agent benchmark, and no new ASR
  error rates ([NVIDIA's card](upstream/NVIDIA_MODEL_CARD.md) has its own).
- One training seed, and the evaluation sets also guided development. The
  internal set can't be reproduced.
- The Full-Duplex-Bench rows are adapted v1.0 CANDOR replays with a silent
  agent channel, not official full-agent scores. FDB-v3 isn't evaluated.

## License

TYGER's weights and files are OpenMDW-1.1. NVIDIA's original
card, figures and license are unchanged in `upstream/` and `licenses/`, and
`manifest.json` lists every file's size and SHA-256. See
[LICENSE.md](LICENSE.md) and [NOTICE.md](NOTICE.md).

## Links

- **Voice agent:** [nineninesix-ai/tyger-s2s](https://github.com/nineninesix-ai/tyger-s2s)
- **Website:** [nineninesix.ai](https://www.nineninesix.ai/)
- **Discord:** [NineNineSix community](https://discord.gg/NzP3rjB4SB)
- **Training data:** [Open Yap 1K](https://theagenticdatacompany.com/open-yap-1k)
- **ASR:** [NVIDIA Nemotron](https://huggingface.co/nvidia/nemotron-3.5-asr-streaming-0.6b)

## Acknowledgments

We thank NVIDIA for Nemotron, The Agentic Data Company for Open Yap 1K, and the
authors of [Full-Duplex-Bench](https://arxiv.org/abs/2503.04721) for its
evaluation probes. Related work, not bundled or reproduced here:
[Full-Duplex-Bench-v3](https://arxiv.org/abs/2604.04847),
[Moshi](https://arxiv.org/abs/2410.00037),
[SALM-Duplex](https://arxiv.org/abs/2505.15670),
[Freeze-Omni](https://arxiv.org/abs/2411.00774),
[PersonaPlex](https://arxiv.org/abs/2602.06053) and
[Audio Flamingo 3](https://arxiv.org/abs/2507.08128).

## Citation

If you use TYGER, please cite the model and its training data:

```bibtex
@misc{tyger_2026,
  author    = {{NineNineSix}},
  title     = {{TYGER}: Speech Recognition and Duplex Turn Control},
  year      = {2026},
  publisher = {NineNineSix},
  url       = {https://huggingface.co/nineninesix/tyger}
}

@misc{openyap1k,
  title     = {Open Yap 1K: Channel-Separated English Natural Two-Speaker Conversations},
  author    = {{The Agentic Data Company}},
  year      = {2026},
  version   = {1.0},
  publisher = {The Agentic Data Company},
  url       = {https://theagenticdatacompany.com/open-yap-1k}
}
```

## References

<details>
<summary>BibTeX for the ASR component and related work</summary>

```bibtex
@misc{nvidia_nemotron_3_5_asr,
  author = {{NVIDIA}},
  title  = {Nemotron 3.5 ASR Streaming 0.6B},
  url    = {https://huggingface.co/nvidia/nemotron-3.5-asr-streaming-0.6b},
  note   = {Bundled revision ea30d66debe3740a08b573244286791d423d6b3e}
}

@misc{lin2025fullduplexbench,
  title = {Full-Duplex-Bench: A Benchmark to Evaluate Full-duplex Spoken Dialogue Models on Turn-taking Capabilities},
  author = {Lin, Guan-Ting and Lian, Jiachen and Li, Tingle and Wang, Qirui and Anumanchipalli, Gopala and Liu, Alexander H. and Lee, Hung-yi},
  year = {2025}, eprint = {2503.04721}, archivePrefix = {arXiv},
  url = {https://arxiv.org/abs/2503.04721}
}

@misc{lin2026fullduplexbenchv3,
  title = {Full-Duplex-Bench-v3: Benchmarking Tool Use for Full-Duplex Voice Agents Under Real-World Disfluency},
  author = {Lin, Guan-Ting and Chen, Chen and Chen, Zhehuai and Lee, Hung-yi},
  year = {2026}, eprint = {2604.04847}, archivePrefix = {arXiv},
  url = {https://arxiv.org/abs/2604.04847}
}

@misc{defossez2024moshi,
  title = {Moshi: a speech-text foundation model for real-time dialogue},
  author = {D\'{e}fossez, Alexandre and Mazar\'{e}, Laurent and Orsini, Manu and Royer, Am\'{e}lie and P\'{e}rez, Patrick and J\'{e}gou, Herv\'{e} and Grave, Edouard and Zeghidour, Neil},
  year = {2024}, eprint = {2410.00037}, archivePrefix = {arXiv},
  url = {https://arxiv.org/abs/2410.00037}
}

@misc{hu2025salmduplex,
  title = {SALM-Duplex: Efficient and Direct Duplex Modeling for Speech-to-Speech Language Model},
  author = {Hu, Ke and Hosseini-Asl, Ehsan and Chen, Chen and Casanova, Edresson and Ghosh, Subhankar and {\.{Z}}elasko, Piotr and Chen, Zhehuai and Li, Jason and Balam, Jagadeesh and Ginsburg, Boris},
  year = {2025}, eprint = {2505.15670}, archivePrefix = {arXiv},
  url = {https://arxiv.org/abs/2505.15670}
}

@misc{wang2024freezeomni,
  title = {Freeze-Omni: A Smart and Low Latency Speech-to-speech Dialogue Model with Frozen LLM},
  author = {Wang, Xiong and Li, Yangze and Fu, Chaoyou and Shen, Yunhang and Xie, Lei and Li, Ke and Sun, Xing and Ma, Long},
  year = {2024}, eprint = {2411.00774}, archivePrefix = {arXiv},
  url = {https://arxiv.org/abs/2411.00774}
}

@misc{roy2026personaplex,
  title = {PersonaPlex: Voice and Role Control for Full Duplex Conversational Speech Models},
  author = {Roy, Rajarshi and Raiman, Jonathan and Lee, Sang-gil and Ene, Teodor-Dumitru and Kirby, Robert and Kim, Sungwon and Kim, Jaehyeon and Catanzaro, Bryan},
  year = {2026}, eprint = {2602.06053}, archivePrefix = {arXiv},
  url = {https://arxiv.org/abs/2602.06053}
}

@misc{goel2025audioflamingo3,
  title = {Audio Flamingo 3: Advancing Audio Intelligence with Fully Open Large Audio Language Models},
  author = {Goel, Arushi and Ghosh, Sreyan and Kim, Jaehyeon and Kumar, Sonal and Kong, Zhifeng and Lee, Sang-gil and Yang, Chao-Han Huck and Duraiswami, Ramani and Manocha, Dinesh and Valle, Rafael and Catanzaro, Bryan},
  year = {2025}, eprint = {2507.08128}, archivePrefix = {arXiv},
  url = {https://arxiv.org/abs/2507.08128}
}
```

</details>