refactor: land the whisper subtree + umbrella + divergence guard on master (QIP PRs 2+3)#102
Merged
Merged
Conversation
… QIP (PR 0) Nothing in this repo's CI built or tested our engines until now — real verification happened three repos downstream in tetherto/qvac. This adds path-filtered workflows that, per PR: - build qvac-ext-ggml@speech (CPU-only, cached by branch-tip SHA — the same fork the ggml-speech vcpkg port ships) - build each engine + all test harnesses against it as system ggml - run the non-GPU ctest lanes (`-LE 'gpu|perf'`); model-dependent tests auto-DISABLE to "Not Run" per the existing harness design Validated locally on macOS arm64: tts lane 68/68 pass, parakeet lane green (1 runnable test model-free; parity suites need staged GGUF fixtures — follow-up documented in the QIP). GPU lanes are stubbed behind workflow_dispatch until self-hosted GPU runners exist. docs/QIP-speech-repo-reorg.md is the reorg proposal this is "PR 0" of (symmetric engines/ layout, upstream vendored as a minimally-divergent git subtree under third_party/). The workflows land against today's paths; the reorg PRs only touch the path filters. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… QIP to #94 First run of the new tts CI lane caught a real cross-platform bug: test-campplus and test-campplus-backward-parity compile src/campplus.cpp (which calls tts_cpp::detail::init_cpu_backend()) without src/backend_selection.cpp, where that symbol lives. Apple's toolchain happened to optimize the reference away; GNU ld on Linux fails with an undefined reference — and Linux-with-tests was never built by any CI until now. Mirror the source list test-voice-embedding already uses. Also drop docs/QIP-speech-repo-reorg.md from this branch — the QIP now has its own approval PR (#94); this PR is CI + fixes only. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ads) On ubuntu the test binaries resolve libqvac-speech-ggml.so via their build RUNPATH, but RUNPATH is not consulted for that library's own transitive dependencies (libqvac-speech-ggml-cpu.so.0 et al), so 35 tts tests failed at exec with "cannot open shared object file". macOS is unaffected (@rpath resolution walks the executable's rpath stack for the whole load chain). Point LD_LIBRARY_PATH at the ggml install dir for the ctest step in both lanes. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…e engines engines-cross-ci.yml: engine x platform matrix complementing the linux/mac lanes — - windows-2022: MSVC, static system ggml, full build + non-GPU ctest - android: NDK arm64-v8a compile smoke (no device to run tests on) - ios: device arm64 compile smoke, Metal embedded (flags mirror build-xcframework.sh) iOS recipe validated locally (ggml + both engines compile clean against the iphoneos 26.2 SDK). On-device e2e remains downstream in tetherto/qvac; these lanes front-load cross-compile/link breaks ahead of the repo-reorg moves (QIP #94). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ts (rename-only) Pure `git mv` with zero content changes so Git records 100% renames and `git log --follow` / blame survive. Establishes the symmetric engines/ layout from the repo-reorg QIP (#94, PR 1); path fixups follow in the next commit. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Path-filter and source-dir fixups for the rename-only move in the previous commit. No workflow logic changes. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…amples in cross lanes The new Windows lane's first run caught 9 test files calling POSIX setenv/unsetenv, which MSVC's CRT doesn't provide — add test/test_env_portable.h (same-named _putenv_s shims on _MSC_VER, plain <cstdlib> elsewhere) and include it where used. Also -DPARAKEET_BUILD_EXAMPLES=OFF in the windows/android/ios lanes: the live-mic examples hand GCC-style warning flags to cl.exe and use mic-capture APIs that don't exist on the iOS device SDK; examples are dev conveniences, not part of the cross-platform surface. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
# Conflicts: # .github/workflows/engines-cross-ci.yml # engines/tts/test/test_env_portable.h
… root Everything upstream-owned at root (src/ include/ ggml/ examples/ bindings/ cmake/ CMakeLists.txt Makefile media/ models/ samples/ grammars/ tests/ ci/ scripts/ .devops/ .pi/ + upstream workflow files) goes away; the next commit re-vendors upstream v1.9.1 under third_party/whisper.cpp as a proper git subtree, and a follow-up re-applies the QVAC whisper delta there (QIP #94, PR 2). Kept at root: LICENSE, .gitignore, our workflows (.github/workflows/ {parakeet,tts,engines-cross}-ci.yml, check-approvals, security-baseline), .github/CODEOWNERS, engines/. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
test-gguf-stream and test-lavasr-enhancer-ggml consulted only TMPDIR with a hard "/tmp" fallback — Windows sets TEMP/TMP and has no /tmp, so both failed on the new Windows lane. Add test_tmpdir() to test_env_portable.h (TMPDIR -> TEMP -> TMP -> "/tmp") and use it. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
git-subtree-dir: third_party/whisper.cpp git-subtree-split: f049fff
… manifest
One auditable divergence commit on top of the pristine v1.9.1 subtree:
- src/whisper.cpp + src/whisper-logits-slice.h + include/whisper.h:
vocab-logits slice and decoder QKV matmul fusion (QVAC-21623)
- CMakeLists.txt / src/CMakeLists.txt / cmake/{git-vars,whisper-config}:
install-export and tarball-build fixes the vcpkg port relies on
The in-tree ggml delta is intentionally NOT re-applied: every ggml patch
(Android in-APK backend loading, Adreno Vulkan workarounds) was verified
present on qvac-ext-ggml@speech — the ggml-speech port source — which is
the single home for ggml changes from now on. third_party/whisper.cpp/ggml
stays byte-identical to upstream and is never compiled by our builds.
PATCHES.md is the manifest the divergence-guard CI (QIP PR 3) enforces.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…gate + UPSTREAM_PIN Umbrella integration surfaced three issues, all added to PATCHES.md: - WHISPER_BUILD_PARAKEET option (default ON = stock upstream): upstream ships its own C-API parakeet whose `parakeet`/`parakeet-cli` targets collide with engines/parakeet; the umbrella turns it off. Upstreaming candidate. - PROJECT_SOURCE_DIR (not CMAKE_SOURCE_DIR) in the whisper include export — CMAKE_SOURCE_DIR points at the umbrella root when built as a subdirectory, breaking '#include "whisper.h"'. - UPSTREAM_PIN: machine-readable upstream tag for the divergence-guard CI (QIP PR 3). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… build Both engines defined a ctest target literally named `test-streaming`, which collides when they configure into one superbuild. Rename to test-parakeet-streaming / test-tts-streaming (CMake target + ctest name + README references only; PROGRESS history docs untouched). No library or public target names change. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- CMakeLists.txt: feature-gated superbuild (SPEECH_BUILD_{WHISPER,
PARAKEET,TTS,TESTS,EXECUTABLES}); one find_package(ggml) shared by
every component via their common `if (NOT TARGET ggml)` guards.
whisper vars set with CACHE FORCE (its cmake_minimum_required(3.5)
leaves CMP0077 OLD, so option() would clobber plain set()s).
- whisper-ci.yml: umbrella build on linux+mac (all engines, one ggml,
full non-GPU ctest) + whisper-cli transcription smoke on jfk.wav with
a cached ggml-tiny.en — replaces the useful slice of upstream's
build.yml, which went inert when the upstream tree moved under
third_party/.
- README.md: repo layout, build quick-start, third_party ground rules.
Validated locally (macOS arm64): fresh umbrella configure+build clean,
69/69 non-GPU tests pass, whisper-cli smoke transcribes jfk.wav.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…patch
include(GNUInstallDirs) must precede add_subdirectory(src): the whisper
INSTALL_INTERFACE expands ${CMAKE_INSTALL_INCLUDEDIR}, and when unset it
exports a bogus "/whisper" include path that breaks install-tree
find_package(whisper) consumers (the exact failure the registry's
0001-move-gnuinstalldirs patch fixed). Carrying it in the subtree delta
lets the whisper-cpp port drop its patch when it re-pins onto the
reorged tree. Declared in PATCHES.md; upstreaming candidate.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- README.md: per QIP review, document every engine and supported model (whisper GGUFs; Parakeet CTC/TDT/EOU/Sortformer; Chatterbox Turbo/MTL, Supertonic, LavaSR), install + build, verified run commands for each CLI (flags checked against the engines' docs and the umbrella build outputs), and representative cross-platform perf tables sourced from the per-engine READMEs (linked for methodology/reproduction). - PATCHES.md: manifest rows no longer lean on ticket IDs — each row now states what the patch does and why on its own, per review feedback. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…env shim, GPU flags in gpu stubs - All ggml provisioning steps now fetch the exact SHA the cache key was derived from (git init + fetch --depth 1 <sha> + checkout FETCH_HEAD) instead of cloning the branch tip with a swallowed checkout — the tip advancing between ls-remote and clone could poison the cache with a commit the key never described. Applies to parakeet-ci, tts-ci and all three engines-cross-ci jobs. - test_env_portable.h: the MSVC setenv shim now honors overwrite=0 (existing variable left untouched, return 0) instead of silently diverging from POSIX. - GPU stub jobs: build ggml with -DGGML_VULKAN=ON (the backend the -L gpu suites target; Metal is default-on on Apple hosts) so a dispatch run can't falsely pass against a CPU-only ggml; flag set to be revisited when the runner fleet exists. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Restore the fork files the subtree conversion dropped (the delta capture missed upstream-owned paths beyond src/include/cmake): tests/test-whisper-logits-slice.cpp, tests/test-vad-streaming.cpp (+ tests/CMakeLists.txt wiring) and the Java-binding VAD params (WhisperFullParams.java, WhisperVadParams.java). All declared in PATCHES.md with self-contained rationale. - Deliberately NOT restored (documented in PATCHES.md): the fork's examples/talk-llama/llama-hparams hunk — it references nextn_predict_layers, which doesn't exist in v1.9.1's talk-llama snapshot, didn't compile, and was the actual cause of the ubuntu-22 matrix failures on every master push of the old upstream build.yml. - Run the restored tests: new SPEECH_BUILD_WHISPER_TESTS umbrella option; whisper-ci enables it and widens the ctest exclusion to whisper's model-labeled transcription tests (tiny/base/...). Gate upstream's parakeet tests behind WHISPER_BUILD_PARAKEET (they link the gated target). Local: full umbrella build clean, 73/73. - whisper-ci model fetch: curl -fL (fail on HTTP errors instead of writing the error page into the model), URL pinned to a fixed HF revision, sha256 verified (shasum -a 256: portable to macOS runners). - README perf tables: name the hardware — GPU rows are the qvac-ubuntu2204-x64-gpu runner's NVIDIA RTX 4000 SFF Ada (Vulkan), Mac rows Mac Studio M3 Ultra; CPU row identified as the same x86-64 host (its CPU model is not published in any doc we can cite). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ables The qvac-ubuntu2204-x64-gpu runner's CPU, read from its own job logs; completes the hardware naming requested in review. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
# Conflicts: # .github/workflows/engines-cross-ci.yml # .github/workflows/parakeet-ci.yml # .github/workflows/tts-ci.yml # engines/tts/test/parler/test_bpe_tokenizer.cpp # engines/tts/test/parler/test_dac.cpp # engines/tts/test/parler/test_decoder.cpp # engines/tts/test/parler/test_delay.cpp # engines/tts/test/parler/test_description.cpp # engines/tts/test/parler/test_e2e.cpp # engines/tts/test/parler/test_engine.cpp # engines/tts/test/parler/test_sched_equivalence.cpp # engines/tts/test/parler/test_t5.cpp # engines/tts/test/parler/test_text_norm.cpp # engines/tts/test/parler/test_tokenizer.cpp # engines/tts/test/test_env_portable.h
…hed test First lane run against master's Parler merge caught two issues: - 19 tts tests SIGILL'd on ubuntu: the lanes built ggml with the default GGML_NATIVE=ON (-march=native) and cached the install keyed only by ggml SHA + OS — hosted runner fleets mix CPU generations, so a cache built on an AVX-512 machine crashes on one without. Build ggml with GGML_NATIVE=OFF in every hosted lane (gpu stubs on self-hosted machines keep native) and bust the possibly-poisoned caches with a -portable key prefix. - test/parler/test_sched_equivalence.cpp (new in #92, never built on Windows) uses POSIX setenv/unsetenv — include the existing test_env_portable.h shim. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Review StatusCurrent Status: ❌ PENDING Pending reviews: Needs 1 Management or Team Lead, and 1 more from Management, Team Lead, or Member. |
mexxik
approved these changes
Jul 22, 2026
GustavoA1604
approved these changes
Jul 22, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Re-lands #96 and #97 onto master. Both were accidentally merged into their stacked base branches (#96 →
feat/engines-move, #97 →feat/whisper-subtree) instead of being retargeted tomasterafter #95 merged — so master currently has theengines/layout but not the vendor conversion. This PR is the combined, already-reviewed content:third_party/whisper.cpp(pinned v1.9.1, QVAC delta re-applied +PATCHES.mdmanifest +UPSTREAM_PIN)whisper-ci.yml(umbrella lanes + whisper-cli smoke; replaces upstream'sbuild.yml, which this PR removes from the active workflows — ending the pre-existing redubuntu-22-*/ggml-ci-mac-vulkannoise on every push)docs/UPSTREAM-SYNC.md+whisper-divergence-guard.ymlNo new content vs the approved #96/#97 — the merge with master's #95 squash resolved clean (identical changes on both sides).
Validation
Same evidence as #96/#97 (all lanes green there, umbrella 75/75 incl. Parler, downstream desktop+mobile e2e via qvac#3310); full CI matrix + divergence guard run again on this PR.
🤖 Generated with Claude Code