--- license: apache-2.0 pipeline_tag: automatic-speech-recognition language: - en - de - fr - es - it - nl - pl tags: - gguf - audio.cpp - speech-to-text - on-device - cpu - metal - fp32 - experimental --- # Whistle GGUF (FP32, experimental) This is a community GGUF conversion of [Cactus Compute Whistle](https://huggingface.co/Cactus-Compute/whistle). It packages the published FP32 checkpoint for an experimental `whistle_asr` adapter in audio.cpp. It is not an official Cactus Compute release. **Stock audio.cpp cannot run this model yet.** The adapter is proposed in [audio.cpp pull request #824](https://github.com/0xShug0/audio.cpp/pull/824) and has not been merged. Until it lands, downloading this file alone does not provide a usable audio.cpp runtime. GGUF is a container format, not a guarantee of compatibility with other GGUF applications. ## Artifact and provenance - File: `whistle-f32.gguf` - Size: **220,831,616 bytes** (approximately 220.8 MB) - SHA-256: `1167c811abad2fc539a1116e1b7031ba4a07c8f5b2e75ab3a389ae370efede8b` - Source: `Cactus-Compute/whistle` - Pinned source revision: `b358ddadd89b7a713b5aa131f23032d3cca1b251` - Weights: `checkpoints/whistle.safetensors`, stored as 116 FP32 tensors without quantization - Embedded resources: source configuration and license, custom tokenizer blob, mel filterbank, and two Hadamard permutations - Embedded audio.cpp model specification: `whistle_asr` **Modification notice:** The source checkpoint has been repackaged as GGUF. Tokenizer, frontend, and permutation resources have been extracted from the official `whistle.cact` and embedded alongside the FP32 weights. The experimental audio.cpp model specification is additional conversion metadata. The weights are not a dequantization of the compact `.cact` model. The official `.cact` file uses Cactus Quants and is approximately 16.9 MB. This FP32 conversion is much larger and can produce different spelling or number formatting. The official model's published speed and accuracy results do not establish results for this conversion or adapter. ## Experimental runtime The adapter lives on the `feat/whistle-asr` branch of [BumpyClock/audio.cpp](https://github.com/BumpyClock/audio.cpp/tree/feat/whistle-asr), based on audio.cpp `main`. It runs in-process C++ inference and does not use Needle, Python, ONNX Runtime, or a server during recognition. The mel frontend reuses audio.cpp's shared `NemoMelFrontend`. The encoder runs as one ggml graph on the CPU or Metal backend, built from audio.cpp framework modules with Whistle-specific math kept model-local. The autoregressive decoder runs on the host CPU. CUDA, Vulkan, and HIP are not validated and are rejected at session creation. With an audio.cpp build that contains the experimental adapter, use: ```sh audiocpp_cli --task asr --family whistle_asr --backend cpu \ --model whistle-f32.gguf --audio clip_16k_mono.wav # or, on Apple silicon: audiocpp_cli --task asr --family whistle_asr --backend metal \ --model whistle-f32.gguf --audio clip_16k_mono.wav ``` Add `--language en`, `de`, `fr`, `es`, `it`, `nl`, or `pl` to force a language. Otherwise, the model detects the language. This example requires the adapter; it is not a command for an unmodified upstream build. ## Supported scope and limitations The adapter supports offline transcription of finite 16 kHz mono audio, up to 30 seconds per recording. Only FP32 model tensors are admitted. The model advertises English, German, French, Spanish, Italian, Dutch, and Polish. Local recognition checks exercised English and German recordings plus one short and one 20 to 26 second synthetic clip per language; these are prompt-agreement spot checks, not an accuracy benchmark. The adapter does not implement streaming, word timestamps, keyword biasing, speech embeddings, resampling, or long-form chunking. Metal accelerates the encoder only; decoding stays on the CPU. Decoding uses a 320-text-token ceiling and reports an error if EOS is not produced, rather than presenting partial output as complete. Recognition can contain errors or hallucinations, particularly with quiet or non-speech audio. This upload does not include a speech activity detection system. ## Observed recognition A local English sample produced: > Some call me Nature. Others call me Mother Nature. I've been here for over 4.5 billion years, twenty two thousand five hundred times longer than you. A synthetic German recording produced: > Guten Morgen, wie wird das Wetter heute? The German result matched the official runtime for that recording, both with automatic language detection and a forced German hint. These are example checks, not a multilingual accuracy benchmark or production qualification. ## License and attribution The source model is licensed under Apache 2.0. A copy of the source license is included as `LICENSE` and embedded in the GGUF. Whistle was created by Cactus Compute. Sources used for the conversion and runtime work: - [Pinned official model and license](https://huggingface.co/Cactus-Compute/whistle/tree/b358ddadd89b7a713b5aa131f23032d3cca1b251) - [audio.cpp pull request #824](https://github.com/0xShug0/audio.cpp/pull/824) and the [`feat/whistle-asr` branch](https://github.com/BumpyClock/audio.cpp/tree/feat/whistle-asr) - [Pinned public Whistle reference reconstruction](https://huggingface.co/mrfakename/whistle-ONNX/tree/14fc92cb09ad5c271fe9a4ec4be70274790050d2) The model and runtime remain separate works. This repository distributes converted model assets, not the experimental audio.cpp adapter.