feat: whisper-cpp 1.8.5 + ggml-speech 2026-05-27 + tts-cpp/parakeet-cpp re-validation (QVAC-19236, QVAC-18992, QVAC-19071)#169
Merged
jpgaribotti merged 6 commits intoMay 27, 2026
Conversation
9 tasks
pratiknarola-t
previously approved these changes
May 27, 2026
freddy311082
previously approved these changes
May 27, 2026
4268c1d
ishanvohra2
previously approved these changes
May 27, 2026
Two ticket deliverables combined into one consistent port rewrite:
QVAC-18992 — Migrate to use ggml speech branch
----------------------------------------------
whisper-cpp now consumes the system-installed ggml provided by the
`ggml-speech` port (same shape as parakeet-cpp and tts-cpp), instead of
building the bundled `qvac-ext-lib-whisper.cpp/ggml/` subdirectory.
Driven by -DWHISPER_USE_SYSTEM_GGML=ON; whisper.cpp's top-level CMake
then calls `find_package(ggml CONFIG REQUIRED)` and aliases the
`ggml::ggml` target to its internal `ggml` target. The bundled ggml
source tree still exists in the upstream tarball but is no longer
walked at configure time.
All backend wiring is delegated to ggml-speech:
- GGML_METAL / GGML_VULKAN / GGML_OPENCL / GGML_CUDA
- GGML_BACKEND_DL=ON on Android (dynamic-backend mode)
- GGML_CPU_ALL_VARIANTS=ON / GGML_CPU_REPACK=ON on Android
(per-arch CPU MODULE .so files)
- GGML_VULKAN_DISABLE_COOPMAT[2]=ON on Android (Adreno NDK)
- spirv-headers `-isystem` shim for Vulkan
- Android NDK Vulkan-Headers download
- libqvac-speech-ggml-* output filename prefix
Side effects:
- The Vulkan-Headers download block is gone from this portfile;
ggml-speech handles it. android-vulkan-version.cmake deleted.
- The MSVC `/I` vs GCC/Clang `-isystem` spirv-headers shim is gone
from this portfile; ggml-speech handles it.
- The DL_BACKENDS install-tree fiddling is gone; the
libqvac-speech-ggml-*.so files are installed by ggml-speech into
${VCPKG_INSTALLED_DIR}/<triplet>/lib/, which the
transcription-whispercpp addon already picks up via
get_target_property(... LOCATION) on the ggml::<backend> imported
targets.
- whisper-cpp + parakeet-cpp + tts-cpp now share the same backend
binary set on every triplet (was: whisper-cpp brought a separate
libqvac-ggml-* set, parakeet/tts brought libqvac-speech-ggml-*).
Single source of truth.
QVAC-19236 — Expose backend selection as features
-------------------------------------------------
Add the `metal` feature (was unconditionally ON for macOS / OFF for
iOS in the portfile) so all 3 GPU backends are now declarative:
whisper-cpp[metal] -> ggml-speech[metal] (osx | ios)
whisper-cpp[vulkan] -> ggml-speech[vulkan] (linux | windows | android)
whisper-cpp[opencl] -> ggml-speech[opencl] (android)
Each whisper-cpp feature simply propagates into the matching
ggml-speech feature (with the platform guard kept). Consumers can
express the full GPU matrix declaratively in their own vcpkg.json
(the transcription-whispercpp addon does exactly this in a companion
PR — selecting [metal] for osx only, since iOS Metal still has a
separate XPC/MTLCompiler runtime crash being investigated; the iOS
binary stays on the CPU backend by simply not selecting [metal]).
Whisper-cpp REF
---------------
Bumped to v1.8.5 = 738d2e9e (tetherto/qvac-ext-lib-whisper.cpp@master),
which is the merge of tetherto#33 ("update to v1.8.5 and sync vendored
whisper.cpp + ggml to ggml-org upstream"). Pure upstream sync — no
tetherto-specific behavior change at the consumer level beyond the
ggml-source switch above.
Result
------
portfile.cmake: 150 -> ~55 lines (much closer to parakeet-cpp /
tts-cpp shape). Total diff: -174 / +56.
Version bump: 1.8.4.3#1 -> 1.8.5#0 (treating the version-string
change + the ggml-source switch as a fresh baseline rather than a
port-revision bump).
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Picks up tetherto/qvac-ext-ggml@speech HEAD c9126afc (merge commit of qvac-ext-ggml PR tetherto#13: "QVAC-18992: merge ggml-org @ 19eac6f0 (v0.10.2) into speech"). The merge brings in: c9126afc Merge pull request tetherto#13 from Zbig9000/QVAC-18992-merge-ggml-from-whisper-cpp e31785e4 fix(metal): restore lost 'typedef struct {' before ggml_metal_kargs_supertonic_depthwise_1d (caught by qvac CI Apple prebuild matrix via an overlay on tetherto/qvac#2270) d39c0d29 metal: stride-aware src indexing in kernel_pad_f32 / kernel_pad_reflect_1d_f32 (fixes Mac M2 PAD test failure) 166c4e12 Merge ggml-org @ 19eac6f0 into speech (sync to v0.10.2) PR tetherto#13 also brings in PR tetherto#11 (GustavoA1604 Android per-arch CPU dlopen fallback), which was already wired through port-version 4 via the GGML_CPU_ALL_VARIANTS=ON + GGML_CPU_REPACK=ON shape introduced in port-version 3 -- no port-side change needed for that. Build changes vs port-version 4: * Add patches/0001-ggml-vulkan-find-spirv-headers.patch wiring SPIRV-Headers into ggml-vulkan. The v0.10.2 sync added an unconditional #include <spirv/unified1/spirv.hpp> in src/ggml-vulkan/ggml-vulkan.cpp, but the upstream ggml-vulkan CMakeLists.txt never finds spirv-headers nor wires its include dir into the ggml-vulkan target. Patch finds the package and links it when available, gated on the "vulkan" feature. * Add spirv-headers as a dependency of the "vulkan" feature so the patched find_package(SPIRV-Headers QUIET) actually resolves to a vcpkg-installed package. Validated end-to-end through tetherto/qvac#2270's full CI matrix: - 9/9 prebuild triplets (linux-x64/arm64, win32-x64, darwin-arm64/x64, android-arm64, ios-arm64 + 2 simulators) - 107/107 C++ addon tests on linux-x64 - 5/5 platform integration test suites - iOS + Android E2E on AWS Device Farm Co-authored-by: Cursor <cursoragent@cursor.com>
ggml-speech bumped to 2026-05-27#0 in this PR will auto-apply via baseline
to every consumer port that has version>= on it. tts-cpp and parakeet-cpp
must declare they have been validated against the new ggml-speech to keep
the registry self-consistent.
tts-cpp: 2026-05-20 -> 2026-05-20#1
- version>=ggml-speech bumped to 2026-05-27 (was 2026-04-09#4)
parakeet-cpp: 2026-05-20#2 -> 2026-05-20#3
- version>=ggml-speech bumped to 2026-05-27 (was 2026-04-09#3)
Local validation (x64-linux, vulkan feature) against this registry tree:
- tts-ggml addon: vcpkg resolves clean, build links clean,
35 C++ unit tests pass, 61 JS unit tests pass
- transcription-parakeet addon: vcpkg resolves clean, build links clean,
32 C++ unit tests pass, 17 JS unit tests pass
Co-authored-by: Cursor <cursoragent@cursor.com>
b876a09 to
2af2434
Compare
The version>= constraint on ggml-speech was still 2026-04-09#4 (carried over from before the system-ggml migration). whisper-cpp@1.8.5 only works against the new ggml-speech@2026-05-27 (v0.10.2 vendored sources, new symbol set, spirv-headers Vulkan wiring), so the constraint must reflect that minimum. In practice the resolver always picked 2026-05-27 because that is the baseline value, so this is metadata-only and not a behavior change for either the addon CI run or the local file:// validation. It is the correct declaration so a future consumer with a stale baseline cannot combine whisper-cpp@1.8.5 with the old ggml-speech. Co-authored-by: Cursor <cursoragent@cursor.com>
Without a version>= constraint, the resolved spirv-headers version depends entirely on the consumer's microsoft/vcpkg baseline. Pin to 1.4.341.0 to match the convention already used by qvac-fabric (the other speech-stack port that depends on spirv-headers via vulkan), keep both ports resolvable from the same SPIRV-Headers version when they coexist in a consumer manifest, and ensure consumers with an older baseline still pick up a known-good SPIRV-Headers. Local validation on x64-linux: vcpkg upgrades spirv-headers from the addon's baseline 1.4.304.1 to the required 1.4.341.0 cleanly, the ggml-vulkan patch builds against the new headers, the full transcription-whispercpp addon builds + 107/107 cpp tests + 30/30 unit tests pass. Co-authored-by: Cursor <cursoragent@cursor.com>
Pulls in tetherto#173 (tts-cpp: enable BLAS only on macOS). That landed tts-cpp 2026-05-20#2 with a portfile refactor (vcpkg_check_features + platform-gated -DGGML_BLAS=OFF / -DCMAKE_DISABLE_FIND_PACKAGE_BLAS=ON). Conflict resolution: - ports/tts-cpp/vcpkg.json: kept tetherto#173's portfile changes, bumped port-version 2 -> 3, kept this PR's version>=ggml-speech constraint at 2026-05-27 (tetherto#173 still pinned the old 2026-04-09#4). - versions/t-/tts-cpp.json: kept tetherto#173's tetherto#2 entry git-tree (2b8233f), prepended a fresh tetherto#3 entry for the merged shape (git-tree 2980f3f). - versions/baseline.json: tts-cpp port-version 2 -> 3. ggml-speech, whisper-cpp and parakeet-cpp git-trees are untouched by the merge (c201f77, d18888f, 774279a respectively), as requested. Local validation on x64-linux (vulkan): tts-ggml addon resolves tts-cpp@2026-05-20#3 + ggml-speech@2026-05-27 + spirv-headers@1.4.341.0 from this registry tree, builds clean, 35/35 cpp tests + 61/61 unit tests pass. Co-authored-by: Cursor <cursoragent@cursor.com>
c9fc9e8 to
625fa1d
Compare
ishanvohra2
approved these changes
May 27, 2026
jpgaribotti
approved these changes
May 27, 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.
Summary
Four-port bump that pairs with the
transcription-whispercpp@0.9.0addon release on tetherto/qvac#2270.whisper-cpp1.8.4.3#11.8.5#0ggml-speechggml-speech2026-04-09#42026-05-27#0version>=1.4.341.0(matches qvac-fabric convention)tts-cpp2026-05-20#22026-05-20#3ggml-speech(on top of #173's BLAS-only-on-mac refactor)parakeet-cpp2026-05-26#02026-05-26#1ggml-speech(on top of #171 REF bump to9cf4571f)All four port bumps belong together: the new
whisper-cpp@1.8.5depends on the systemggml-speechport (no more bundled ggml),whisper-cpp@1.8.5's vendored sources are tightly coupled to the ggml-org v0.10.2 baseline shipped in the newggml-speech@2026-05-27, and the two sibling speech ports (tts-cpp,parakeet-cpp) get the new baseline ggml automatically — so they need a port-version bump declaring they have been re-validated against it (keeps the registry self-consistent and lets downstream consumers express "I want a tts-cpp/parakeet-cpp known to work against ggml-speech v0.10.2").This branch carries a merge of the latest
main(which includes #170, #171, #172 and #173) so thetts-cppandparakeet-cppbumps cleanly stack on Freddy's parakeet REF bump and Gianni's BLAS refactors. Theggml-speech/whisper-cpp/parakeet-cppgit-trees are unchanged by the merge — onlytts-cppwas rebumped (#2 → #3) to sit on top of #173.QVAC-18992 — Migrate
whisper-cppto consume theggml-speechsystem portwhisper-cppnow consumes the system-installed ggml provided by theggml-speechport (same shape asparakeet-cppandtts-cpp) instead of building the bundledqvac-ext-lib-whisper.cpp/ggml/subdirectory. Driven by-DWHISPER_USE_SYSTEM_GGML=ON; whisper.cpp's top-level CMake then callsfind_package(ggml CONFIG REQUIRED).All backend wiring is delegated to
ggml-speech:GGML_METAL/GGML_VULKAN/GGML_OPENCL/GGML_CUDAGGML_BACKEND_DL=ONon Android (dynamic-backend mode)GGML_CPU_ALL_VARIANTS=ON/GGML_CPU_REPACK=ONon Android (per-arch CPU MODULE.sofiles)GGML_VULKAN_DISABLE_COOPMAT[2]=ONon Android (Adreno NDK)-isystemshim for Vulkanlibqvac-speech-ggml-*output filename prefixThis removes ~95 lines from the
whisper-cppportfile and one whole companion file (android-vulkan-version.cmake).whisper-cpp+parakeet-cpp+tts-cppnow share the same backend binary set on every triplet (was: whisper brought a separatelibqvac-ggml-*set, parakeet/tts broughtlibqvac-speech-ggml-*).whisper-cpp'sversion>=ggml-speechconstraint is bumped to2026-05-27so consumers with a stale baseline cannot combinewhisper-cpp@1.8.5with the old ggml-speech.QVAC-19236 — Expose backend selection as features on
whisper-cppAdds the
metalfeature (was unconditionallyONfor macOS /OFFfor iOS in the portfile) so all 3 GPU backends are now declarative:Each
whisper-cppfeature simply propagates into the matchingggml-speechfeature (with the platform guard kept). Consumers can express the full GPU matrix declaratively in their ownvcpkg.json(thetranscription-whispercppaddon does exactly this in the companion PR — selecting[metal]forosxonly).QVAC-19071 —
ggml-speechbump to 2026-05-27#0 (qvac-ext-ggml PR #13 merged)Picks up
tetherto/qvac-ext-ggml@speechHEADc9126afc— the merge commit of qvac-ext-ggml PR #13 ("QVAC-18992: merge ggml-org @ 19eac6f0 (v0.10.2) into speech"):PR #13 also brings in PR #11 (GustavoA1604 Android per-arch CPU dlopen fallback), already wired through port-version 4 via the
GGML_CPU_ALL_VARIANTS=ON+GGML_CPU_REPACK=ONshape — no port-side change needed for that.Build-side changes vs port-version 4:
patches/0001-ggml-vulkan-find-spirv-headers.patchwiring SPIRV-Headers into ggml-vulkan. The v0.10.2 sync added an unconditional#include <spirv/unified1/spirv.hpp>insrc/ggml-vulkan/ggml-vulkan.cpp, but the upstream ggml-vulkan CMakeLists.txt never finds spirv-headers nor wires its include dir into the ggml-vulkan target. Patch does the find + link, gated on thevulkanfeature.spirv-headersadded as a dependency of thevulkanfeature, pinned toversion>=1.4.341.0(matches the existing convention inports/qvac-fabric/vcpkg.jsonso both speech-stack vulkan ports resolve from the same SPIRV-Headers version when they coexist in a consumer manifest).tts-cpp+parakeet-cppre-validation bumpsPure metadata bumps — no
portfile.cmakechange, no REF change, no patch change. Theggml-speechbaseline jump from2026-04-09#4to2026-05-27#0will automatically propagate into every consumer that hasversion>=ggml-speech(which bothtts-cppandparakeet-cppdo). Each port bump records that the combination "currenttts-cpp/parakeet-cppREF + newggml-speechv0.10.2 baseline" has been validated.tts-cppport-version: 2 → 3;version>=ggml-speechconstraint bumped2026-04-09#4 → 2026-05-27(sits on top of #173's BLAS-only-on-mac refactor at2026-05-20#2)parakeet-cppport-version: 0 → 1;version>=ggml-speechconstraint bumped2026-04-09#3 → 2026-05-27(sits on top of #171's REF bump to9cf4571f, which introduced version-date2026-05-26#0)Local validation on
linux-x64(vulkan feature) against this registry tree (the merged state — i.e. with #171's new parakeet REF, #172's initial BLAS-off, and #173's BLAS-only-on-mac refactor on top):tts-ggmladdon (consumestts-cpp):bare-make generateresolvesggml-speech[core,vulkan]@2026-05-27+tts-cpp[core,vulkan]@2026-05-20#3+spirv-headers@1.4.341.0from the registry tree, fetchesqvac-ext-ggml@c9126afc, builds clean (BLAS-off path honored on linux; macOS would now keep BLAS on, per tts-cpp: enable BLAS only on macOS #173).npm run test:cpp— 35/35 C++ unit tests pass.npm run test:unit— 61/61 JS unit tests pass.transcription-parakeetaddon (consumesparakeet-cpp):bare-make generateresolvesggml-speech[core,vulkan]@2026-05-27+parakeet-cpp[core,vulkan]@2026-05-26#1, fetchestetherto/qvac-ext-lib-whisper.cpp@9cf4571f(the new parakeet REF from fix: update parakeet-cpp to port version 3 and adjust dependencies #171), builds clean against the new ggml-speech.npm run test:cpp— 32/32 C++ unit tests pass.npm run test:unit— 17/17 JS unit tests pass.whisper-cppREFBumped to v1.8.5 =
738d2e9e(tetherto/qvac-ext-lib-whisper.cpp@master), which is the merge of whisper.cpp #33 ("update to v1.8.5 and sync vendored whisper.cpp + ggml to ggml-org upstream"). Pure upstream sync — no tetherto-specific behavior change at the consumer level beyond the ggml-source switch above.whisper-cppGNUInstallDirs bug-fix patchpatches/0001-move-gnuinstalldirs-before-add-subdirectory-src.patchfixes an install-tree bug in upstreamwhisper.cpp(present since at least 1.8.x, also inggml-org/whisper.cpp@master):src/CMakeLists.txtuses$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/whisper>to populate the imported target's include dirs, butinclude(GNUInstallDirs)runs afteradd_subdirectory(src). The variable is empty at the point the generator-expression is captured, sowhisper-targets.cmakeends up withINTERFACE_INCLUDE_DIRECTORIES "/whisper"and downstreamfind_package(whisper)consumers fail with:This never bit anything before because
WHISPER_USE_SYSTEM_GGML=OFFconsumers never exercise the install-tree branch. Now that this port flips to system-ggml mode, the bug surfaces immediately. The patch movesinclude(GNUInstallDirs)aboveadd_subdirectory(src). A follow-up will submit the same fix upstream totetherto/qvac-ext-lib-whisper.cppso we can drop the vcpkg-side patch on the next REF bump.Result
ports/whisper-cpp/portfile.cmakeports/whisper-cpp/vcpkg.jsonggml-speechdep added;version>=ggml-speech: 2026-05-27)ports/whisper-cpp/android-vulkan-version.cmakeports/whisper-cpp/patches/0001-…patchports/ggml-speech/portfile.cmakeports/ggml-speech/vcpkg.jsonversion>=1.4.341.0(+8, -2)ports/ggml-speech/patches/0001-ggml-vulkan-find-spirv-headers.patchports/tts-cpp/vcpkg.jsonport-version: 2 → 3+version>=ggml-speech: 2026-05-27(+2, -2)ports/parakeet-cpp/vcpkg.jsonport-version: 0 → 1+version>=ggml-speech: 2026-05-27(+2, -2)versions/baseline.jsonversions/w-/whisper-cpp.json1.8.5#0entry on topversions/g-/ggml-speech.json2026-05-27#0entry on topversions/t-/tts-cpp.json2026-05-20#3entry on topversions/p-/parakeet-cpp.json2026-05-26#1entry on topTest plan
Validated end-to-end on
linux-x64and the full qvac CI matrix via the companion qvac monorepo branch QVAC-19236-QVAC-18992-transcription-whispercpp-0.9.0:whisper-cpp+ggml-speechwork BEFORE registry merge) — qvac PR #2270 withvcpkg-overlays/{whisper-cpp,ggml-speech}/containing this PR's exact port contents (overlays kept in lock-step with the registry tree).file://simulation:bare-make generateon thetranscription-whispercppaddon resolveswhisper-cpp[core,vulkan]:x64-linux@1.8.5+ggml-speech[core,vulkan]:x64-linux@2026-05-27+spirv-headers@1.4.341.0from the registry tree, downloadstetherto/qvac-ext-ggml@c9126afc(the new ggml-speech REF), builds cleannpm run test:cpp— 107/107 passnpm run test:unit+test:integration+test:integration:accuracy+test:integration:chunking— all passtts-cppre-validation against newggml-speech(on top of tts-cpp: enable BLAS only on macOS #173 BLAS-only-on-mac) — localfile://simulation on thetts-ggmladdon: resolvestts-cpp[core,vulkan]@2026-05-20#3+ggml-speech[core,vulkan]@2026-05-27, builds clean.test:cpp35/35 pass,test:unit61/61 pass.parakeet-cppre-validation against newggml-speech(on top of fix: update parakeet-cpp to port version 3 and adjust dependencies #171 REF bump) — localfile://simulation on thetranscription-parakeetaddon: resolvesparakeet-cpp[core,vulkan]@2026-05-26#1+ggml-speech[core,vulkan]@2026-05-27, fetches new REF9cf4571f, builds clean.test:cpp32/32 pass,test:unit17/17 pass.The qvac PR will get a follow-up commit removing both overlays + bumping its
default-registry.baselineto this PR's merge SHA, then one more full CI run, then merge.Made with Cursor