Skip to content

ci: include earshot in release benchmarks - #58

Merged
wavekat-eason merged 1 commit into
mainfrom
ci/earshot-release-benchmarks
Aug 30, 2026
Merged

wavekat-eason merged 1 commit into
mainfrom
ci/earshot-release-benchmarks

Conversation

@wavekat-eason

Copy link
Copy Markdown
Contributor

Follow-up to #57.

The release PR's table has no Earshot row

There are four places that spell out the backend feature list. #57 updated three of them, but missed the one that actually matters for a release: the update-benchmarks job in release-plz.yml. That job checks out the release PR branch, runs the accuracy report, and pushes the regenerated table onto it — and it was still running with --features webrtc,silero,ten-vad,firered.

That is why #56 currently carries a table stamped v0.1.17 listing four backends, with Earshot absent from the release that introduces it.

Verified there are no other stragglers:

$ grep -rn "ten-vad,firered" --include="*.yml" --include=Makefile --include="*.rs" .
.github/workflows/release-plz.yml:97      <- this PR
.github/workflows/vad-accuracy.yml:32     <- has earshot
.github/workflows/ci.yml:53,88            <- has earshot
Makefile:54,59,63,68                      <- has earshot
crates/wavekat-vad/tests/accuracy.rs      <- has earshot

The manual accuracy workflow cannot open its PR

Dispatching VAD Accuracy on main measured everything correctly and updated the README in the workspace, then failed on the last step:

remote: Duplicate header: "Authorization"
fatal: unable to access 'https://github.com/wavekat/wavekat-vad/': The requested URL returned error: 400

actions/checkout leaves a persisted http.https://github.com/.extraheader credential behind, and create-pull-request adds its own — two Authorization headers, and the push is rejected. The checkout in that workflow no longer persists credentials, and the action moves from v6 to the current major (v8 is v7 plus a Node 24 runner requirement; nothing this workflow uses changed).

release-plz.yml's benchmark job pushes with plain git push, so it was never affected by this — which is why the table on the release branch updates while the manual workflow fails.

Measured numbers

From the run on ubuntu-latest, which matches the local measurement exactly on the deterministic metrics:

Backend Precision Recall F1 Frame Avg inference RTF
WebRTC 0.821 0.983 0.895 480 (30 ms) 2.9 µs 0.0001
Silero 0.938 0.938 0.938 512 (32 ms) 117.9 µs 0.0037
TEN-VAD 0.942 0.915 0.928 256 (16 ms) 51.0 µs 0.0032
FireRedVAD 0.950 0.879 0.913 160 (10 ms) 647.4 µs 0.0647
Earshot 0.909 0.949 0.928 256 (16 ms) 8.5 µs 0.0005

Once this lands, re-running Release-plz regenerates the table on #56 with the Earshot row, and v0.1.17 can go out.

🤖 Generated with Claude Code

https://claude.ai/code/session_012PF9YKsA6GfchGTPDAWYzL

The `update-benchmarks` job in release-plz.yml is what stamps the README
benchmark table onto the release PR, and its feature list still omitted
`earshot`. #57 updated the list in ci.yml and vad-accuracy.yml but missed
this one, so the v0.1.17 release PR carries a table with no Earshot row.

Also fixes the manual VAD Accuracy workflow, whose final step could not
open its PR: actions/checkout persists an Authorization header that
create-pull-request duplicates, and the push fails with HTTP 400. The
checkout no longer persists credentials, and the action is updated to
the current major.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012PF9YKsA6GfchGTPDAWYzL
@wavekat-eason
wavekat-eason merged commit a5ade85 into main Aug 30, 2026
11 checks passed
@wavekat-eason
wavekat-eason deleted the ci/earshot-release-benchmarks branch August 30, 2026 00:46
wavekat-eason added a commit that referenced this pull request Aug 30, 2026
Follow-up to #55 / #57 / #58.

## What was missing

#55 added Earshot to the backends table, the dependency snippet, and the
feature-flag table — but not to the part of the README where each
backend is actually explained. WebRTC, Silero, TEN-VAD and FireRedVAD
each have a `###` section with a description and a runnable example;
Earshot went straight from the FireRedVAD example to the trait docs.
Someone who enabled the feature had nowhere to look for how to construct
it.

The new section follows the same shape as the other four and calls out
the three things that differ from them:

- construction is infallible, so there is no `.unwrap()` on `new()`
- the frame size is exactly 256 samples, with a pointer to
`FrameAdapter` for 20 ms / 320-sample transports
- each detector holds ~8 KiB of streaming state, so one per stream, and
`reset()` between streams

## `FrameAdapter::process_each`

The adapter rework in #55 added `process_each` and made the allocation
behaviour of each method meaningful, but the README still listed only
the three older methods. Added it to the example, with a note on which
methods allocate and what `buffered_samples()` reports — this is the
method to reach for on a real-time path, and it was invisible.

## Acknowledgements

Added the earshot crate (MIT OR Apache-2.0, by pyke — the same authors
as `ort`, already credited).

## Notes

- Both new code examples were compiled and run against the crate. The
README is not wired into doctests, so CI would not have caught a mistake
in them.
- I did not repeat upstream's accuracy claim. Their README states
Earshot is more accurate than Silero VAD v6 and TEN VAD; on the TEN-VAD
testset this crate benchmarks against, our measurement puts it at F1
0.928 — level with TEN-VAD and below Silero's 0.938, with the speed
advantage intact. The benchmark table speaks for itself, so the section
sticks to characteristics rather than comparisons.
- The benchmark table itself is untouched. It is generated by the
`update-benchmarks` job and #56 already has the regenerated five-row
version, so hand-editing it here would only conflict.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

https://claude.ai/code/session_012PF9YKsA6GfchGTPDAWYzL

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant