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,0 | plughw:1,0 |
{{WHISPER_MODEL_PATH}} | Whisper 量化模型路径 | ./models/ggml-base-q5_1.bin | ./models/ggml-base-q5_1.bin |
{{PI_LLM_MODEL}} | 本地语言模型 Tag | qwen2.5:3b | qwen2.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 步验收清单
- 已在录音与播放命令中使用 `plughw:`(而非裸 `hw:`),确保 16kHz 识别与 22.05kHz 播报自动完成重采样。
- 已通过 `"keep_alive": -1` 将 `qwen2.5:3b` 常驻锁定在内存中,消除首次提问的读盘冷启动延迟。
- 已过滤返回文本中的 Markdown 符号并将单次回答长度限制在 90 Token 以内,确保口语播报干脆利落。