Commit edc1ab9
committed
[Frontend][Voxtral] Add opt-in segment timestamps to /v1/realtime
The realtime WebSocket API streams transcription text with no timing
information, so clients doing diarization, subtitling or alignment have to
guess word timing from message arrival (#39735).
Voxtral realtime emits one token per 80 ms audio frame, so an output token's
index is an index into the audio, and `[STREAMING_WORD]` marks where an
emission group ends. Clients opt in per connection with
`timestamp_granularities: ["segment"]` on `session.update` and get a
`segments` array of `{text, end}` on `transcription.delta` and
`transcription.done`.
Alignment:
end_s(k) = (len(prompt_tokens) - n_pad_frames - n_delay + k) * 0.08
The left pad is audio and the delay tokens are not, so both must come out of
the prompt length; the formula proposed on the issue subtracts only the delay
and lands every timestamp 2.56 s late. The pad is derived from the pad audio
rather than from `n_left_pad_tokens` - mistral-common builds one from the
other today, and a change that decoupled them would otherwise silently shift
every timestamp - and mismatches raise instead.
Segments are emission groups, not words: the model omits `[STREAMING_WORD]`
for words sharing an emission frame by design (arXiv 2602.11298 sections 3.1
and 6.2), and the marker precedes the subwords of its own group, so a
boundary closes the segment accumulated since the previous boundary.
Segmentation is on token ids, not delta text, because the boundary token
decodes to the empty string under `skip_special_tokens`.
Also adds the `session.updated` acknowledgement, which makes the opt-in
verifiable instead of silent, and replaces three tests' 5 s waits for an
event the server never sent.
Models opt in with `supports_realtime_segment_timestamps`; Qwen3-ASR
realtime inherits `False` since it re-prompts per segment and has no
token-per-frame lockstep. Clients that do not opt in see byte-identical
payloads: the `segments` key is omitted entirely.
Rejected at negotiation, each naming problem, cause and fix: a model that
cannot do it, a model advertising support it has not implemented, `word`
granularity, a tokenizer without the marker, and `--stream-interval > 1`.
That last one is not a timestamp limitation - batching withholds an output
until `stream-interval` tokens accumulate, but the lockstep cannot produce
the next token until the previous one is streamed back, so realtime stalls
whether or not timestamps were requested. The error says so rather than
suggesting the opt-in be dropped.
Signed-off-by: Andrii Pasternak <andriipasternak31@gmail.com>1 parent 0055b8b commit edc1ab9
8 files changed
Lines changed: 1060 additions & 65 deletions
File tree
- docs/serving/online_serving
- examples/speech_to_text/realtime
- tests/entrypoints/speech_to_text/realtime
- vllm
- entrypoints/speech_to_text/realtime
- model_executor/models
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
181 | 181 | | |
182 | 182 | | |
183 | 183 | | |
184 | | - | |
| 184 | + | |
| 185 | + | |
185 | 186 | | |
186 | 187 | | |
187 | 188 | | |
| |||
196 | 197 | | |
197 | 198 | | |
198 | 199 | | |
199 | | - | |
| 200 | + | |
200 | 201 | | |
201 | 202 | | |
202 | 203 | | |
203 | 204 | | |
204 | 205 | | |
205 | 206 | | |
| 207 | + | |
206 | 208 | | |
207 | 209 | | |
208 | 210 | | |
209 | 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 | + | |
210 | 255 | | |
211 | 256 | | |
212 | 257 | | |
| |||
Lines changed: 36 additions & 4 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
45 | 45 | | |
46 | 46 | | |
47 | 47 | | |
48 | | - | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
49 | 55 | | |
50 | 56 | | |
51 | 57 | | |
| |||
60 | 66 | | |
61 | 67 | | |
62 | 68 | | |
63 | | - | |
64 | | - | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
65 | 84 | | |
66 | 85 | | |
67 | 86 | | |
| |||
99 | 118 | | |
100 | 119 | | |
101 | 120 | | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
102 | 125 | | |
103 | 126 | | |
104 | 127 | | |
| |||
115 | 138 | | |
116 | 139 | | |
117 | 140 | | |
118 | | - | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
119 | 146 | | |
120 | 147 | | |
121 | 148 | | |
| |||
134 | 161 | | |
135 | 162 | | |
136 | 163 | | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
137 | 169 | | |
138 | 170 | | |
139 | 171 | | |
| |||
Lines changed: 138 additions & 34 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
3 | 3 | | |
4 | 4 | | |
5 | 5 | | |
6 | | - | |
7 | 6 | | |
8 | 7 | | |
9 | 8 | | |
| |||
70 | 69 | | |
71 | 70 | | |
72 | 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 | + | |
73 | 204 | | |
74 | 205 | | |
75 | 206 | | |
| |||
95 | 226 | | |
96 | 227 | | |
97 | 228 | | |
98 | | - | |
99 | | - | |
100 | | - | |
101 | | - | |
102 | | - | |
103 | | - | |
104 | | - | |
105 | | - | |
106 | | - | |
107 | | - | |
108 | | - | |
| 229 | + | |
| 230 | + | |
109 | 231 | | |
110 | 232 | | |
111 | 233 | | |
| |||
203 | 325 | | |
204 | 326 | | |
205 | 327 | | |
206 | | - | |
207 | | - | |
208 | | - | |
209 | | - | |
210 | | - | |
211 | | - | |
212 | | - | |
213 | | - | |
214 | | - | |
215 | | - | |
216 | | - | |
| 328 | + | |
| 329 | + | |
217 | 330 | | |
218 | 331 | | |
219 | 332 | | |
| |||
239 | 352 | | |
240 | 353 | | |
241 | 354 | | |
242 | | - | |
243 | | - | |
244 | | - | |
245 | | - | |
246 | | - | |
247 | | - | |
248 | | - | |
249 | | - | |
250 | | - | |
251 | | - | |
252 | | - | |
| 355 | + | |
| 356 | + | |
253 | 357 | | |
254 | 358 | | |
255 | 359 | | |
| |||
0 commit comments