Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions packages/bci-whispercpp/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed

- Faster desktop neural-signal preprocessing on the GPU (Vulkan) and CPU paths. Public API and transcription output are unchanged.
- Desktop linux-arm64 prebuilds now ship per-arch ggml CPU variants (`whisper-cpp` override 1.9.1#3, pulling `ggml-speech` 2026-07-14): the previous armv8-a-baseline build compiled out the ARM dotprod/fp16 kernels. The addon now loads the dynamically-loadable ggml backends on linux-arm64 (previously Android-only).

## [0.5.0] - 2026-07-14

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,10 @@ static bool shouldAbortWhisper(void* userData) {
cancelRequested->load(std::memory_order_relaxed);
}

#if defined(__ANDROID__)
#if defined(__ANDROID__) || (defined(__linux__) && defined(__aarch64__))
namespace {
// Android ships ggml with `GGML_BACKEND_DL=ON`, so no backend is
// Android -- and, since ggml-speech 2026-07-14, desktop linux-arm64
// prebuilds too -- ship ggml with `GGML_BACKEND_DL=ON`, so no backend is
// statically registered. dlopen the per-arch CPU + GPU `.so` modules
// once per process; otherwise whisper_init aborts on a NULL CPU
// device. Mirrors transcription-whispercpp / llm-llamacpp /
Expand All @@ -50,13 +51,13 @@ namespace {
// `GGML_BACKEND_DL=ON` flag; from that point on this function is
// the only thing standing between us and the SIGABRT we already
// hit on transcription's PR #2124.
void ensureBackendsLoadedAndroid(const std::string& backendsDir) {
void ensureBackendsLoaded(const std::string& backendsDir) {
static std::once_flag flag;
std::call_once(flag, [&]() {
if (backendsDir.empty()) {
QLOG(
qvac_lib_inference_addon_cpp::logger::Priority::WARNING,
"Android: configurationParams.backendsDir not set; falling back to "
"configurationParams.backendsDir not set; falling back to "
"ggml_backend_load_all() (default search path). CPU / Vulkan / "
"OpenCL registration may fail inside an APK with default "
"compressed-native-libs packaging.");
Expand All @@ -73,13 +74,13 @@ void ensureBackendsLoadedAndroid(const std::string& backendsDir) {
#endif
QLOG(
qvac_lib_inference_addon_cpp::logger::Priority::INFO,
std::string("Android: loading ggml backends from: ") +
std::string("loading ggml backends from: ") +
variantsDir.string());
ggml_backend_load_all_from_path(variantsDir.string().c_str());
});
}
} // namespace
#endif // __ANDROID__
#endif // __ANDROID__ || linux-arm64

BCIModel::BCIModel(BCIConfig config)
: cfg_(std::move(config)), neuralProcessor_() {}
Expand Down Expand Up @@ -187,8 +188,8 @@ int adrenoOpenclGpuDeviceIndex() {
void BCIModel::load() {
if (ctx_) return;

#if defined(__ANDROID__)
ensureBackendsLoadedAndroid(cfg_.backendsDir);
#if defined(__ANDROID__) || (defined(__linux__) && defined(__aarch64__))
ensureBackendsLoaded(cfg_.backendsDir);
#endif

whisper_context_params contextParams = toWhisperContextParams(cfg_);
Expand Down
2 changes: 1 addition & 1 deletion packages/bci-whispercpp/vcpkg.json
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
{
"name": "whisper-cpp",
"version": "1.9.1",
"port-version": 1
"port-version": 3
}
]
}
1 change: 1 addition & 0 deletions packages/transcription-whispercpp/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
objects, and split large C++/JS functions (and their inlined loops) into
smaller named helpers per the team coding standards. These are internal
refactors with no public API change.
- Desktop linux-arm64 prebuilds now ship per-arch ggml CPU variants (`whisper-cpp` override 1.9.1#3, pulling `ggml-speech` 2026-07-14): the previous armv8-a-baseline build compiled out the ARM dotprod/fp16 kernels (base f16 mean RTF 0.332 -> 0.097, base q8_0 0.127 -> 0.063, small f16 1.345 -> 0.343 on ubuntu-24.04-arm). The addon now loads the dynamically-loadable ggml backends on linux-arm64 (previously Android-only).

## [0.12.0] - 2026-07-14

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,19 +73,20 @@ auto WhisperModel::formatCaptionOutput(Transcript& transcript) -> void {
std::to_string(static_cast<int>(transcript.end)) + "|>";
}

#if defined(__ANDROID__)
#if defined(__ANDROID__) || (defined(__linux__) && defined(__aarch64__))
namespace {
// Android ships ggml with `GGML_BACKEND_DL=ON`, so no backend is
// Android -- and, since ggml-speech 2026-07-14, desktop linux-arm64
// prebuilds too -- ship ggml with `GGML_BACKEND_DL=ON`, so no backend is
// statically registered. dlopen the per-arch CPU + GPU `.so` modules
// once per process; otherwise whisper_init aborts on a NULL CPU device.
// Mirrors packages/{diffusion-cpp,llm-llamacpp,classification-ggml,…}.
void ensureBackendsLoadedAndroid(const std::string& backendsDir) {
void ensureBackendsLoaded(const std::string& backendsDir) {
static std::once_flag flag;
std::call_once(flag, [&]() {
if (backendsDir.empty()) {
QLOG(
qvac_lib_inference_addon_cpp::logger::Priority::WARNING,
"Android: configurationParams.backendsDir not set; falling back to "
"configurationParams.backendsDir not set; falling back to "
"ggml_backend_load_all() (default search path). CPU/Vulkan/OpenCL "
"registration may fail inside an APK.");
ggml_backend_load_all();
Expand All @@ -101,13 +102,13 @@ void ensureBackendsLoadedAndroid(const std::string& backendsDir) {
#endif
QLOG(
qvac_lib_inference_addon_cpp::logger::Priority::INFO,
std::string("Android: loading ggml backends from: ") +
std::string("loading ggml backends from: ") +
variantsDir.string());
ggml_backend_load_all_from_path(variantsDir.string().c_str());
});
}
} // namespace
#endif // __ANDROID__
#endif // __ANDROID__ || linux-arm64

namespace {
std::string toLowerCopy(std::string value) {
Expand Down Expand Up @@ -202,8 +203,8 @@ int adrenoOpenclGpuDeviceIndex() {
void WhisperModel::load() {
if (!ctx_) {

#if defined(__ANDROID__)
ensureBackendsLoadedAndroid(cfg_.backendsDir);
#if defined(__ANDROID__) || (defined(__linux__) && defined(__aarch64__))
ensureBackendsLoaded(cfg_.backendsDir);
#endif

whisper_context_params contextParams = toWhisperContextParams(cfg_);
Expand Down
2 changes: 1 addition & 1 deletion packages/transcription-whispercpp/vcpkg.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
{
"name": "whisper-cpp",
"version": "1.9.1",
"port-version": 1
"port-version": 3
}
]
}
4 changes: 4 additions & 0 deletions packages/tts-ggml/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

### Changed

- Desktop linux-arm64 prebuilds now ship per-arch ggml CPU variants (`tts-cpp` >= 2026-07-13#2, pulling `ggml-speech` 2026-07-14): the previous armv8-a-baseline build compiled out the ARM dotprod/fp16 kernels (chatterbox q4 CPU mean RTF 2.70 -> 2.28 on ubuntu-24.04-arm).

### Added

- **Chatterbox S3Gen classifier-free-guidance rate (`cfgRate`) (QVAC-21908).**
Expand Down
2 changes: 1 addition & 1 deletion packages/tts-ggml/vcpkg.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
},
{
"name": "tts-cpp",
"version>=": "2026-07-13#1"
"version>=": "2026-07-13#2"
}
],
"features": {
Expand Down
Loading