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

树莓派 5 纯离线语音对话闭环脚本(Whisper.cpp 识别 + Ollama + Piper 语音合成) (pi5-voice-assistant-loop.sh)

串联 ALSA 麦克风录音、Whisper.cpp 量化语音识别、本地 Qwen2.5-3B 对答与 Piper 神经网络语音播报,内置播报期防回声静音锁。

[核心实测结论 / TL;DR]本配置包「树莓派 5 纯离线语音对话闭环脚本(Whisper.cpp 识别 + Ollama + Piper 语音合成)」(文件名:pi5-voice-assistant-loop.sh,格式:SHELL)是 Tinker AI 实测工坊配套指南《pi5-whisper-piper-offline-voice-assistant》的参数化生产模板。支持在本地浏览器实时定制 ALSA 麦克风设备号 (ALSA_MIC_DEV=plughw:1,0)、Whisper 量化模型路径 (WHISPER_MODEL_PATH=./models/ggml-base-q5_1.bin)、本地语言模型 Tag (PI_LLM_MODEL=qwen2.5:3b)、Piper 语音合成模型路径 (PIPER_VOICE_MODEL=./voices/zh_CN-huayan-medium.onnx) 等 4 项核心变量,默认遵循 127.0.0.1 回环绑定与最小权限规范。
03 // MAKERAI 创客 / STEM· 验证日期:2026-10-26
查看全部 42 套配置附件 →
pi5-voice-assistant-loop.sh

树莓派 5 纯离线语音对话闭环脚本(Whisper.cpp 识别 + Ollama + Piper 语音合成)

串联 ALSA 麦克风录音、Whisper.cpp 量化语音识别、本地 Qwen2.5-3B 对答与 Piper 神经网络语音播报,内置播报期防回声静音锁。

查看配套实测指南 →
参数化定制变量 (Variables — 自动保存在本地浏览器)
UTF-8 编码 · 零延迟实时编译
#!/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 // 参数化变量规范说明表

「pi5-voice-assistant-loop.sh」可定制环境变量与默认值说明

本配置模板(SHELL 格式)支持 4 项运行时参数注入,所有替换均在本地浏览器内完成。

模板占位符参数用途说明安全默认值填写示例
{{ALSA_MIC_DEV}}ALSA 麦克风设备号plughw:1,0plughw:1,0
{{WHISPER_MODEL_PATH}}Whisper 量化模型路径./models/ggml-base-q5_1.bin./models/ggml-base-q5_1.bin
{{PI_LLM_MODEL}}本地语言模型 Tagqwen2.5:3bqwen2.5:3b | qwen2.5:1.5b
{{PIPER_VOICE_MODEL}}Piper 语音合成模型路径./voices/zh_CN-huayan-medium.onnx./voices/zh_CN-huayan-medium.onnx
PAIRED HARDWARE MANIFEST // 配套实测环境与边界记录

配套指南《树莓派 5 全离线语音助手实战:Whisper.cpp 语音识别 + Ollama 3B + Piper 神经网络语音合成闭环》验证基线

实测硬件与操作系统 (Hardware & OS)

Raspberry Pi 5 (8GB) · 官方 27W PD 电源 · 免驱 USB 麦克风 · USB 音箱或 HDMI 音频输出

锁定软件栈与模型版本 (Pinned Versions)
whisper.cpp v1.7+ (ARM64 NEON)Ollama 0.5.7 (qwen2.5:3b)Piper TTS v1.2.0 (aarch64)
离线与安全边界 (100% 物理断网运行(家庭语音零上传云端))

从麦克风拾音、语音转文字(STT)、大模型问答到神经网络语音合成(TTS),100% 在树莓派本机内存完成,彻底杜绝智能音箱窃听顾虑。

已知限制与失败边界 (Known Limits)
  • 模型选型红线:切勿在树莓派 5 CPU 上硬跑 `whisper-large` 或 `medium` 模型(录 4 秒钟的话要等 22 秒才能转出文字!)。实测使用量化版 `ggml-base-q5_1.bin` 或 `small-q5_1` 可在 **0.6–1.4 秒** 内完成精准转写。
  • ALSA 声卡漂移坑点:树莓派重启后 USB 麦克风与音箱的编号(`hw:1,0` / `hw:2,0`)可能会互换;务必使用 `plughw:` 插件层进行自动采样率重采样,或按声卡名称固定绑定。
DEPLOYMENT CHECKLIST // 配置落地核验步骤

部署 pi5-voice-assistant-loop.sh 后的 3 步验收清单

  1. 已在录音与播放命令中使用 `plughw:`(而非裸 `hw:`),确保 16kHz 识别与 22.05kHz 播报自动完成重采样。
  2. 已通过 `"keep_alive": -1` 将 `qwen2.5:3b` 常驻锁定在内存中,消除首次提问的读盘冷启动延迟。
  3. 已过滤返回文本中的 Markdown 符号并将单次回答长度限制在 90 Token 以内,确保口语播报干脆利落。