Skip to content

whisper-cpp: bump to 1.8.4.3 with Android OpenCL + dynamic backends + MSVC fix (QVAC-18300, QVAC-18993)#152

Merged
GustavoA1604 merged 4 commits into
tetherto:mainfrom
Zbig9000:QVAC-vcpkg-speech-stack-android-dynamic-backend
May 21, 2026
Merged

whisper-cpp: bump to 1.8.4.3 with Android OpenCL + dynamic backends + MSVC fix (QVAC-18300, QVAC-18993)#152
GustavoA1604 merged 4 commits into
tetherto:mainfrom
Zbig9000:QVAC-vcpkg-speech-stack-android-dynamic-backend

Conversation

@Zbig9000

@Zbig9000 Zbig9000 commented May 19, 2026

Copy link
Copy Markdown
Contributor

Summary

Day-5 afternoon update (2026-05-21, ~15:40 UTC+2). whisper-cpp PR #28 (QVAC-18993 bundled-ggml — Android dynamic backend) merged into tetherto/qvac-ext-lib-whisper.cpp/master (merge commit f3102199). New commit f287037 repoints the whisper-cpp port REF from the temporary Zbig9000/qvac-ext-lib-whisper.cpp@14620c8857 branch to tetherto/qvac-ext-lib-whisper.cpp@f3102199 and bumps to whisper-cpp 1.8.4.3#5. Source tarball is byte-identical to 1.8.4.3#4 outside parakeet-cpp/ and tts-cpp/ (separate vcpkg ports), so this is a REF-only port-version bump: no recipe change, no patch change, no build-output change. New HEAD f287037.

Day-5 morning (2026-05-21). Dropped the ggml-speech port bump (b4cf7b2) and the ggml-speech-side MSVC shim from this PR. The consumer-side migration to ggml-speech (QVAC-18992) stays open behind qvac-ext-ggml PR #13 and is no longer a prerequisite for the Android dynamic-backend rollout.

Three clean commits on top of tetherto/main:

  1. QVAC-18300 + 18993whisper-cpp to v1.8.4.3#3: enables the Android OpenCL feature (Adreno enable-path, COOPMAT[2] disabled), switches Android to full dynamic-backend mode (GGML_BACKEND_DL=ON, GGML_CPU_ALL_VARIANTS=ON, GGML_CPU_REPACK=ON), and adds the spirv-headers dependency under the vulkan feature. Ships patch-free.
  2. QVAC-18993 MSVC fixwhisper-cpp to 1.8.4.3#4: portfile now emits /I<path> on MSVC (and keeps -isystem <path> on GCC/Clang). Surfaced on qvac PR #2124 prebuild / win32-x64: cl.exe doesn't understand -isystem and was trying to compile the include directory path as a .cpp.
  3. QVAC-18993 + 19071 REF repointwhisper-cpp to 1.8.4.3#5: now that whisper-cpp PR QVAC-4959: Updated qvac-lint-cpp to v1.3.0 #28 (the source of the Android dynamic backend changes) is merged on tetherto/qvac-ext-lib-whisper.cpp/master, flips REPO + REF + SHA512 to point at the canonical upstream merge commit f3102199 instead of the temporary Zbig9000 branch. Drops the "TEMPORARY" comment block from the top of portfile.cmake. Source tarball byte-identical to 1.8.4.3#4 outside parakeet-cpp/ and tts-cpp/ (separate vcpkg ports).

