A version tag now builds, signs and ships bisque-voice on five platforms
2 hours ago
Pull request 2 adds one file that matters, a 640 line release workflow. Push a tag that starts with v, and GitHub builds bisque-voice for five platforms, tests every build, signs the macOS ones, and publishes the results. The pull request body says only, update bisque-voice. The reasoning sits in the comments inside the workflow, so that's what this walks through.
Ask about this presentation
Chapters
Show transcriptHide transcript
Pull request 2 adds one file that matters, a 640 line release workflow. Push a tag that starts with v, and GitHub builds bisque-voice for five platforms, tests every build, signs the macOS ones, and publishes the results. The pull request body says only, update bisque-voice. The reasoning sits in the comments inside the workflow, so that's what this walks through.
The workflow runs in stages. The packs job reads the published checksum of every model pack. Then the build job fans out across five runners, and each one builds, tests, smoke tests, signs and attests its binary. Finally the binaries go to download.bisque.today and to this repository's Releases. Every job runs on a GitHub hosted runner.
The packs job reads the published SHA-256 for ten model packs. That covers Kokoro, the Qwen3 clones and voices, the pronunciation data, and the aligners. Each checksum gets compiled into the binary, and a build with no checksum refuses to download that pack. So a pack has to be published before the release that pins it. If it isn't, the job stops with this message.
Four of the legs build the default feature set, Kokoro and the Qwen3 engines, on Mac Arm, Linux x86, Linux Arm and Windows. The Intel Mac leg is the exception. ONNX Runtime publishes no build for Intel macOS, so that binary carries the Qwen3 engines only, and reports Kokoro as unavailable with the reason. It also pins macOS 13 as the oldest version it must run on, because many surviving Intel Macs stop at Ventura.
First, the tag has to match the version in Cargo.toml. The published path is immutable, so a mismatch would ship a binary whose version names another release. Second, the tests run against the real packs, because the comments point out a skipped test never fails. Third, the smoke test starts the binary, runs doctor, and checks that every checksum was compiled in. It also checks that the number of installable engines equals the number pinned, so a forgotten checksum breaks the build, not someone's download.
The Intel binary can't run Kokoro, so it gets a stronger test. It downloads the published 0.6B clone pack, verifies its checksum, and synthesizes a sentence to an mp3. The step fails if the output reports no duration or the file is empty. The comment says it plainly: the engines list saying the right thing is not audio. The smoke test also confirms that installing Kokoro on this build refuses, and says why.
On the two Apple legs, the workflow imports the signing certificate into a temporary keychain, signs the binary with the Developer ID, then verifies the signature. Notarization follows, using credentials from repository secrets. The binary requests no entitlements, and the comment explains why. install.sh checks the same team ID, and this pull request fixes its comment to point at release.yml.
Every binary and every archive gets a build provenance attestation. So anyone can run gh attestation verify and confirm the download was built in this repository, from this commit, by this workflow. The secrets sit in a release environment that only v tags can use, and only repository admins can create those tags. Uploads authenticate with the workflow's own GitHub identity, so there's no stored cloud key to leak.
One limit to keep in mind. The release depends on the model packs being published first, and an unpublished pack stops the whole run. Publishing to the download site and to Releases is the part to read most closely. The other two changes are small. The README loses its joke about being written in Rust, and the install.sh comment now names release.yml. Pushing a version tag now ships bisque-voice.










