# Build your own offline Siri with Whistle + Claude

> A guide by Aashish Pahwa, behind a reel on Instagram: https://www.instagram.com/p/DfHl2lAvmJL/.
> The page: https://aashishpahwa.com/bio/guides/offline-siri-whistle-claude

By the end, you will have an offline speech-to-text setup using Whistle, and you will use Claude to wire it into a Siri-like voice assistant flow (transcribe first, then take actions). This is worth doing because it runs on your machine, with no internet requirement for the transcription model itself. You will also see exactly what to paste into Claude and what to run to sanity-check it.

## What you need

- Claude desktop app (or Claude Code)
- A working Python environment
- Enough disk space to download the Whistle model
- Internet access for the first model download (offline after that)
- A hotkey/hardware mic setup for testing audio

## The steps

### Step 1: Get Whistle from Hugging Face

Whistle is a speech-to-text model from Cactus Compute. The whole model is one `16.9 MB` file, it runs on the CPU with no internet, and Cactus says it mostly beats Whisper base at `9x less` file size and `6x` the speed. It understands English, German, French, Spanish, Italian, Dutch and Polish. Licence is `Apache 2.0`.

Links
- Whistle model (the repo URL to copy): https://huggingface.co/Cactus-Compute/whistle
- Needle, the tool-calling model that runs on the same engine: https://huggingface.co/Cactus-Compute/needle3
- Engine and Python package source: https://github.com/cactus-compute/needle
- Cactus blog post: https://cactuscompute.com/blog/whistle

First, copy the Whistle repo URL.

- https://huggingface.co/Cactus-Compute/whistle

### Step 2: Start a fresh Claude session in an empty folder

Open Claude (the Claude desktop app, Code tab, or Claude Code), start a new session in an empty folder.

This keeps the build output clean and makes it easier to see what Claude creates.

- Claude (the Claude desktop app, Code tab, or Claude Code)
- Start a new session in an empty folder

### Step 3: Paste the build prompt into Claude

Paste this prompt:

```

```
Here's a tiny offline speech-to-text model: https://huggingface.co/Cactus-Compute/whistle

Turn it into a Siri-like voice assistant for my PC and phone. I talk, Whistle transcribes it on-device, then it takes actions: open apps, set reminders, search my files. All offline. Build it and give me the install steps.
```
```

### Step 4: Let Claude build and test it

Let Claude build and test it. It will install the Python package (`pip install cactus-needle`), download the model once, and wire Whistle (speech to text) to Needle (text to tool calls).

What you should expect to see on screen is the install of the Python package. It should run `pip install cactus-needle`, download the model once, and connect Whistle (speech to text) to Needle (text to tool calls).

- pip install cactus-needle

### Step 5: Do a quick voice test

Try it: hold the hotkey and say something like “turn off the kitchen lights” or “remind me at 6”.

If it’s wired correctly, you should see transcription and then the assistant attempting the requested action.

- turn off the kitchen lights
- remind me at 6

### Step 6: Quick test without Claude

Quick test without Claude

pip install cactus-needle
python -c "import needle; print(needle.transcribe('clip.wav')['text'])"
needle whistle playground   (transcribes from your microphone)

- pip install cactus-needle
```
python -c "import needle; print(needle.transcribe('clip.wav')['text'])"
needle whistle playground   (transcribes from your microphone)
```

## Tips

- If Claude fails, the first thing to check is whether it can download the model and install `cactus-needle`. The build is basically “install package, download model once, then wire Whistle to Needle”.
- If transcription works but actions do not, you likely have the speech-to-text part working but the tool-calling flow is not fully connected yet. Re-run the test after Claude finishes the wiring step.
- If you want to keep it truly offline after setup, run the build once with internet, then test again with your network off to confirm transcription still runs.

## Try next

- Try the voice test again and verify you get transcription before any action.
- Extend the “actions” list one at a time (open apps, then reminders, then file search) so you know what’s breaking if something fails.

---

All guides: https://aashishpahwa.com/bio/guides. All links: https://aashishpahwa.com/bio
