TinkerLab
ARTIFACT // PI5-VOICE-ASSISTANT-LOOP.SH (SHELL)

Raspberry Pi 5 Offline Voice Loop Script (Whisper.cpp STT + Ollama + Piper TTS) (pi5-voice-assistant-loop.sh)

Chains ALSA mic capture, quantized Whisper.cpp STT, local Qwen2.5-3B response, and Piper neural TTS with half-duplex mic mute protection.

[KEY VERIFIED TAKEAWAY / TL;DR]This reproducible configuration artifact "Raspberry Pi 5 Offline Voice Loop Script (Whisper.cpp STT + Ollama + Piper TTS)" (pi5-voice-assistant-loop.sh, SHELL) is paired with Tinker AI Lab's hardware-verified guide "pi5-whisper-piper-offline-voice-assistant". It exposes 4 customizable browser variables (ALSA_MIC_DEV=plughw:1,0, WHISPER_MODEL_PATH=./models/ggml-base-q5_1.bin, PI_LLM_MODEL=qwen2.5:3b, PIPER_VOICE_MODEL=./voices/zh_CN-huayan-medium.onnx) with loopback-first security defaults.
03 // MAKERAI Maker / STEM Projects· Verified: 2026-10-26
Browse All 42 Artifacts →
pi5-voice-assistant-loop.sh

Raspberry Pi 5 Offline Voice Loop Script (Whisper.cpp STT + Ollama + Piper TTS)

Chains ALSA mic capture, quantized Whisper.cpp STT, local Qwen2.5-3B response, and Piper neural TTS with half-duplex mic mute protection.

View Paired Guide →
Customizable Variables (Saved in Browser)
UTF-8 Encoded · Live Client-Side Compilation
#!/usr/bin/env bash
# Tinker AI Maker Lab — Raspberry Pi 5 100% Offline Voice Assistant Loop (Guide #19)
set -euo pipefail

MIC="plughw:1,0"
WHISPER_BIN="${WHISPER_BIN:-./whisper-cli}"
WHISPER_MODEL="./models/ggml-base-q5_1.bin"
LLM_MODEL="qwen2.5:3b"
PIPER_VOICE="./voices/zh_CN-huayan-medium.onnx"

echo "=== [1/4] Recording 4s Voice Command from $MIC (16kHz Mono PCM) ==="
arecord -D "$MIC" -f S16_LE -r 16000 -c 1 -d 4 /tmp/pi5-query.wav

echo "=== [2/4] Running Local Whisper.cpp STT (4 Cortex-A76 Threads) ==="
USER_TEXT=$("$WHISPER_BIN" -m "$WHISPER_MODEL" -t 4 -np -nt -f /tmp/pi5-query.wav | tr -d '\n' | sed 's/^[[:space:]]*//')
echo "Heard: ${USER_TEXT:-<silence>}"

if [ -z "$USER_TEXT" ]; then
  echo "No speech detected; skipping LLM."
  exit 0
fi

echo "=== [3/4] Querying Local Ollama ($LLM_MODEL, num_ctx=2048) ==="
REPLY=$(curl -sS http://127.0.0.1:11434/api/generate -d "{
  \"model\": \"$LLM_MODEL\",
  \"stream\": false,
  \"options\": { \"num_ctx\": 2048, \"temperature\": 0.3, \"num_predict\": 120 },
  \"prompt\": \"Answer concisely in 1-2 spoken sentences without markdown symbols: $USER_TEXT\"
}" | python3 -c 'import sys,json; print(json.load(sys.stdin).get("response","").strip())')

echo "Reply: $REPLY"

echo "=== [4/4] Synthesizing Speech via Local Piper TTS (Half-Duplex Playback) ==="
if command -v piper >/dev/null 2>&1; then
  printf "%s" "$REPLY" | piper --model "$PIPER_VOICE" --output-raw | aplay -r 22050 -f S16_LE -t raw -
else
  echo "[INFO] Piper binary not found in PATH; printed text response above."
fi
PARAMETER SPECIFICATION // 参数化变量规范说明表

Customizable Parameter Reference for pi5-voice-assistant-loop.sh

This SHELL artifact exposes 4 template variables compiled client-side in your browser.

Template TokenParameter DescriptionVerified DefaultExample Format
{{ALSA_MIC_DEV}}ALSA Capture Deviceplughw:1,0plughw:1,0
{{WHISPER_MODEL_PATH}}Whisper GGUF/GGML Model Path./models/ggml-base-q5_1.bin./models/ggml-base-q5_1.bin
{{PI_LLM_MODEL}}Local Ollama Model Tagqwen2.5:3bqwen2.5:3b | qwen2.5:1.5b
{{PIPER_VOICE_MODEL}}Piper TTS ONNX Voice Path./voices/zh_CN-huayan-medium.onnx./voices/zh_CN-huayan-medium.onnx
PAIRED HARDWARE MANIFEST // 配套实测环境与边界记录

Verified Environment for "Raspberry Pi 5 100% Offline Voice Assistant Loop: Whisper.cpp STT + Ollama 3B + Piper Neural TTS"

Tested Hardware & OS

Raspberry Pi 5 (8GB) · Official 27W PSU · USB Microphone (UAC) · 3.5mm / USB Speaker

Pinned Stack & Model Versions
whisper.cpp v1.7+ (ARM64 NEON)Ollama 0.5.7 (qwen2.5:3b)Piper TTS v1.2.0 (aarch64)
Offline Boundary (100% Air-Gapped Microphone-to-Speaker Privacy)

Every stage—Speech-to-Text, LLM reasoning, and Text-to-Speech—runs locally on the Pi 5 ARM64 CPU.

Known Operational Limits & Failure Modes
  • Do not run `whisper-large-v3` or `medium` on Raspberry Pi 5 CPU: a 4-second voice command takes 22+ seconds to transcribe! Use `ggml-base-q5_1.bin` or `ggml-small-q5_1.bin` for 0.6s–1.4s STT latency.
  • ALSA card indices (`hw:0,0` vs `hw:1,0`) can swap across reboots if you plug/unplug USB devices; bind by device name (`plughw:CARD=Device,DEV=0`) in `/etc/asound.conf`.
DEPLOYMENT CHECKLIST // 配置落地核验步骤

3-Step Verification Checklist After Deploying pi5-voice-assistant-loop.sh

  1. Used `plughw:` (not raw `hw:`) in `arecord`/`aplay` so 16kHz STT and 22.05kHz TTS resample cleanly.
  2. Pinned `qwen2.5:3b` in RAM with `"keep_alive": -1` to eliminate 15-second cold-load latency.
  3. Stripped Markdown symbols (`*`, `#`, `` ` ``) and capped `num_predict: 90` for concise spoken responses.