Tasks

  • QVAC-18300 — Enable OpenCL on Whisper for Android.
  • QVAC-18993 — Enable Android dynamic backend build.
  • QVAC-19071 — [Whisper] Update qvac-registry-vcpkg and addon with new port versions (this PR = registry-side half; consumer-side half = qvac PR #2124).

What's NOT in this PR (intentionally)

Commit list (HEAD = f287037)

  1. 378b14f whisper-cpp: bump to 1.8.4.3 with Android OpenCL + dynamic-backend + spirv-headers (QVAC-18300, QVAC-18992, QVAC-18993) — REF + opencl feature + GGML flags + spirv-headers dependency + version 1.8.4.3#3 + baseline.
  2. 9f4e8e2 whisper-cpp: fix spirv-headers -isystem shim on MSVC (QVAC-18993) — switches to /I<path> on MSVC. whisper-cpp Updated port qvac-lib-inference-addon-cpp to v0.1.2 #3Updated port qvac-lib-inference-addon-cpp to v0.1.3 #4.
  3. f287037 whisper-cpp: bump to 1.8.4.3#5 — repoint to tetherto/master after PR #28 merge (QVAC-18993, QVAC-19071) — REPO Zbig9000tetherto, REF 14620c88f3102199, SHA512 recomputed, HEAD_REF QVAC-18993-bundled-ggml-android-dynamic-backendmaster. whisper-cpp Updated port qvac-lib-inference-addon-cpp to v0.1.3 #4Update port qvac-lib-inference-addon-cpp to v0.1.3 #5.

Validation

  • Local Linux x86_64: vcpkg install whisper-cpp[opencl,vulkan] builds clean against the new baseline.
  • NDK r29 Android cross-compile: all 7 per-arch libggml-cpu-android_armv*_*.so files produced clean.
  • OnePlus 7T Pro on-device (Adreno 640): dynamic backend loading works end-to-end — CPU init succeeds (per-arch armv8.2_1 selected by HWCAP), Vulkan & OpenCL backends register and report expected hardware-policy decisions.
  • Indirect consumer CI (via qvac PR #2124): all 7 prebuild platforms green incl. android-arm64 after the OpenCL fix and the Android ggml_backend_load_all_from_path() fix landed today. Awaiting next run for the post-fix mobile E2E.

Cross-repo PR set

Notes for reviewer

  • REF repoint completed in f287037 (2026-05-21 ~15:40 UTC+2): whisper-cpp port now pulls from tetherto/qvac-ext-lib-whisper.cpp@f3102199 (master HEAD after PR QVAC-4959: Updated qvac-lint-cpp to v1.3.0 #28 merge). The previous Zbig9000/qvac-ext-lib-whisper.cpp@14620c88 pin was a temporary work-around for the unmerged PR chain; it is gone now and the "TEMPORARY pinning" comment block is removed from portfile.cmake.
  • The patches/ directory is empty; the port is patch-free.
  • A future 1.8.4.3#6 (or 1.8.4.4) bump under QVAC-19071 will roll the REF forward when the tetherto fork publishes a tagged release or when QVAC-18992 (ggml-speech migration) lands.

@Zbig9000 Zbig9000 changed the title Qvac vcpkg speech stack android dynamic backend vcpkg: speech-stack + Android dynamic backends (QVAC-18300, 18992, 18993) May 19, 2026
Zbig9000 added a commit to Zbig9000/qvac-registry-vcpkg that referenced this pull request May 20, 2026
Bumps the whisper-cpp port to consume the QVAC-18991 upstream-sync
commit on the Zbig9000 fork (https://github.com/tetherto/qvac-ext-lib-
whisper.cpp/pull/25), so the transcription-whispercpp on-PR workflow
in qvac monorepo can run against the upstream-sync content in
isolation (no QVAC-18300 / 18992 / 18993 changes mixed in).

Single-purpose validation port:
  - REF: tetherto v1.8.4.2 -> Zbig9000 47784b9e (PR tetherto#25 HEAD)
  - SHA512 recomputed from the GitHub tarball
  - HEAD_REF -> QVAC-18991-pull-latest-whisper-cpp-upstream
  - version: 1.8.4.2#1 -> 1.8.4.3#0
  - No feature changes, no patches, no Android-side configuration
    changes -- the port is identical in shape to 1.8.4.2#1 except
    for the source version.

This PR is NOT meant to merge to main long-term; it exists to feed
a CI run on tetherto/qvac#TBD (QVAC-18991 validation bump of
transcription-whispercpp). After CI proves the upstream-sync source
is buildable + addon CI is green, this PR is closeable. Production
consumption of 1.8.4.3 will go through whisper-cpp PR tetherto#28 + tetherto#27 +
this port's regular tetherto#1, tetherto#2, ... port-version chain landing via
qvac-registry-vcpkg PR tetherto#152.

Refs QVAC-18991 (Asana).

Co-authored-by: Cursor <cursoragent@cursor.com>
Zbig9000 added a commit to Zbig9000/qvac-registry-vcpkg that referenced this pull request May 20, 2026
Bumps the whisper-cpp port to consume the QVAC-18991 upstream-sync
commit on the Zbig9000 fork (https://github.com/tetherto/qvac-ext-lib-
whisper.cpp/pull/25), so the transcription-whispercpp on-PR workflow
in qvac monorepo can run against the upstream-sync content in
isolation (no QVAC-18300 / 18992 / 18993 changes mixed in).

Single-purpose validation port:
  - REF: tetherto v1.8.4.2 -> Zbig9000 47784b9e (PR tetherto#25 HEAD)
  - SHA512 recomputed from the GitHub tarball
  - HEAD_REF -> QVAC-18991-pull-latest-whisper-cpp-upstream
  - version: 1.8.4.2#1 -> 1.8.4.3#0
  - No feature changes, no patches, no Android-side configuration
    changes -- the port is identical in shape to 1.8.4.2#1 except
    for the source version.

This PR is NOT meant to merge to main long-term; it exists to feed
a CI run on tetherto/qvac#TBD (QVAC-18991 validation bump of
transcription-whispercpp). After CI proves the upstream-sync source
is buildable + addon CI is green, this PR is closeable. Production
consumption of 1.8.4.3 will go through whisper-cpp PR tetherto#28 + tetherto#27 +
this port's regular tetherto#1, tetherto#2, ... port-version chain landing via
qvac-registry-vcpkg PR tetherto#152.

Refs QVAC-18991 (Asana).

Co-authored-by: Cursor <cursoragent@cursor.com>
@Zbig9000 Zbig9000 force-pushed the QVAC-vcpkg-speech-stack-android-dynamic-backend branch from 965f5e5 to dffaaf6 Compare May 20, 2026 11:51
@Zbig9000 Zbig9000 force-pushed the QVAC-vcpkg-speech-stack-android-dynamic-backend branch from dffaaf6 to 8c6ca18 Compare May 20, 2026 13:27
Zbig9000 and others added 2 commits May 21, 2026 09:08
…spirv-headers (QVAC-18300, QVAC-18992, QVAC-18993)

Brings the whisper-cpp port up to the upstream-sync snapshot at
v1.8.4.3 (QVAC-18991, merged into tetherto/qvac-ext-lib-whisper.cpp
master via PR tetherto#25) plus the Android speech-stack flags landed for
QVAC-18300 + QVAC-18992 + QVAC-18993:

  - opencl feature (QVAC-18300): Android-only enable-path,
    OpenCL/Vulkan side-by-side, COOPMAT[2] disabled to keep
    Adreno-class GPUs healthy.
  - Android dynamic-backend mode (QVAC-18993):
    GGML_BACKEND_DL=ON, GGML_CPU_ALL_VARIANTS=ON, GGML_CPU_REPACK=ON.
    Static dispatcher + per-microarch CPU .so + GPU .so files side
    by side, picked by ggml's HWCAP-aware loader at runtime.
  - spirv-headers dependency for the vulkan feature (QVAC-18992):
    the upstream ggml-org v0.10.2 sync pulled in ggml-vulkan.cpp code
    that uses spv::* enums unconditionally for SPIR-V capability
    injection (RTE rounding-mode); Vulkan-Headers no longer bundles
    spirv.hpp, so the standalone SPIRV-Headers tree must be on the
    include path. Inject via CMAKE_CXX_FLAGS=-isystem since
    ggml-vulkan's CMakeLists doesn't find_package(SpirvHeaders).

REF currently pins Zbig9000/qvac-ext-lib-whisper.cpp @ 14620c88
which is the tree-equivalent of merged PR tetherto#25 (upstream sync) +
merged PR tetherto#27 (tts-cpp <atomic>) + still-open PR tetherto#28 (bundled-ggml
Android dynamic-backend fixes). After PR tetherto#28 lands on tetherto/master
and a v1.8.4.x tag is published, flip REPO -> tetherto and the
tag/SHA (no other port changes needed).

The previous port-version 2's two patch files
(0001-ggml-allow-backend-dl-with-static-core.patch,
0002-ggml-android-cpu-variant-dlopen-fallback.patch) are now
upstream-equivalent commits on whisper.cpp PR tetherto#28 --- ports is
patch-free.

SHA512 = 733effd6... matches the github.com/Zbig9000/qvac-ext-lib-whisper.cpp/archive/14620c88....tar.gz tarball verified via independent download + sha512sum.

version       1.8.4.2 --> 1.8.4.3
port-version  1       --> 3 (continues after the previous port-version 2 patch-based recipe)

Co-authored-by: Cursor <cursoragent@cursor.com>
cl.exe does not understand the GCC/Clang `-isystem` flag --- it treats it
as a positional argument (a source file path), then tries to open the
following include directory path as a source file and dies with:

    c1xx: fatal error C1083: Cannot open source file:
    'C:/.../x64-windows/include': No such file or directory

Surfaced on tetherto/qvac/pull/2124 prebuild / win32-x64 against
whisper-cpp[vulkan].

The include shim now emits `/I<path>` on MSVC (and the legacy `/I` form,
no space, for maximal cl-flavour compatibility) and keeps `-isystem
<path>` on GCC/Clang.

Note: this PR previously also carried the ggml-speech port bump
(b4cf7b2) and the matching ggml-speech-side MSVC shim. Both have been
dropped because the consumer-side migration to ggml-speech
(QVAC-18992) is staying behind PR tetherto#13 / PR tetherto#28 for now; only the
whisper-cpp bits are required to land for the Android dynamic-backend
work on PR #2124.

Co-authored-by: Cursor <cursoragent@cursor.com>
@Zbig9000 Zbig9000 force-pushed the QVAC-vcpkg-speech-stack-android-dynamic-backend branch from 5cd209c to 9f4e8e2 Compare May 21, 2026 07:09
@Zbig9000 Zbig9000 changed the title vcpkg: speech-stack + Android dynamic backends (QVAC-18300, 18992, 18993) whisper-cpp: bump to 1.8.4.3 with Android OpenCL + dynamic backends + MSVC fix (QVAC-18300, QVAC-18993) May 21, 2026
…etherto#28 merge (QVAC-18993, QVAC-19071)

`tetherto/qvac-ext-lib-whisper.cpp` PR tetherto#28 merged today (2026-05-21,
merge commit `f3102199`), completing the Group-1/2 merge chain on
`tetherto/master`:

  - PR tetherto#25 (QVAC-18991) merged 2026-05-20 — upstream whisper.cpp sync
  - PR tetherto#27 (QVAC-18966) merged 2026-05-20 — tts-cpp chatterbox <atomic> fix
  - PR tetherto#28 (QVAC-18993) merged 2026-05-21 — ggml-backend Android dynamic
                                            backend + per-arch CPU dlopen fallback

So `tetherto/master` now carries every commit this port previously
pinned from `Zbig9000/qvac-ext-lib-whisper.cpp@14620c8857fc2893`.
Repoints the `vcpkg_from_github` call:

  REPO    Zbig9000/qvac-ext-lib-whisper.cpp  ->  tetherto/qvac-ext-lib-whisper.cpp
  REF     14620c8857fc289313a3b0a82c9ce69a   ->  f3102199642e78bb2beee6b9e9537604
  SHA512  733effd6f77de859bd9f1cf1b6dfe492…  ->  64b102677abae7825985c946b1103cda…
  HEAD_REF QVAC-18993-bundled-ggml-android-…  ->  master

`diff -rq` of the two source tarballs is empty outside `parakeet-cpp/`
and `tts-cpp/` (separate vcpkg ports — not consumed by this port).
The whisper-cpp source itself is byte-identical between `14620c88` and
`f3102199`, so this is a REF-only port-version bump: same recipe, same
features, same patches list (still empty), same build output.

Also drops the "TEMPORARY pinning to Zbig9000 fork" block from the top
of `portfile.cmake` --- no longer applicable now that the upstream PR
chain has landed.

Closes the registry-side half of [QVAC-19071](https://tetherapp.atlassian.net/browse/QVAC-19071)
("Update qvac-registry-vcpkg and addon with new port versions") for
this release cycle. Consumer-side half (re-pinning
`packages/transcription-whispercpp/vcpkg-configuration.json`) goes
into qvac PR #2124 in a follow-up commit.

[QVAC-18993][QVAC-19071]

Co-authored-by: Cursor <cursoragent@cursor.com>
Zbig9000 added a commit to Zbig9000/qvac that referenced this pull request May 21, 2026
…4.3#5 (REF flipped to tetherto/master)

[whisper-cpp PR tetherto#28](tetherto/qvac-ext-lib-whisper.cpp#28)
(QVAC-18993 bundled-ggml --- Android dynamic backend + per-arch CPU
dlopen fallback) was merged today (2026-05-21, merge commit
`f3102199` on `tetherto/qvac-ext-lib-whisper.cpp/master`). With it
merged, `tetherto/master` now carries every commit the registry's
`whisper-cpp` port previously pulled from the temporary
`Zbig9000/qvac-ext-lib-whisper.cpp@14620c8857` branch:

  - PR tetherto#25 (QVAC-18991, upstream whisper.cpp sync) --- merged 2026-05-20
  - PR tetherto#27 (QVAC-18966, tts-cpp chatterbox <atomic> fix) --- merged 2026-05-20
  - PR tetherto#28 (QVAC-18993, ggml-backend android dynamic backend) --- merged 2026-05-21

[qvac-registry-vcpkg PR tetherto#152](tetherto/qvac-registry-vcpkg#152)
HEAD (`f2870372`) bumps `whisper-cpp` to port-version `1.8.4.3#5`
with the REF repoint --- byte-identical source tarball outside
`parakeet-cpp/` and `tts-cpp/` (separate vcpkg ports). This commit
just re-pins the consumer-side baseline so the addon resolves
against the new port-version.

  vcpkg-configuration.json default-registry baseline:
    9f4e8e20072d8a7a1e118a49c36aacf6af6b3e0d   (MSVC fix only, whisper-cpp 1.8.4.3#4)
      -> f2870372965e899ae1f8a221154d2b243a6c3d30  (+ whisper-cpp 1.8.4.3#5 REF repoint)

No code change in this monorepo --- pure baseline re-pin. CHANGELOG
updated to record both the new baseline and the (now superseded)
intermediate `9f4e8e2` pin.

Closes the consumer-side half of [QVAC-19071](https://tetherapp.atlassian.net/browse/QVAC-19071)
("Update qvac-registry-vcpkg and addon with new port versions").
Registry-side half = vcpkg PR tetherto#152 commit `f287037`.

[QVAC-18993][QVAC-19071]

Co-authored-by: Cursor <cursoragent@cursor.com>
Comment thread ports/whisper-cpp/portfile.cmake Outdated
Comment thread ports/whisper-cpp/vcpkg.json Outdated
Comment thread versions/w-/whisper-cpp.json
…history, drop comment block)

Review comments from @GustavoA1604 on PR tetherto#152
(tetherto#152):

1. `ports/whisper-cpp/portfile.cmake`: "Dont add these comments"
   -> dropped the 19-line header that explained the REF history /
   tetherto vs Zbig9000 fork relation / future-bump notes.
2. `ports/whisper-cpp/vcpkg.json`: "Port version should start from 0,
   not 5" -> reset `port-version` 5 -> 0.
3. `versions/w-/whisper-cpp.json`: "Add only one entry here, version
   '1.8.4.3', port-version 0" -> collapsed the three historical
   `1.8.4.3` entries (port-versions 3, 4, 5 -- intermediate states
   that were never consumed off-fork) into a single entry at
   port-version 0 with the new git-tree
   `b4962d7acd7ce05fce118792a167e7aee36f1eba`. Older versions
   (1.8.4.2, 1.8.4.1, 1.7.x) untouched.

Also synced `versions/baseline.json` whisper-cpp port-version to 0.

REPO + REF + SHA512 (tetherto/qvac-ext-lib-whisper.cpp@f3102199, the
PR tetherto#28 merge commit) unchanged from the previous HEAD `f287037`.

[QVAC-18993][QVAC-19071]

Co-authored-by: Cursor <cursoragent@cursor.com>
Zbig9000 added a commit to Zbig9000/qvac that referenced this pull request May 21, 2026
…tetherto#152 review fixes)

@GustavoA1604 review on [qvac-registry-vcpkg PR tetherto#152](tetherto/qvac-registry-vcpkg#152)
requested three changes on the registry side:

  1. Drop the explanatory comment block at top of
     `ports/whisper-cpp/portfile.cmake`.
  2. Reset `port-version` 5 -> 0 (treat the tetherto REF repoint as
     a fresh start, not a continuation of the Zbig9000-branch series).
  3. Collapse the three historical `1.8.4.3` entries
     (`port-version` 3, 4, 5 -- never consumed off-fork) in
     `versions/w-/whisper-cpp.json` into a single `port-version: 0`
     entry with the new git-tree.

All three landed in PR tetherto#152 commit `ee71ecb`. This commit is the
consumer-side mirror:

  vcpkg-configuration.json default-registry baseline:
    f2870372965e899ae1f8a221154d2b243a6c3d30  (1.8.4.3#5, pre-review)
      -> ee71ecb5b286224377313e5a50558d11adbef3ac  (1.8.4.3#0, post-review)

  CHANGELOG entry updated:
    "1.8.4.3#5" -> "1.8.4.3#0" + note about port-version reset and
    history collapse + supersession line covers both prior pins
    (`9f4e8e2` MSVC fix, `f287037` 1.8.4.3#5).

No code change in this monorepo --- pure baseline re-pin. The
underlying whisper.cpp source bytes are unchanged (REPO + REF +
SHA512 in the portfile are identical between `1.8.4.3#5` and
`1.8.4.3#0`), so the produced binary is bit-for-bit equivalent.

[QVAC-18993][QVAC-19071]

Co-authored-by: Cursor <cursoragent@cursor.com>
@GustavoA1604 GustavoA1604 merged commit a9d7e92 into tetherto:main May 21, 2026
GustavoA1604 added a commit to tetherto/qvac that referenced this pull request May 22, 2026
…c GGML backends (#2124)

* transcription-whispercpp: bump to 0.7.1 with whisper-cpp 1.8.4.3#1 (QVAC-18993)

Pull in the consolidated vcpkg PR (whisper-cpp 1.8.4.3 #1 +
ggml-speech 2026-05-18 #1) that covers four asana tickets:

- QVAC-18991: whisper.cpp upstream-sync from ggml-org/master to
  v1.8.4.3.  Adds upstream's VAD streaming API
  (whisper_vad_detect_speech_no_reset, whisper_vad_reset_state)
  with a regression test, the macOS Vulkan persistent-pipeline
  cache, and various BCI / bindings fixes.
- QVAC-18300: enables OpenCL on Whisper for Android, gated
  behind a new `opencl` feature.  This package now declares an
  android-only `opencl` feature that wires through to the
  whisper-cpp port's opencl feature, so a transcription addon
  built for android-arm64 can ship the Adreno backend without
  forcing it on non-Adreno consumers.
- QVAC-18992: rebases the speech-stack ggml (qvac-ext-ggml@speech)
  onto the same upstream v0.10.2 baseline that whisper.cpp's
  bundled ggml uses, so the QVAC speech stack (whisper +
  parakeet + tts-cpp) consumes a coherent ggml API surface.
  No direct dependency from this package -- transitive via
  other speech-stack addons sharing the Android process.
- QVAC-18993: switches the Android build to pure
  dynamic-backend mode: GGML_BACKEND_DL=ON + GGML_CPU_ALL_VARIANTS=ON
  on both the whisper-cpp port and ggml-speech port, so the
  addon's .bare prebuild ships one libggml-cpu-android_armv*_*.so
  per microarchitecture plus dynamically-loaded
  libggml-vulkan.so / libggml-opencl.so.  ggml's loader picks
  the highest-feature CPU variant (armv9.2_2 .. armv8.0_1) plus
  the right GPU backend (Adreno 700+ -> OpenCL, everything else
  -> Vulkan) at runtime, so a single APK serves the whole device
  matrix without per-device builds.

vcpkg-configuration.json is TEMPORARILY pointed at
Zbig9000/qvac-registry-vcpkg.git @ b5a5e199 (= QVAC-vcpkg-speech-stack-android-dynamic-backend
HEAD on Zbig9000's fork) because the consolidated port versions
don't exist on tetherto/main yet.  Once the vcpkg PR lands the
default-registry block must be re-pointed back to
https://github.com/tetherto/qvac-registry-vcpkg.git with the
post-merge tetherto/main SHA as baseline.

Devicefarm: the asana asks for GPU testing on mobile to verify
S25 picks OpenCL and Pixel 9 picks Vulkan.  Those tests live
outside this addon (in qvac CI's integration-mobile-test
workflow) and depend on device-farm config that I can't validate
locally; the addon code side is unchanged in this bump (CPU
dispatcher + dynamic backend `.so` files are already wired by
the whisper-cpp port's prebuild output, and the JS layer
already enumerates ggml_backend_devs at init).

* transcription-whispercpp: bump to 0.7.2 with whisper-cpp 1.8.4.3#2 (QVAC-18993)

Picks up the Android per-arch CPU dlopen fallback patch added to the
whisper-cpp port (mirrors qvac-ext-ggml@speech 9562ed04). Without
this, every APK consumer with `useLegacyPackaging=false` (AGP 3.6+
default) would silently lose CPU init: the directory iterator finds
nothing inside compressed APK libs, and the existing on-disk filename
fallback never composes the per-arch `libggml-cpu-android_armv*_*.so`
names that `GGML_CPU_ALL_VARIANTS=ON` produces.

Re-pins the Zbig9000/qvac-registry-vcpkg default-registry baseline to
86257dc376ca043c67cc4805ab8d1e74a94b7eda so both whisper-cpp 1.8.4.3#2
and ggml-speech 2026-05-19#0 are reachable.

Co-authored-by: Cursor <cursoragent@cursor.com>

* transcription-whispercpp: bump to 0.7.3 → whisper-cpp 1.8.4.3#3 (QVAC-18993)

Pure follow-up to 0.7.2 -- the two Android dynamic-backend ggml fixes
the 0.7.2 release pulled in via vcpkg patches are now upstreamed as
commits on tetherto/qvac-ext-lib-whisper.cpp PR #26 ("ggml + tts-cpp
Android dynamic-backend overlays") instead of being carried in the
vcpkg port's patches/ tree. Plus a tts-cpp `<atomic>` include fix
that closes the parallel speech-stack consumer's build under the
day-2 ggml-speech merge.

Build output is bit-identical to 0.7.2 (whisper-cpp 1.8.4.3#3 SOURCE
== 1.8.4.3#2 SOURCE+PATCHES, verified by hashing all
libggml-cpu-android_armv*_*.so files from the NDK r29 cross-compile).

Registry baseline bumped to 965f5e5a so the new port-version
(1.8.4.3#3) is reachable.

PRs in the cross-repo set:
  whisper.cpp #26 (Zbig9000:QVAC-18993-bundled-ggml-android-dynamic-backend)
  vcpkg #152 (Zbig9000:QVAC-vcpkg-speech-stack-android-dynamic-backend)

Co-authored-by: Cursor <cursoragent@cursor.com>

* transcription-whispercpp: bridge ggml dlopen backends as IMPORTED targets (QVAC-18993)

`bare-make generate` failed on android-arm64 with

    CMake Error: get_target_property() called with non-existent target
    "ggml::ggml-cpu-android_armv8.0_1"  (… 8 backends total)

after enabling `GGML_BACKEND_DL=ON` on the `whisper-cpp` port. With dynamic-
backend mode, ggml builds the per-arch CPU + GPU backends as standalone MODULE
libraries that ggml dlopens at runtime; upstream ggml's `install(TARGETS … EXPORT)`
deliberately skips them, so the consumer's `BACKEND_DL_LIBS` loop in
`CMakeLists.txt` referenced targets that don't exist.

Wrap the existing loop with a `if(NOT TARGET ggml::${_backend})` fallback that
locates the `.so` under `${VCPKG_INSTALLED_PATH}/bin` via `find_library` and
materialises a `SHARED IMPORTED` target locally with `IMPORTED_NO_SONAME=TRUE`
— then bundle via the existing `INSTALL TARGET` path. Mirrors the pattern that
already ships in `packages/diffusion-cpp` for the same Android-dlopen
build mode.

Static backends (any platform that links ggml in directly) still find their
imported target via ggml-config.cmake on the first branch, so non-Android
prebuilds are byte-identical.

Co-authored-by: Cursor <cursoragent@cursor.com>

* transcription-whispercpp: re-pin baseline to vcpkg PR #152 rebased HEAD 8c6ca188 (QVAC-18993)

tetherto/qvac-registry-vcpkg/main moved forward yesterday with #156
(parakeet-cpp 2026-05-20 + ggml-speech 2026-04-09#2 bumps), so vcpkg
PR #152 was rebased onto the new base 0e75457. Update the default-
registry baseline pointer from the old PR #152 HEAD (dffaaf6) to the
rebased HEAD (8c6ca188) so the version-resolver still finds
`ggml-speech 2026-05-19#3` (now layered on top of the just-landed
2026-04-09#2) and `whisper-cpp 1.8.4.3#3` (unchanged content,
correct SHA512).

No other changes --- the resolver picks up the same final versions
of every package as before, just with the rebased baseline as the
search root.

Co-authored-by: Cursor <cursoragent@cursor.com>

* transcription-whispercpp: consume whisper-cpp 1.8.4.3#4 + ggml-speech 2026-05-19#4 (QVAC-18993, QVAC-18992)

Picks up the MSVC `/I` fix in the spirv-headers include-shim (vcpkg
PR #152 commit 5cd209c) so prebuild / win32-x64 stops dying with
`c1xx: fatal error C1083: Cannot open source file: '.../x64-windows/include'`
on the `whisper-cpp[vulkan]` configure step. The shim now emits the
MSVC-style `/I<path>` on Windows and keeps `-isystem <path>` (with
warning suppression) on GCC/Clang elsewhere.

whisper-cpp override bumped 1.8.4.3#3 -> 1.8.4.3#4.
Default-registry baseline bumped 8c6ca188 -> 5cd209c1.

Co-authored-by: Cursor <cursoragent@cursor.com>

* transcription-whispercpp: wire ENABLE_OPENCL so Android prebuilds ship libggml-opencl.so (QVAC-18300)

The `opencl` feature was declared in `packages/transcription-whispercpp/vcpkg.json`
(gated to `platform: android`) and the `whisper-cpp` port's `opencl` feature
correctly enables `-DGGML_OPENCL=ON` on Android — but the consumer's
`CMakeLists.txt` only appended `"tests"` and `"vulkan"` to
`VCPKG_MANIFEST_FEATURES`. The `opencl` feature was therefore never activated,
so vcpkg resolved `whisper-cpp` without `[opencl]`, ggml was built without
`GGML_OPENCL=ON`, and the `android-arm64` prebuild silently shipped CPU + Vulkan
backends only (no `libggml-opencl.so`) — defeating the entire point of
QVAC-18300.

Add an `ENABLE_OPENCL` option (default `ON` on Android, `OFF` elsewhere — the
`vcpkg.json` feature is `platform: android` gated so non-Android is a no-op
anyway) that appends `"opencl"` to `VCPKG_MANIFEST_FEATURES`. Mirrors the
`SD_OPENCL` pattern in `packages/diffusion-cpp/CMakeLists.txt` and keeps the
GPU-feature wiring uniform across the three GPU backends (Metal auto, Vulkan
toggle, OpenCL toggle).

After this commit, the `android-arm64` prebuild's
`qvac__transcription-whispercpp/` directory should ship `libggml-opencl.so`
alongside the existing 7 per-microarch CPU variants and `libggml-vulkan.so`.

Co-authored-by: Cursor <cursoragent@cursor.com>

* transcription-whispercpp: default ENABLE_OPENCL ON unconditionally (QVAC-18300)

Previous commit (6b42bc0) wired ENABLE_OPENCL but gated it on
`_qvac_whispercpp_target_os STREQUAL "Android"`, mirroring the existing
ENABLE_VULKAN block. CI re-run (26172345624) exposed that the gate is broken:
at top-level CMakeLists.txt time, `CMAKE_SYSTEM_NAME` is not yet set --- the
bare-make Android toolchain file is loaded by `project()` (which runs *after*
the option block), so `_qvac_whispercpp_target_os` falls through to the host
OS ("Linux") and ENABLE_OPENCL stayed OFF on the android-arm64 prebuild.

Evidence from run 26172345624's android-arm64 build log:
  `Installing 9/9 whisper-cpp[core,vulkan]:arm64-android@1.8.4.3#4...`
                                ^^^^^^^^ no `[opencl]`

ENABLE_VULKAN works only by coincidence: Vulkan is also default-ON on the
Linux host detection branch, so the wrong target detection produces the right
behaviour. For Android-only features there is no such overlap.

Fix: default ENABLE_OPENCL ON unconditionally and let the actual platform
gating happen where it can: (1) the `platform: android` clause on the
`whisper-cpp[opencl]` dep in `vcpkg.json`, and (2) the `VCPKG_TARGET_IS_ANDROID`
check in the `whisper-cpp` portfile that gates `-DGGML_OPENCL=ON`. Adding
`"opencl"` to `VCPKG_MANIFEST_FEATURES` on non-Android is a guaranteed no-op
because the feature's only dep is platform-gated --- mirrors the layered
gating that `whisper-cpp[vulkan]` already uses (the `vulkan` feature's deps
are `!osx & !ios` gated and the portfile's `-DGGML_VULKAN=ON` is also
target-gated).

After this commit, the android-arm64 install plan should resolve as
`whisper-cpp[core,vulkan,opencl]` and the prebuild tarball should contain
`libggml-opencl.so` alongside the 7 per-microarch CPU `.so`s and
`libggml-vulkan.so`.

Co-authored-by: Cursor <cursoragent@cursor.com>

* transcription-whispercpp: call ggml_backend_load_all_from_path before whisper_init (QVAC-18993)

Android mobile-test E2E crashed inside whisper_init_from_file_with_params
with SIGABRT on PR #2124 / run 26173084690 (both Pixel 9 Pro + Samsung S25
Ultra, 132 ms after Downloaded model: ggml-tiny.bin). Stack:

  abort → ggml_abort+228 → ggml_backend_dev_backend_reg+48
       → whisper_init_with_params_no_state+480
       → whisper_init_from_file_with_params_no_state+212
       → whisper_init_from_file_with_params+48
       → WhisperModel::load()+460

Root cause: the addon never called ggml_backend_load_all*(). With the
QVAC-18993 GGML_BACKEND_DL=ON build, the bundled ggml-base no longer
defines GGML_USE_CPU, so the static ggml_backend_registry ctor registers
zero backends. whisper.cpp's first ggml_backend_init_by_type(CPU) returns
NULL → ggml_backend_dev_backend_reg(NULL) trips GGML_ASSERT(device).

This is the same crash signature on both the pre-OpenCL run 26170576156
and the post-OpenCL run 26173084690, so it is independent of the recent
OpenCL enablement. The mobile workflow last passed on
tmp-whisper-184-3-validation back on 2026-05-11, which predates
GGML_BACKEND_DL=ON.

Mirror the pattern used by every other ggml-based addon in the monorepo
(packages/{diffusion-cpp,llm-llamacpp,classification-ggml,…}):

* CMakeLists.txt — emit BACKENDS_SUBDIR (<bare_target>/<module_name>)
  compile def via bare_target / bare_module_target.
* WhisperConfig — add backendsDir field (sibling of the handler-driven
  maps so it bypasses WHISPER_CONTEXT_HANDLERS.at()).
* JSAdapter — read top-level backendsDir string directly from
  configurationParams into config.backendsDir.
* WhisperModel::load — on __ANDROID__, std::call_once →
  ggml_backend_load_all_from_path(backendsDir/BACKENDS_SUBDIR) before
  whisper_init.
* index.js — require('bare-path'); pass
  backendsDir: path.join(__dirname, 'prebuilds') in _load + reload.

No diff on non-Android (Linux/macOS/Windows/iOS): ggml's static ctor
keeps registering CPU there as before.

aiDocs/15-android-mobile-test-crash-fix.md has the full investigation
(crash extraction, layered root-cause, why every other ggml addon
already does this, follow-ups).

Co-authored-by: Cursor <cursoragent@cursor.com>

* transcription-whispercpp: re-pin vcpkg baseline to cleaned PR #152 head (QVAC-18993)

PR #152 (qvac-registry-vcpkg) was rebased today to drop the ggml-speech
port bump (b4cf7b2) and the matching ggml-speech-side MSVC shim. Only
the whisper-cpp bump + whisper-cpp portfile MSVC `/I` fix remain. The
consumer-side migration to ggml-speech (QVAC-18992 / PR #13) stays open
on the speech branch but is no longer a prerequisite for this Android
dynamic-backend rollout.

New PR #152 HEAD: 9f4e8e20072d8a7a1e118a49c36aacf6af6b3e0d
Old (pre-cleanup): 5cd209c145a1d61636f1d44b4afe37868c298a8c

This addon does not depend on `ggml-speech` (it consumes the bundled
ggml inside `whisper-cpp`), so the dependency closure is unchanged.
Updated CHANGELOG to record the new baseline + the reason ggml-speech
got dropped.

Co-authored-by: Cursor <cursoragent@cursor.com>

* transcription-whispercpp: fix cpp-lint failures (clang-format + clang-tidy)

The prior CI run skipped cpp-lint entirely because the recent PR
commits only touched CMakeLists.txt / CHANGELOG.md. The new
ea298cf commit (QVAC-18993 mobile-test fix) added the first C++
diff in this branch, so cpp-lint now runs full clang-format
+ clang-tidy and surfaces three issues:

1. clang-format: JSAdapter.cpp had a one-line declaration broken
   across two lines (LLVM PointerAlignment=Left + AlignAfterOpen
   collapsed it). Reformatted in place.

2. clang-tidy [readability-identifier-naming]:
   WhisperHandlers.hpp:9 -- local `const int LANG_ID` violates the
   variable case style. Renamed to `langId` (lowerCamelCase, matches
   `checkLanguage` two lines above). Latent issue; never reported
   before because cpp-lint was a no-op on every prior PR commit.

3. clang-tidy [readability-identifier-naming]:
   WhisperModel.hpp:100 -- unused `set_weights_for_file(span, bool)`
   stub kept for parity with `transcription-parakeet` (which uses
   snake_case extensively for this exact API). Renaming would
   diverge from the parakeet pattern, so suppress with a single
   NOLINTNEXTLINE rather than touching the API surface.

Local repro: `cp packages/lint-cpp/.clang-format
packages/transcription-whispercpp/.clang-format` then
`git-clang-format --diff $(git merge-base HEAD origin/main) --
packages/transcription-whispercpp` reports `did not modify any
files`. The .clang-format copy is normally produced by
`packages/transcription-whispercpp/CMakeLists.txt:58
(configure_file COPYONLY)` during CMake configure.

[QVAC-18993][QVAC-19071]

Co-authored-by: Cursor <cursoragent@cursor.com>

* transcription-whispercpp: reference QVAC-19071 in CHANGELOG

QVAC-19071 ([Whisper] Update qvac-registry-vcpkg and addon with new
port versions) is the meta task that bundles the registry-side port
bump (qvac-registry-vcpkg PR #152: whisper-cpp 1.8.4.3#4) with the
consumer-side addon bump (qvac PR #2124: transcription-whispercpp
0.7.3, baseline re-pin). No code changes; the work itself was
already covered by PR #152 + this PR. Adds the cross-reference so
the Asana ticket can be closed off this release cycle.

The QVAC-18992 ggml-speech migration (PR #13 + ggml-speech port
bump) stays deferred per the 2026-05-21 plan; it will land as a
follow-up port bump under the same QVAC-19071 umbrella.

[QVAC-19071]

Co-authored-by: Cursor <cursoragent@cursor.com>

* transcription-whispercpp: re-pin baseline to consume whisper-cpp 1.8.4.3#5 (REF flipped to tetherto/master)

[whisper-cpp PR #28](tetherto/qvac-ext-lib-whisper.cpp#28)
(QVAC-18993 bundled-ggml --- Android dynamic backend + per-arch CPU
dlopen fallback) was merged today (2026-05-21, merge commit
`f3102199` on `tetherto/qvac-ext-lib-whisper.cpp/master`). With it
merged, `tetherto/master` now carries every commit the registry's
`whisper-cpp` port previously pulled from the temporary
`Zbig9000/qvac-ext-lib-whisper.cpp@14620c8857` branch:

  - PR #25 (QVAC-18991, upstream whisper.cpp sync) --- merged 2026-05-20
  - PR #27 (QVAC-18966, tts-cpp chatterbox <atomic> fix) --- merged 2026-05-20
  - PR #28 (QVAC-18993, ggml-backend android dynamic backend) --- merged 2026-05-21

[qvac-registry-vcpkg PR #152](tetherto/qvac-registry-vcpkg#152)
HEAD (`f2870372`) bumps `whisper-cpp` to port-version `1.8.4.3#5`
with the REF repoint --- byte-identical source tarball outside
`parakeet-cpp/` and `tts-cpp/` (separate vcpkg ports). This commit
just re-pins the consumer-side baseline so the addon resolves
against the new port-version.

  vcpkg-configuration.json default-registry baseline:
    9f4e8e20072d8a7a1e118a49c36aacf6af6b3e0d   (MSVC fix only, whisper-cpp 1.8.4.3#4)
      -> f2870372965e899ae1f8a221154d2b243a6c3d30  (+ whisper-cpp 1.8.4.3#5 REF repoint)

No code change in this monorepo --- pure baseline re-pin. CHANGELOG
updated to record both the new baseline and the (now superseded)
intermediate `9f4e8e2` pin.

Closes the consumer-side half of [QVAC-19071](https://tetherapp.atlassian.net/browse/QVAC-19071)
("Update qvac-registry-vcpkg and addon with new port versions").
Registry-side half = vcpkg PR #152 commit `f287037`.

[QVAC-18993][QVAC-19071]

Co-authored-by: Cursor <cursoragent@cursor.com>

* transcription-whispercpp: re-pin baseline to whisper-cpp 1.8.4.3#0 (PR #152 review fixes)

@GustavoA1604 review on [qvac-registry-vcpkg PR #152](tetherto/qvac-registry-vcpkg#152)
requested three changes on the registry side:

  1. Drop the explanatory comment block at top of
     `ports/whisper-cpp/portfile.cmake`.
  2. Reset `port-version` 5 -> 0 (treat the tetherto REF repoint as
     a fresh start, not a continuation of the Zbig9000-branch series).
  3. Collapse the three historical `1.8.4.3` entries
     (`port-version` 3, 4, 5 -- never consumed off-fork) in
     `versions/w-/whisper-cpp.json` into a single `port-version: 0`
     entry with the new git-tree.

All three landed in PR #152 commit `ee71ecb`. This commit is the
consumer-side mirror:

  vcpkg-configuration.json default-registry baseline:
    f2870372965e899ae1f8a221154d2b243a6c3d30  (1.8.4.3#5, pre-review)
      -> ee71ecb5b286224377313e5a50558d11adbef3ac  (1.8.4.3#0, post-review)

  CHANGELOG entry updated:
    "1.8.4.3#5" -> "1.8.4.3#0" + note about port-version reset and
    history collapse + supersession line covers both prior pins
    (`9f4e8e2` MSVC fix, `f287037` 1.8.4.3#5).

No code change in this monorepo --- pure baseline re-pin. The
underlying whisper.cpp source bytes are unchanged (REPO + REF +
SHA512 in the portfile are identical between `1.8.4.3#5` and
`1.8.4.3#0`), so the produced binary is bit-for-bit equivalent.

[QVAC-18993][QVAC-19071]

Co-authored-by: Cursor <cursoragent@cursor.com>

* transcription-whispercpp: 0.8.0 — address PR review

Collapses the 0.7.1/0.7.2/0.7.3 work into a single 0.8.0 release and
folds in Gustavo's PR #2124 review feedback:

- Bump version to 0.8.0; collapse CHANGELOG into a single 0.8.0 entry
- Bump whisper-cpp override to 1.8.4.3#0 (matches PR #152 collapse)
- Repoint default-registry to tetherto/qvac-registry-vcpkg @ a9d7e924
  (PR #152 merge commit on tetherto/main)
- vcpkg.json: model GPU features on transcription-parakeet's pattern —
  platform-gated whisper-cpp deps select [opencl,vulkan] on android,
  [vulkan] on linux/windows, and no GPU feature on apple. Drop the
  addon-side opencl/vulkan feature sections; CMake no longer carries
  ENABLE_OPENCL / ENABLE_VULKAN option indirection.
- index.js: nest backendsDir under whisperConfig (mirrors parakeet's
  parakeetConfig.backendsDir). Strip it from the wire-format whisperConfig
  map and surface it as top-level configurationParams.backendsDir before
  handing the config to the addon. Fix the stale _createAddon JSDoc that
  still described "LLM-specific settings".
- index.d.ts + README.md: document whisperConfig.backendsDir; drop the
  ENABLE_VULKAN build instructions (now controlled by vcpkg.json).
- Compact all the addon-side comments (CMakeLists.txt, JSAdapter.cpp,
  WhisperConfig.hpp, WhisperModel.cpp); drop every QVAC asana ticket
  reference; standardise the C++ log wording on
  "configurationParams.backendsDir".
- Drop "-D ENABLE_VULKAN=OFF" from the test:cpp:build / coverage:cpp:build
  npm scripts (no-op now that the option is gone).

Co-authored-by: Cursor <cursoragent@cursor.com>

* transcription-whispercpp: 0.9.0 -> 0.8.0 (fold into single release)

Reverts the 0.8.0 -> 0.9.0 bump from the merge commit: per request, this
PR's release notes are folded into the existing 0.8.0 entry rather than
shipping as a separate semver step. Order: Added -> Changed -> Fixed
(from this PR) -> Removed (the OutputCallbackJs revert that landed on
main as 0.8.0 via #2133).

package.json bumped back to 0.8.0.

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: GustavoA1604 <54457676+GustavoA1604@users.noreply.github.com>
Proletter pushed a commit to tetherto/qvac that referenced this pull request May 24, 2026
…c GGML backends (#2124)

* transcription-whispercpp: bump to 0.7.1 with whisper-cpp 1.8.4.3#1 (QVAC-18993)

Pull in the consolidated vcpkg PR (whisper-cpp 1.8.4.3 #1 +
ggml-speech 2026-05-18 #1) that covers four asana tickets:

- QVAC-18991: whisper.cpp upstream-sync from ggml-org/master to
  v1.8.4.3.  Adds upstream's VAD streaming API
  (whisper_vad_detect_speech_no_reset, whisper_vad_reset_state)
  with a regression test, the macOS Vulkan persistent-pipeline
  cache, and various BCI / bindings fixes.
- QVAC-18300: enables OpenCL on Whisper for Android, gated
  behind a new `opencl` feature.  This package now declares an
  android-only `opencl` feature that wires through to the
  whisper-cpp port's opencl feature, so a transcription addon
  built for android-arm64 can ship the Adreno backend without
  forcing it on non-Adreno consumers.
- QVAC-18992: rebases the speech-stack ggml (qvac-ext-ggml@speech)
  onto the same upstream v0.10.2 baseline that whisper.cpp's
  bundled ggml uses, so the QVAC speech stack (whisper +
  parakeet + tts-cpp) consumes a coherent ggml API surface.
  No direct dependency from this package -- transitive via
  other speech-stack addons sharing the Android process.
- QVAC-18993: switches the Android build to pure
  dynamic-backend mode: GGML_BACKEND_DL=ON + GGML_CPU_ALL_VARIANTS=ON
  on both the whisper-cpp port and ggml-speech port, so the
  addon's .bare prebuild ships one libggml-cpu-android_armv*_*.so
  per microarchitecture plus dynamically-loaded
  libggml-vulkan.so / libggml-opencl.so.  ggml's loader picks
  the highest-feature CPU variant (armv9.2_2 .. armv8.0_1) plus
  the right GPU backend (Adreno 700+ -> OpenCL, everything else
  -> Vulkan) at runtime, so a single APK serves the whole device
  matrix without per-device builds.

vcpkg-configuration.json is TEMPORARILY pointed at
Zbig9000/qvac-registry-vcpkg.git @ b5a5e199 (= QVAC-vcpkg-speech-stack-android-dynamic-backend
HEAD on Zbig9000's fork) because the consolidated port versions
don't exist on tetherto/main yet.  Once the vcpkg PR lands the
default-registry block must be re-pointed back to
https://github.com/tetherto/qvac-registry-vcpkg.git with the
post-merge tetherto/main SHA as baseline.

Devicefarm: the asana asks for GPU testing on mobile to verify
S25 picks OpenCL and Pixel 9 picks Vulkan.  Those tests live
outside this addon (in qvac CI's integration-mobile-test
workflow) and depend on device-farm config that I can't validate
locally; the addon code side is unchanged in this bump (CPU
dispatcher + dynamic backend `.so` files are already wired by
the whisper-cpp port's prebuild output, and the JS layer
already enumerates ggml_backend_devs at init).

* transcription-whispercpp: bump to 0.7.2 with whisper-cpp 1.8.4.3#2 (QVAC-18993)

Picks up the Android per-arch CPU dlopen fallback patch added to the
whisper-cpp port (mirrors qvac-ext-ggml@speech 9562ed04). Without
this, every APK consumer with `useLegacyPackaging=false` (AGP 3.6+
default) would silently lose CPU init: the directory iterator finds
nothing inside compressed APK libs, and the existing on-disk filename
fallback never composes the per-arch `libggml-cpu-android_armv*_*.so`
names that `GGML_CPU_ALL_VARIANTS=ON` produces.

Re-pins the Zbig9000/qvac-registry-vcpkg default-registry baseline to
86257dc376ca043c67cc4805ab8d1e74a94b7eda so both whisper-cpp 1.8.4.3#2
and ggml-speech 2026-05-19#0 are reachable.

Co-authored-by: Cursor <cursoragent@cursor.com>

* transcription-whispercpp: bump to 0.7.3 → whisper-cpp 1.8.4.3#3 (QVAC-18993)

Pure follow-up to 0.7.2 -- the two Android dynamic-backend ggml fixes
the 0.7.2 release pulled in via vcpkg patches are now upstreamed as
commits on tetherto/qvac-ext-lib-whisper.cpp PR #26 ("ggml + tts-cpp
Android dynamic-backend overlays") instead of being carried in the
vcpkg port's patches/ tree. Plus a tts-cpp `<atomic>` include fix
that closes the parallel speech-stack consumer's build under the
day-2 ggml-speech merge.

Build output is bit-identical to 0.7.2 (whisper-cpp 1.8.4.3#3 SOURCE
== 1.8.4.3#2 SOURCE+PATCHES, verified by hashing all
libggml-cpu-android_armv*_*.so files from the NDK r29 cross-compile).

Registry baseline bumped to 965f5e5a so the new port-version
(1.8.4.3#3) is reachable.

PRs in the cross-repo set:
  whisper.cpp #26 (Zbig9000:QVAC-18993-bundled-ggml-android-dynamic-backend)
  vcpkg #152 (Zbig9000:QVAC-vcpkg-speech-stack-android-dynamic-backend)

Co-authored-by: Cursor <cursoragent@cursor.com>

* transcription-whispercpp: bridge ggml dlopen backends as IMPORTED targets (QVAC-18993)

`bare-make generate` failed on android-arm64 with

    CMake Error: get_target_property() called with non-existent target
    "ggml::ggml-cpu-android_armv8.0_1"  (… 8 backends total)

after enabling `GGML_BACKEND_DL=ON` on the `whisper-cpp` port. With dynamic-
backend mode, ggml builds the per-arch CPU + GPU backends as standalone MODULE
libraries that ggml dlopens at runtime; upstream ggml's `install(TARGETS … EXPORT)`
deliberately skips them, so the consumer's `BACKEND_DL_LIBS` loop in
`CMakeLists.txt` referenced targets that don't exist.

Wrap the existing loop with a `if(NOT TARGET ggml::${_backend})` fallback that
locates the `.so` under `${VCPKG_INSTALLED_PATH}/bin` via `find_library` and
materialises a `SHARED IMPORTED` target locally with `IMPORTED_NO_SONAME=TRUE`
— then bundle via the existing `INSTALL TARGET` path. Mirrors the pattern that
already ships in `packages/diffusion-cpp` for the same Android-dlopen
build mode.

Static backends (any platform that links ggml in directly) still find their
imported target via ggml-config.cmake on the first branch, so non-Android
prebuilds are byte-identical.

Co-authored-by: Cursor <cursoragent@cursor.com>

* transcription-whispercpp: re-pin baseline to vcpkg PR #152 rebased HEAD 8c6ca188 (QVAC-18993)

tetherto/qvac-registry-vcpkg/main moved forward yesterday with #156
(parakeet-cpp 2026-05-20 + ggml-speech 2026-04-09#2 bumps), so vcpkg
PR #152 was rebased onto the new base 0e75457. Update the default-
registry baseline pointer from the old PR #152 HEAD (dffaaf6) to the
rebased HEAD (8c6ca188) so the version-resolver still finds
`ggml-speech 2026-05-19#3` (now layered on top of the just-landed
2026-04-09#2) and `whisper-cpp 1.8.4.3#3` (unchanged content,
correct SHA512).

No other changes --- the resolver picks up the same final versions
of every package as before, just with the rebased baseline as the
search root.

Co-authored-by: Cursor <cursoragent@cursor.com>

* transcription-whispercpp: consume whisper-cpp 1.8.4.3#4 + ggml-speech 2026-05-19#4 (QVAC-18993, QVAC-18992)

Picks up the MSVC `/I` fix in the spirv-headers include-shim (vcpkg
PR #152 commit 5cd209c) so prebuild / win32-x64 stops dying with
`c1xx: fatal error C1083: Cannot open source file: '.../x64-windows/include'`
on the `whisper-cpp[vulkan]` configure step. The shim now emits the
MSVC-style `/I<path>` on Windows and keeps `-isystem <path>` (with
warning suppression) on GCC/Clang elsewhere.

whisper-cpp override bumped 1.8.4.3#3 -> 1.8.4.3#4.
Default-registry baseline bumped 8c6ca188 -> 5cd209c1.

Co-authored-by: Cursor <cursoragent@cursor.com>

* transcription-whispercpp: wire ENABLE_OPENCL so Android prebuilds ship libggml-opencl.so (QVAC-18300)

The `opencl` feature was declared in `packages/transcription-whispercpp/vcpkg.json`
(gated to `platform: android`) and the `whisper-cpp` port's `opencl` feature
correctly enables `-DGGML_OPENCL=ON` on Android — but the consumer's
`CMakeLists.txt` only appended `"tests"` and `"vulkan"` to
`VCPKG_MANIFEST_FEATURES`. The `opencl` feature was therefore never activated,
so vcpkg resolved `whisper-cpp` without `[opencl]`, ggml was built without
`GGML_OPENCL=ON`, and the `android-arm64` prebuild silently shipped CPU + Vulkan
backends only (no `libggml-opencl.so`) — defeating the entire point of
QVAC-18300.

Add an `ENABLE_OPENCL` option (default `ON` on Android, `OFF` elsewhere — the
`vcpkg.json` feature is `platform: android` gated so non-Android is a no-op
anyway) that appends `"opencl"` to `VCPKG_MANIFEST_FEATURES`. Mirrors the
`SD_OPENCL` pattern in `packages/diffusion-cpp/CMakeLists.txt` and keeps the
GPU-feature wiring uniform across the three GPU backends (Metal auto, Vulkan
toggle, OpenCL toggle).

After this commit, the `android-arm64` prebuild's
`qvac__transcription-whispercpp/` directory should ship `libggml-opencl.so`
alongside the existing 7 per-microarch CPU variants and `libggml-vulkan.so`.

Co-authored-by: Cursor <cursoragent@cursor.com>

* transcription-whispercpp: default ENABLE_OPENCL ON unconditionally (QVAC-18300)

Previous commit (6b42bc0) wired ENABLE_OPENCL but gated it on
`_qvac_whispercpp_target_os STREQUAL "Android"`, mirroring the existing
ENABLE_VULKAN block. CI re-run (26172345624) exposed that the gate is broken:
at top-level CMakeLists.txt time, `CMAKE_SYSTEM_NAME` is not yet set --- the
bare-make Android toolchain file is loaded by `project()` (which runs *after*
the option block), so `_qvac_whispercpp_target_os` falls through to the host
OS ("Linux") and ENABLE_OPENCL stayed OFF on the android-arm64 prebuild.

Evidence from run 26172345624's android-arm64 build log:
  `Installing 9/9 whisper-cpp[core,vulkan]:arm64-android@1.8.4.3#4...`
                                ^^^^^^^^ no `[opencl]`

ENABLE_VULKAN works only by coincidence: Vulkan is also default-ON on the
Linux host detection branch, so the wrong target detection produces the right
behaviour. For Android-only features there is no such overlap.

Fix: default ENABLE_OPENCL ON unconditionally and let the actual platform
gating happen where it can: (1) the `platform: android` clause on the
`whisper-cpp[opencl]` dep in `vcpkg.json`, and (2) the `VCPKG_TARGET_IS_ANDROID`
check in the `whisper-cpp` portfile that gates `-DGGML_OPENCL=ON`. Adding
`"opencl"` to `VCPKG_MANIFEST_FEATURES` on non-Android is a guaranteed no-op
because the feature's only dep is platform-gated --- mirrors the layered
gating that `whisper-cpp[vulkan]` already uses (the `vulkan` feature's deps
are `!osx & !ios` gated and the portfile's `-DGGML_VULKAN=ON` is also
target-gated).

After this commit, the android-arm64 install plan should resolve as
`whisper-cpp[core,vulkan,opencl]` and the prebuild tarball should contain
`libggml-opencl.so` alongside the 7 per-microarch CPU `.so`s and
`libggml-vulkan.so`.

Co-authored-by: Cursor <cursoragent@cursor.com>

* transcription-whispercpp: call ggml_backend_load_all_from_path before whisper_init (QVAC-18993)

Android mobile-test E2E crashed inside whisper_init_from_file_with_params
with SIGABRT on PR #2124 / run 26173084690 (both Pixel 9 Pro + Samsung S25
Ultra, 132 ms after Downloaded model: ggml-tiny.bin). Stack:

  abort → ggml_abort+228 → ggml_backend_dev_backend_reg+48
       → whisper_init_with_params_no_state+480
       → whisper_init_from_file_with_params_no_state+212
       → whisper_init_from_file_with_params+48
       → WhisperModel::load()+460

Root cause: the addon never called ggml_backend_load_all*(). With the
QVAC-18993 GGML_BACKEND_DL=ON build, the bundled ggml-base no longer
defines GGML_USE_CPU, so the static ggml_backend_registry ctor registers
zero backends. whisper.cpp's first ggml_backend_init_by_type(CPU) returns
NULL → ggml_backend_dev_backend_reg(NULL) trips GGML_ASSERT(device).

This is the same crash signature on both the pre-OpenCL run 26170576156
and the post-OpenCL run 26173084690, so it is independent of the recent
OpenCL enablement. The mobile workflow last passed on
tmp-whisper-184-3-validation back on 2026-05-11, which predates
GGML_BACKEND_DL=ON.

Mirror the pattern used by every other ggml-based addon in the monorepo
(packages/{diffusion-cpp,llm-llamacpp,classification-ggml,…}):

* CMakeLists.txt — emit BACKENDS_SUBDIR (<bare_target>/<module_name>)
  compile def via bare_target / bare_module_target.
* WhisperConfig — add backendsDir field (sibling of the handler-driven
  maps so it bypasses WHISPER_CONTEXT_HANDLERS.at()).
* JSAdapter — read top-level backendsDir string directly from
  configurationParams into config.backendsDir.
* WhisperModel::load — on __ANDROID__, std::call_once →
  ggml_backend_load_all_from_path(backendsDir/BACKENDS_SUBDIR) before
  whisper_init.
* index.js — require('bare-path'); pass
  backendsDir: path.join(__dirname, 'prebuilds') in _load + reload.

No diff on non-Android (Linux/macOS/Windows/iOS): ggml's static ctor
keeps registering CPU there as before.

aiDocs/15-android-mobile-test-crash-fix.md has the full investigation
(crash extraction, layered root-cause, why every other ggml addon
already does this, follow-ups).

Co-authored-by: Cursor <cursoragent@cursor.com>

* transcription-whispercpp: re-pin vcpkg baseline to cleaned PR #152 head (QVAC-18993)

PR #152 (qvac-registry-vcpkg) was rebased today to drop the ggml-speech
port bump (b4cf7b2) and the matching ggml-speech-side MSVC shim. Only
the whisper-cpp bump + whisper-cpp portfile MSVC `/I` fix remain. The
consumer-side migration to ggml-speech (QVAC-18992 / PR #13) stays open
on the speech branch but is no longer a prerequisite for this Android
dynamic-backend rollout.

New PR #152 HEAD: 9f4e8e20072d8a7a1e118a49c36aacf6af6b3e0d
Old (pre-cleanup): 5cd209c145a1d61636f1d44b4afe37868c298a8c

This addon does not depend on `ggml-speech` (it consumes the bundled
ggml inside `whisper-cpp`), so the dependency closure is unchanged.
Updated CHANGELOG to record the new baseline + the reason ggml-speech
got dropped.

Co-authored-by: Cursor <cursoragent@cursor.com>

* transcription-whispercpp: fix cpp-lint failures (clang-format + clang-tidy)

The prior CI run skipped cpp-lint entirely because the recent PR
commits only touched CMakeLists.txt / CHANGELOG.md. The new
ea298cf commit (QVAC-18993 mobile-test fix) added the first C++
diff in this branch, so cpp-lint now runs full clang-format
+ clang-tidy and surfaces three issues:

1. clang-format: JSAdapter.cpp had a one-line declaration broken
   across two lines (LLVM PointerAlignment=Left + AlignAfterOpen
   collapsed it). Reformatted in place.

2. clang-tidy [readability-identifier-naming]:
   WhisperHandlers.hpp:9 -- local `const int LANG_ID` violates the
   variable case style. Renamed to `langId` (lowerCamelCase, matches
   `checkLanguage` two lines above). Latent issue; never reported
   before because cpp-lint was a no-op on every prior PR commit.

3. clang-tidy [readability-identifier-naming]:
   WhisperModel.hpp:100 -- unused `set_weights_for_file(span, bool)`
   stub kept for parity with `transcription-parakeet` (which uses
   snake_case extensively for this exact API). Renaming would
   diverge from the parakeet pattern, so suppress with a single
   NOLINTNEXTLINE rather than touching the API surface.

Local repro: `cp packages/lint-cpp/.clang-format
packages/transcription-whispercpp/.clang-format` then
`git-clang-format --diff $(git merge-base HEAD origin/main) --
packages/transcription-whispercpp` reports `did not modify any
files`. The .clang-format copy is normally produced by
`packages/transcription-whispercpp/CMakeLists.txt:58
(configure_file COPYONLY)` during CMake configure.

[QVAC-18993][QVAC-19071]

Co-authored-by: Cursor <cursoragent@cursor.com>

* transcription-whispercpp: reference QVAC-19071 in CHANGELOG

QVAC-19071 ([Whisper] Update qvac-registry-vcpkg and addon with new
port versions) is the meta task that bundles the registry-side port
bump (qvac-registry-vcpkg PR #152: whisper-cpp 1.8.4.3#4) with the
consumer-side addon bump (qvac PR #2124: transcription-whispercpp
0.7.3, baseline re-pin). No code changes; the work itself was
already covered by PR #152 + this PR. Adds the cross-reference so
the Asana ticket can be closed off this release cycle.

The QVAC-18992 ggml-speech migration (PR #13 + ggml-speech port
bump) stays deferred per the 2026-05-21 plan; it will land as a
follow-up port bump under the same QVAC-19071 umbrella.

[QVAC-19071]

Co-authored-by: Cursor <cursoragent@cursor.com>

* transcription-whispercpp: re-pin baseline to consume whisper-cpp 1.8.4.3#5 (REF flipped to tetherto/master)

[whisper-cpp PR #28](tetherto/qvac-ext-lib-whisper.cpp#28)
(QVAC-18993 bundled-ggml --- Android dynamic backend + per-arch CPU
dlopen fallback) was merged today (2026-05-21, merge commit
`f3102199` on `tetherto/qvac-ext-lib-whisper.cpp/master`). With it
merged, `tetherto/master` now carries every commit the registry's
`whisper-cpp` port previously pulled from the temporary
`Zbig9000/qvac-ext-lib-whisper.cpp@14620c8857` branch:

  - PR #25 (QVAC-18991, upstream whisper.cpp sync) --- merged 2026-05-20
  - PR #27 (QVAC-18966, tts-cpp chatterbox <atomic> fix) --- merged 2026-05-20
  - PR #28 (QVAC-18993, ggml-backend android dynamic backend) --- merged 2026-05-21

[qvac-registry-vcpkg PR #152](tetherto/qvac-registry-vcpkg#152)
HEAD (`f2870372`) bumps `whisper-cpp` to port-version `1.8.4.3#5`
with the REF repoint --- byte-identical source tarball outside
`parakeet-cpp/` and `tts-cpp/` (separate vcpkg ports). This commit
just re-pins the consumer-side baseline so the addon resolves
against the new port-version.

  vcpkg-configuration.json default-registry baseline:
    9f4e8e20072d8a7a1e118a49c36aacf6af6b3e0d   (MSVC fix only, whisper-cpp 1.8.4.3#4)
      -> f2870372965e899ae1f8a221154d2b243a6c3d30  (+ whisper-cpp 1.8.4.3#5 REF repoint)

No code change in this monorepo --- pure baseline re-pin. CHANGELOG
updated to record both the new baseline and the (now superseded)
intermediate `9f4e8e2` pin.

Closes the consumer-side half of [QVAC-19071](https://tetherapp.atlassian.net/browse/QVAC-19071)
("Update qvac-registry-vcpkg and addon with new port versions").
Registry-side half = vcpkg PR #152 commit `f287037`.

[QVAC-18993][QVAC-19071]

Co-authored-by: Cursor <cursoragent@cursor.com>

* transcription-whispercpp: re-pin baseline to whisper-cpp 1.8.4.3#0 (PR #152 review fixes)

@GustavoA1604 review on [qvac-registry-vcpkg PR #152](tetherto/qvac-registry-vcpkg#152)
requested three changes on the registry side:

  1. Drop the explanatory comment block at top of
     `ports/whisper-cpp/portfile.cmake`.
  2. Reset `port-version` 5 -> 0 (treat the tetherto REF repoint as
     a fresh start, not a continuation of the Zbig9000-branch series).
  3. Collapse the three historical `1.8.4.3` entries
     (`port-version` 3, 4, 5 -- never consumed off-fork) in
     `versions/w-/whisper-cpp.json` into a single `port-version: 0`
     entry with the new git-tree.

All three landed in PR #152 commit `ee71ecb`. This commit is the
consumer-side mirror:

  vcpkg-configuration.json default-registry baseline:
    f2870372965e899ae1f8a221154d2b243a6c3d30  (1.8.4.3#5, pre-review)
      -> ee71ecb5b286224377313e5a50558d11adbef3ac  (1.8.4.3#0, post-review)

  CHANGELOG entry updated:
    "1.8.4.3#5" -> "1.8.4.3#0" + note about port-version reset and
    history collapse + supersession line covers both prior pins
    (`9f4e8e2` MSVC fix, `f287037` 1.8.4.3#5).

No code change in this monorepo --- pure baseline re-pin. The
underlying whisper.cpp source bytes are unchanged (REPO + REF +
SHA512 in the portfile are identical between `1.8.4.3#5` and
`1.8.4.3#0`), so the produced binary is bit-for-bit equivalent.

[QVAC-18993][QVAC-19071]

Co-authored-by: Cursor <cursoragent@cursor.com>

* transcription-whispercpp: 0.8.0 — address PR review

Collapses the 0.7.1/0.7.2/0.7.3 work into a single 0.8.0 release and
folds in Gustavo's PR #2124 review feedback:

- Bump version to 0.8.0; collapse CHANGELOG into a single 0.8.0 entry
- Bump whisper-cpp override to 1.8.4.3#0 (matches PR #152 collapse)
- Repoint default-registry to tetherto/qvac-registry-vcpkg @ a9d7e924
  (PR #152 merge commit on tetherto/main)
- vcpkg.json: model GPU features on transcription-parakeet's pattern —
  platform-gated whisper-cpp deps select [opencl,vulkan] on android,
  [vulkan] on linux/windows, and no GPU feature on apple. Drop the
  addon-side opencl/vulkan feature sections; CMake no longer carries
  ENABLE_OPENCL / ENABLE_VULKAN option indirection.
- index.js: nest backendsDir under whisperConfig (mirrors parakeet's
  parakeetConfig.backendsDir). Strip it from the wire-format whisperConfig
  map and surface it as top-level configurationParams.backendsDir before
  handing the config to the addon. Fix the stale _createAddon JSDoc that
  still described "LLM-specific settings".
- index.d.ts + README.md: document whisperConfig.backendsDir; drop the
  ENABLE_VULKAN build instructions (now controlled by vcpkg.json).
- Compact all the addon-side comments (CMakeLists.txt, JSAdapter.cpp,
  WhisperConfig.hpp, WhisperModel.cpp); drop every QVAC asana ticket
  reference; standardise the C++ log wording on
  "configurationParams.backendsDir".
- Drop "-D ENABLE_VULKAN=OFF" from the test:cpp:build / coverage:cpp:build
  npm scripts (no-op now that the option is gone).

Co-authored-by: Cursor <cursoragent@cursor.com>

* transcription-whispercpp: 0.9.0 -> 0.8.0 (fold into single release)

Reverts the 0.8.0 -> 0.9.0 bump from the merge commit: per request, this
PR's release notes are folded into the existing 0.8.0 entry rather than
shipping as a separate semver step. Order: Added -> Changed -> Fixed
(from this PR) -> Removed (the OutputCallbackJs revert that landed on
main as 0.8.0 via #2133).

package.json bumped back to 0.8.0.

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: GustavoA1604 <54457676+GustavoA1604@users.noreply.github.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.

2 participants