From 91434f94c17dde4543b78f500f585e280c860018 Mon Sep 17 00:00:00 2001 From: Ross Morsali Date: Thu, 24 Sep 2026 18:36:28 +0200 Subject: [PATCH 1/3] chore: update whisper.cpp pin to 1.9.4-dev (stream-pcm de8fb5fd) Moves the pinned rmorse/whisper.cpp stream-pcm fork from ddfe1196 (v1.8.6) to de8fb5fd (tag v1.9.4-dev-stream-pcm), based on upstream master after v1.9.3. whisper.h changes in this range are additive only, so no binding or API changes are needed. Parakeet and the new VAD timestamp/segment accessors are left for a follow-up feature branch. Picks up the upstream whisper_full_parallel timestamp overflow fix (ggml-org/whisper.cpp#4044). --- CHANGELOG.md | 9 ++++++++- Cargo.toml | 2 +- README.md | 2 +- whisper-cpp-plus-sys/README.md | 2 +- whisper-cpp-plus-sys/build.rs | 4 ++-- whisper-cpp-plus-sys/whisper.cpp | 2 +- whisper-cpp-plus/README.md | 2 +- 7 files changed, 15 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 50cf664..4faca3d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] -No unreleased changes. +### Changed + +- Updated the pinned whisper.cpp fork to `rmorse/whisper.cpp` `stream-pcm` at `de8fb5fd` (whisper.cpp `1.9.4-dev`), based on upstream `ggml-org/whisper.cpp` `master` after `v1.9.3`. This picks up upstream releases `v1.8.7` through `v1.9.3` and ggml `0.25.1`. +- The upstream additions in this range (NVIDIA Parakeet support, VAD-mapped token timestamps, and internal VAD segment accessors) are available in the bundled C library but are not yet exposed through the Rust API. + +### Fixed + +- Fixed corrupted segment timestamps for long audio when using parallel transcription (`whisper_full_parallel`), via upstream ggml-org/whisper.cpp#4044. ## [0.1.5] - 2026-06-12 diff --git a/Cargo.toml b/Cargo.toml index fadb84e..4f940ba 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,4 +1,4 @@ -# Pinned to whisper.cpp v1.8.6-stream-pcm (fork: rmorse/whisper.cpp, branch: stream-pcm) +# Pinned to whisper.cpp 1.9.4-dev (fork: rmorse/whisper.cpp, branch: stream-pcm, commit de8fb5fd) [workspace] members = ["whisper-cpp-plus-sys", "whisper-cpp-plus", "xtask"] resolver = "2" diff --git a/README.md b/README.md index 8a03ad5..91c9a9d 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # whisper-cpp-plus -> **Pinned to whisper.cpp v1.8.6-stream-pcm** (fork: [`rmorse/whisper.cpp`](https://github.com/rmorse/whisper.cpp), branch: `stream-pcm`, commit [`ddfe1196`](https://github.com/rmorse/whisper.cpp/commit/ddfe1196ed8e88c670c0c7e3094ed204daf749ac)) +> **Pinned to whisper.cpp 1.9.4-dev** (fork: [`rmorse/whisper.cpp`](https://github.com/rmorse/whisper.cpp), branch: `stream-pcm`, commit [`de8fb5fd`](https://github.com/rmorse/whisper.cpp/commit/de8fb5fda8b25837a2ba0034c8c24223a6fd6c6c), based on upstream `ggml-org/whisper.cpp` `master` after `v1.9.3`) Safe Rust bindings for [whisper.cpp](https://github.com/ggerganov/whisper.cpp) with real-time PCM streaming and VAD support — OpenAI's Whisper speech recognition model. diff --git a/whisper-cpp-plus-sys/README.md b/whisper-cpp-plus-sys/README.md index 60d0850..c5f73f8 100644 --- a/whisper-cpp-plus-sys/README.md +++ b/whisper-cpp-plus-sys/README.md @@ -1,6 +1,6 @@ # whisper-cpp-plus-sys -> **Pinned to whisper.cpp v1.8.6-stream-pcm** (fork: [`rmorse/whisper.cpp`](https://github.com/rmorse/whisper.cpp), branch: `stream-pcm`, commit [`ddfe1196`](https://github.com/rmorse/whisper.cpp/commit/ddfe1196ed8e88c670c0c7e3094ed204daf749ac)) +> **Pinned to whisper.cpp 1.9.4-dev** (fork: [`rmorse/whisper.cpp`](https://github.com/rmorse/whisper.cpp), branch: `stream-pcm`, commit [`de8fb5fd`](https://github.com/rmorse/whisper.cpp/commit/de8fb5fda8b25837a2ba0034c8c24223a6fd6c6c), based on upstream `ggml-org/whisper.cpp` `master` after `v1.9.3`) Low-level FFI bindings to [whisper.cpp](https://github.com/ggerganov/whisper.cpp) for Rust. diff --git a/whisper-cpp-plus-sys/build.rs b/whisper-cpp-plus-sys/build.rs index ab75ff9..f1b3c78 100644 --- a/whisper-cpp-plus-sys/build.rs +++ b/whisper-cpp-plus-sys/build.rs @@ -4,8 +4,8 @@ use std::path::{Path, PathBuf}; #[path = "cuda_detect.rs"] mod cuda_detect; -/// Pinned commit from rmorse/whisper.cpp (stream-pcm branch, based on v1.8.6) -const WHISPER_CPP_VERSION: &str = "ddfe1196ed8e88c670c0c7e3094ed204daf749ac"; +/// Pinned commit from rmorse/whisper.cpp (stream-pcm branch, whisper.cpp 1.9.4-dev, based on upstream master after v1.9.3) +const WHISPER_CPP_VERSION: &str = "de8fb5fda8b25837a2ba0034c8c24223a6fd6c6c"; const WHISPER_CPP_REPO: &str = "rmorse/whisper.cpp"; fn main() { diff --git a/whisper-cpp-plus-sys/whisper.cpp b/whisper-cpp-plus-sys/whisper.cpp index ddfe119..de8fb5f 160000 --- a/whisper-cpp-plus-sys/whisper.cpp +++ b/whisper-cpp-plus-sys/whisper.cpp @@ -1 +1 @@ -Subproject commit ddfe1196ed8e88c670c0c7e3094ed204daf749ac +Subproject commit de8fb5fda8b25837a2ba0034c8c24223a6fd6c6c diff --git a/whisper-cpp-plus/README.md b/whisper-cpp-plus/README.md index 0a7a03c..7aca467 100644 --- a/whisper-cpp-plus/README.md +++ b/whisper-cpp-plus/README.md @@ -1,6 +1,6 @@ # whisper-cpp-plus -> **Pinned to whisper.cpp v1.8.6-stream-pcm** (fork: [`rmorse/whisper.cpp`](https://github.com/rmorse/whisper.cpp), branch: `stream-pcm`, commit [`ddfe1196`](https://github.com/rmorse/whisper.cpp/commit/ddfe1196ed8e88c670c0c7e3094ed204daf749ac)) +> **Pinned to whisper.cpp 1.9.4-dev** (fork: [`rmorse/whisper.cpp`](https://github.com/rmorse/whisper.cpp), branch: `stream-pcm`, commit [`de8fb5fd`](https://github.com/rmorse/whisper.cpp/commit/de8fb5fda8b25837a2ba0034c8c24223a6fd6c6c), based on upstream `ggml-org/whisper.cpp` `master` after `v1.9.3`) Safe Rust bindings for [whisper.cpp](https://github.com/ggerganov/whisper.cpp) with **real-time PCM streaming** and VAD support. From 31d3034bdaf64ab4f1d0e62cdfd849e84bbf9330 Mon Sep 17 00:00:00 2001 From: Ross Morsali Date: Thu, 24 Sep 2026 19:51:36 +0200 Subject: [PATCH 2/3] docs: correct changelog for whisper.cpp 1.9 pin Drop the whisper_full_parallel fix entry: WhisperState::full_parallel reads results from its own state while upstream writes them to the context's default state, so the upstream fix never reached crate users (to be fixed separately). Document user-visible upstream behaviour changes in the pinned range and why the new VAD accessors are not exposed. --- CHANGELOG.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4faca3d..b4d742b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,12 +9,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed -- Updated the pinned whisper.cpp fork to `rmorse/whisper.cpp` `stream-pcm` at `de8fb5fd` (whisper.cpp `1.9.4-dev`), based on upstream `ggml-org/whisper.cpp` `master` after `v1.9.3`. This picks up upstream releases `v1.8.7` through `v1.9.3` and ggml `0.25.1`. -- The upstream additions in this range (NVIDIA Parakeet support, VAD-mapped token timestamps, and internal VAD segment accessors) are available in the bundled C library but are not yet exposed through the Rust API. - -### Fixed - -- Fixed corrupted segment timestamps for long audio when using parallel transcription (`whisper_full_parallel`), via upstream ggml-org/whisper.cpp#4044. +- Updated the pinned whisper.cpp fork to `rmorse/whisper.cpp` `stream-pcm` at `de8fb5fd` (tag `v1.9.4-dev-stream-pcm`, whisper.cpp `1.9.4-dev`), based on upstream `ggml-org/whisper.cpp` `master` after `v1.9.3`. This picks up upstream releases `v1.8.7` through `v1.9.3` and ggml `0.25.1`. +- Upstream now re-seeds the decoder between calls (ggml-org/whisper.cpp#4025), so temperature-fallback output is deterministic across repeated transcriptions on the same state. +- Upstream now rejects Silero VAD models whose encoder does not have exactly 4 layers (ggml-org/whisper.cpp#4064); loading such a model with `WhisperVadProcessor` now fails at load time. +- On Apple Silicon, upstream's optional ANEForge encoder backend (ggml-org/whisper.cpp#3905) is activated by the `ANEFORGE_ENCODER` and `ANEFORGE_DYLIB` environment variables, which load a dynamic library from the given path when a state is created. It is inactive unless those variables are set. +- NVIDIA Parakeet support is available in the bundled C library but is not yet exposed through the Rust API. +- The new upstream VAD segment and VAD-mapped token timestamp accessors are not exposed: they are only populated by upstream's built-in `whisper_full` VAD, which does not run for per-state transcription (`whisper_full_with_state`, used by this crate; see ggml-org/whisper.cpp#3423). Use the crate's own VAD pipeline instead. ## [0.1.5] - 2026-06-12 From b3bee11b57cdc8c59b27d5b08f128ae9cf0852d3 Mon Sep 17 00:00:00 2001 From: Ross Morsali Date: Thu, 24 Sep 2026 20:20:04 +0200 Subject: [PATCH 3/3] docs: recommend the crate's VAD over whisper.cpp's built-in VAD whisper.cpp's built-in whisper_full VAD does not run for whisper_full_with_state, which the crate uses for all transcription (ggml-org/whisper.cpp#3423). Point users at WhisperVadProcessor, EnhancedWhisperVadProcessor and WhisperStreamPcm::with_vad instead. --- README.md | 2 ++ whisper-cpp-plus/README.md | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 91c9a9d..3998e4f 100644 --- a/README.md +++ b/README.md @@ -227,6 +227,8 @@ for (start, end) in segments.get_all_segments() { } ``` +> **Use this crate's VAD, not whisper.cpp's built-in VAD.** Use `WhisperVadProcessor`, `EnhancedWhisperVadProcessor` or `WhisperStreamPcm::with_vad` for voice activity detection. whisper.cpp's built-in `whisper_full` VAD does not run for per-state transcription (`whisper_full_with_state`), which this crate uses for every transcription, so it is intentionally not exposed ([ggml-org/whisper.cpp#3423](https://github.com/ggml-org/whisper.cpp/pull/3423)). + **Enhanced VAD with segment aggregation:** ```rust diff --git a/whisper-cpp-plus/README.md b/whisper-cpp-plus/README.md index 7aca467..c128bc7 100644 --- a/whisper-cpp-plus/README.md +++ b/whisper-cpp-plus/README.md @@ -110,7 +110,7 @@ whisper-cpp-plus = { version = "0.1.5", features = ["cuda"] } - **Transcription** — `WhisperContext`, `WhisperState`, `FullParams`, `TranscriptionParams` builder - **Streaming** — `WhisperStream` for chunked real-time transcription - **StreamPCM** — `WhisperStreamPcm` for raw PCM input with VAD-driven processing -- **VAD** — `WhisperVadProcessor` for Silero-based voice activity detection +- **VAD** — `WhisperVadProcessor` for Silero-based voice activity detection. Use this (or `WhisperStreamPcm::with_vad` / the enhanced VAD) rather than whisper.cpp's built-in `whisper_full` VAD, which does not run for the per-state transcription this crate uses ([ggml-org/whisper.cpp#3423](https://github.com/ggml-org/whisper.cpp/pull/3423)) - **Enhanced** — Temperature fallback + enhanced VAD aggregation for improved quality - **Quantization** — `WhisperQuantize` for model compression (feature = `quantization`)