Oruk research / Experiment
How much faster can the same speech model run?
We kept the acoustic models fixed and changed how they run. The experiments measure the cost in milliseconds and the effect on recognition quality.
Ribbons straighten between fixed endpoints, illustrating reduced runtime overhead. The motion is schematic.
We optimized an existing speech recognizer without changing its weights or greedy decoding rule. All 500 raw transcripts matched the original. With an encoder cache prepared on development recordings and then frozen, p95 waveform-to-text latency fell from 77.5 to 59.4 milliseconds on an A100. A smaller benchmark with every input shape already prepared gave a much larger improvement: four times faster on average.
Both measurements came from an experimental offshoot of Resonance 2. We began with a Jev-inspired interface for answering questions about vocal affect, then optimized the transcription path separately. A fixed set of vocal attributes can be read out together; a transcript still requires sequence decoding.
The experiments ran in a separate branch. The main model and service are unchanged.
Reading several answers from one encoding
Jev's System One interface replaces generated prose with bounded outputs: a choice among options, a score on an ordered scale, or a yes/no probability. We adopted that interface for the 31 affect and delivery attributes already supported by our speech model. A reusable schema specifies the requested outputs, and the readouts use the same encoded recording.
This gives the caller a direct way to ask for several judgments about how speech sounds. It does not require a language model to write those judgments as text. It also does not turn the 31 attributes into a general question-answering system: an unfamiliar question still needs a suitable learned readout.
Separate encoders for affect and transcription
A choice among supplied options
The readout uses the requested affect attributes to assign a distribution over the options. All options use the same audio encoding.
Returns Option probabilities
The options must map to supported attributes. Calibration has not been established for arbitrary choice distributions.
For transcription, we retained the full Parakeet TDT 0.6B v2 recognizer. Although its encoder has the same architecture as the affect encoder, the learned weights differ. We therefore kept both encoders. The experiments below measure the transcription and affect paths separately.
Transcription with the original weights
The first transcription change was to pass audio tensors directly to the model, bypassing the transcription wrapper's data loading and setup. We also used CUDA graphs for decoding and cached graphs for a bounded number of encoder input shapes. A CUDA graph records GPU operations so that later calls can replay them with less CPU coordination. We evaluated these changes together; the timings measure the resulting runtime, rather than the contribution of each optimization.
We initially kept the original greedy decoding rule, which selects one continuation at each step. All 500 raw transcripts matched the original implementation. This establishes output agreement on the evaluated recordings, allowing us to compare runtime without a simultaneous change in recognition quality.
We then tested a separate accuracy profile using beam search, which retains several candidate continuations. We selected a beam width of eight and the decoder's native temperature of 1 on 200 development recordings, then fixed that configuration before scoring another 500 recordings. The latter set contained 4,423 reference words: beam search made 264 errors, compared with 278 for greedy decoding. WER fell from 6.29% to 5.97%, a reduction of 0.317 percentage points, or 5.04% relative.
Word error rate by decoding profile
264 errors, down from 278.
5.04% relative error reduction.
The paired 95% bootstrap interval for the WER change was −0.626 to −0.045 percentage points, resampling speakers. The selection and confirmation sets were disjoint, but both came from previously exposed Common Voice development material. The interval describes variation within this historical sample; it does not account for that exposure.
What happens when the next recording has a different length?
Encoder graphs in this implementation are tied to exact input shapes. Repeating a recording lets the runtime reuse a graph it has already prepared. A recording of a different length may miss the cache, in which case the runtime must either create a graph or execute the encoder normally.
On 20 FLEURS recordings, with every shape warmed before timing, the speed profile averaged 18.4 ms against 73.4 ms for the original implementation. But a single pass through 500 varied recordings, including decoder setup and new graph captures, had a p95 of 191.8 ms against 82.2 ms for its control. The latter comparison also used different optional CUDA dependencies for the control and candidate. It exposed a slow-request problem in that configuration, without isolating graph capture as its sole cause.
We changed the cache policy: prepare up to 32 shapes using development recordings, then stop adding shapes. A cache miss during a request now uses ordinary encoder execution. This removes new encoder captures from the timed path while retaining graph replay where a shape matches.
Latency across three workloads
500 Common Voice recordings × 3 shuffled passes. A 32-shape encoder cache is warmed using development clips, then frozen before timing. All profiles use the same dependency environment.
Encoder replay served 159 of 1,500 requests per candidate (10.6%). The remaining 1,341 used ordinary execution. No new encoder graphs were captured. The accuracy profile was slower than its control at p95 in pass 3.
Measurements by profile and pass
| Profile | Mean, ms | p95, ms |
|---|---|---|
| Original | 69.148 | 77.527 |
| Accuracy | 60.857 | 74.645 |
| Speed | 48.488 | 59.384 |
| Profile | Pass 1 | Pass 2 | Pass 3 |
|---|---|---|---|
| Original | 82.17 | 72.12 | 70.20 |
| Accuracy | 79.73 | 71.53 | 71.20 |
| Speed | 63.31 | 54.03 | 53.98 |
Under this policy, only 10.6% of candidate requests hit the encoder cache. Most ran through the encoder normally, although all used the decoder graphs. Across three shuffled passes over 500 recordings, the speed profile averaged 48.5 ms versus 69.1 ms for the control; p95 was 59.4 ms versus 77.5 ms. Every profile used the same dependency environment, and all 4,500 transcripts matched the outputs recorded before the timing experiment.
The accuracy profile had a pooled p95 of 74.6 ms. Its small advantage over the control reversed in the third pass, where it took 71.2 ms against 70.2 ms. The speed profile retained a latency advantage in each pass; the evidence for a consistent tail-latency improvement with beam search is weaker.
The affect readout required a separate comparison
The typed interface reuses an affect encoding, but the accuracy of its answers still depends on the readout. We tested a mixture of two existing heads, assigning 65% weight to the retained head and 35% to a head trained with binary cross-entropy. Both heads used one encoder. We ran that encoder in BF16 and kept the heads in FP32; the acoustic encoder was not retrained for this experiment.
The mixture improved validation F1. On the 7,381-recording historical confirmation split, however, macro F1 was 41.422%, compared with 41.452% for the original model. The 95% interval for the difference spanned −0.194 to +0.203 percentage points. Average precision increased and Brier error decreased, so the ordering depended on which property of the predictions we measured.
Macro F1 of the original and ensemble readouts
Δ F1 = -0.030 pp; 95% interval [-0.194, +0.203]. 7,381 recordings, 362 groups. The interval includes both an increase and a decrease in F1; it does not establish equivalence.
Average precision, probability error and timing
| Metric | Original | Candidate |
|---|---|---|
| Raw macro AP ↑ | 0.4346 | 0.4367 |
| Fraction Brier ↓ | 0.04748 | 0.04730 |
Warm p95: 24.6 → 15.8 ms. Measured over 100 repetitions of a 10-second prefix from one recording, after 10 warmups. This tests repeated-input compute time rather than varied traffic.
Our predeclared acceptance rule required no decrease in macro F1 over all 31 labels. The candidate missed that criterion, and the original remains the default.
Evaluation details
Transcription data and scoring
The selection set contained 200 Common Voice recordings from 200 speakers; the confirmation set contained 500 recordings from 500 speakers. We checked for overlap by speaker, recording ID, audio-file hash and decoded-audio hash. Both sets came from historical development material. Their human reading prompts had previously been normalized for CTC and were not independently re-adjudicated for this experiment.
WER is the total number of substitutions, deletions and insertions divided by the number of reference words. We applied NFKC normalization, case folding, replacement of punctuation and symbols with spaces, and whitespace collapse, without number expansion. The control is a pinned local implementation of the original-style recognizer. These are not measurements of 500 requests to the production API. Confidence intervals use 2,000 paired speaker bootstrap draws.
Timing protocol
We measured batch-one inference on an NVIDIA A100-SXM4-40GB, from a preloaded waveform to decoded text, with CUDA synchronization. Timings exclude model loading, file decoding, network and HTTP. Prewarming is excluded where used. The profiles ran sequentially, so drift between passes affects the comparison. The short English recordings do not test streaming, long-form transcription or multilingual accuracy.
For the frozen-cache experiment, 69 development recordings prepared 32 encoder shapes. Each candidate replayed an encoder graph for 159 requests and used ordinary execution for 1,341. All 1,500 candidate requests used full decoder graphs, with no decoder fallback or reinitialization. The separate exact-shape benchmark repeated each of 20 FLEURS recordings ten times; its speedup should not be paired with WER from the Common Voice cohort.
Affect splits and metrics
The affect experiment used 19,672 training, 4,300 validation, 2,945 calibration and 7,381 historical test recordings. Recording IDs and reference groups were disjoint across splits. We considered 26 predeclared combinations before confirmation and did not reselect mixture weights or thresholds afterward.
Native macro F1 averages all 31 labels, assigning zero to labels with no support. The binary target is an annotation fraction of at least 0.5; each model uses its frozen native thresholds. Raw macro AP averages attributes with both observed classes. Fraction Brier score is squared error against annotation fractions, averaged over observed labels within a clip and then over clips. Its decrease indicates better agreement with those fractions. F1 intervals use 2,000 paired recording-group bootstrap draws.
Warm affect timings use prefixes of one recording, with ten warmups and 100 measured repetitions at each duration. They exclude file decoding, resampling, schema compilation, network, queues and JSON formatting. These prefix measurements do not establish a whole-corpus speedup: validation took 156.6 seconds for the BF16 candidate and 153.8 seconds for the same ensemble in FP32.
Download the measurements JSON · aggregate results, confidence intervals and experiment definitions
References
- TypeSafe: System One. Definitions of the choice, score and noul primitives.
- NVIDIA: Parakeet TDT 0.6B v2. Model card for the transcription backbone.
- Speed of Light Exact Greedy Decoding for RNN-T Speech Recognition Models on GPU. Prior work behind the runtime's greedy GPU decoding.
- On Calibration of Modern Neural Networks. Background on evaluating and calibrating predictive probabilities.