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.

**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> |