想要一个真正听从你的指令、运行在你自己的硬件上、而且不会因为听错而误点十二个菠萝的迷你语音助手吗?用树莓派DIY一个AI助手其实非常简单、有趣且灵活。你只需要连接唤醒词、语音识别(ASR = 自动语音识别)、自然语言处理(规则或语言学习模型)以及文本转语音(TTS)功能。添加一些脚本、一两个服务,并进行一些精心的音频调整,你就能拥有一个可以随身携带、听从你指令的智能音箱。
让我们带你从零基础开始,轻松与你的树莓派对话,告别以往的抓狂。我们将涵盖零件、设置、代码、对比、注意事项……所有细节,应有尽有。🌯
您可能还想阅读以下文章:
🔗 如何有效地学习人工智能
制定学习计划、练习项目并跟踪进度。.
🔗 如何创办一家人工智能公司
验证问题,构建最小可行产品,组建团队,获得首批客户。.
🔗 如何利用人工智能提高生产力
实现日常任务自动化,简化工作流程,并提高创意产出。.
🔗 如何将人工智能融入您的业务
确定高影响力流程,实施试点,衡量投资回报率,扩大规模。.
如何用树莓派打造一款优秀的DIY人工智能助手✅
-
默认设置为私密——尽可能将音频保留在本地。您可以决定哪些音频会离开设备。
-
模块化——像乐高积木一样交换组件:唤醒词引擎、ASR、LLM、TTS。
-
价格实惠——主要使用开源的通用麦克风、扬声器和树莓派。
-
可定制——想要家庭自动化、仪表盘、例程、自定义技能?轻而易举。
-
可靠——由服务管理,自动启动并开始监听。
-
乐趣无穷——你将学到很多关于音频、流程和事件驱动设计的知识。
小提示:如果您使用 Raspberry Pi 5 并计划运行较大型的本地模型,则在持续负载下使用外接散热器会有所帮助。(如有疑问,请选择专为 Pi 5 设计的官方主动式散热器。)[1]
你需要准备的零件和工具🧰
-
树莓派:建议使用 Pi 4 或 Pi 5 以获得足够的性能余量。
-
microSD 卡:建议使用 32 GB 以上容量。
-
USB麦克风:一个简单的USB会议麦克风就很好用。
-
扬声器:USB 或 3.5 毫米扬声器,或 I2S 放大器 HAT。
-
网络:以太网或Wi-Fi。
-
可选配件:外壳、主动散热器、一键通按钮、LED 灯环。[1]
操作系统和基线设置
-
Raspberry Pi Imager 刷写 Raspberry Pi 操作系统。这是获取带有所需预设的可启动 microSD 卡的直接方法。[1]
-
启动系统,连接网络,然后更新软件包:
sudo apt update && sudo apt upgrade -y
-
音频基础知识:在 Raspberry Pi OS 系统中,您可以通过桌面用户界面或
raspi-config 命令。所有型号均支持 USB 和 HDMI 音频输出;蓝牙输出仅适用于配备蓝牙功能的型号。[1] -
验证设备:
arecord -l aplay -l
然后测试录制和回放。如果音量听起来不对劲,请先检查混音器和默认设置,然后再考虑麦克风的问题。.

建筑概览🗺️
基于树莓派的合理流程如下:
唤醒词 → 实时音频捕获 → ASR 转录 → 意图处理或 LLM → 响应文本 → TTS → 音频播放 → 通过 MQTT 或 HTTP 执行可选操作。.
-
唤醒词:Porcupine 体积小巧、准确度高,可在本地运行,并支持逐个关键词的灵敏度控制。[2]
-
ASR :Whisper 是一款多语言通用 ASR 模型,经过约 68 万小时的训练,对口音和背景噪声具有较强的鲁棒性。对于设备端使用,
whisper.cpp提供了一个简洁的 C/C++ 推理路径。[3][4] -
大脑:您可以根据自身能力选择——通过 API 使用云端 LLM、规则引擎或本地推理。
-
TTS :Piper 可在本地生成自然语音,速度足够快,即使在配置一般的硬件上也能提供快速响应。[5]
快速对比表🔎
| 工具 | 最适合 | 价格适中 | 为什么有效 |
|---|---|---|---|
| 豪猪唤醒词 | 始终监听触发器 | 免费套餐+ | 低CPU占用率、准确、易于绑定[2] |
| Whisper.cpp | 树莓派上的本地ASR | 开源 | 准确度高,CPU占用率低[4] |
| 更快的低语 | 在 CPU/GPU 上实现更快的 ASR | 开源 | CTranslate2 优化 |
| Piper TTS | 本地语音输出 | 开源 | 快速的声音,多种语言[5] |
| 云LLM API | 丰富的推理 | 基于使用情况 | 卸载繁重的计算任务 |
| Node-RED | 策划行动 | 开源 | 可视化流程,兼容 MQTT |
逐步构建:你的第一个语音循环🧩
我们将使用 Porcupine 来处理唤醒词,Whisper 来进行转录,一个轻量级的“大脑”函数来处理回复(替换成你选择的语言学习模型),以及 Piper 来进行语音识别。保持简洁,然后不断迭代。.
1)安装依赖项
sudo apt install -y python3-pip portaudio19-dev sox ffmpeg pip3 install sounddevice numpy
-
Porcupine:获取您语言的 SDK/绑定,并按照快速入门指南操作(访问键 + 关键字列表 + 音频帧 →
.process)。[2] -
Whisper(CPU友好型):构建whisper.cpp :
git clone https://github.com/ggml-org/whisper.cpp cd whisper.cpp && cmake -B build && cmake --build build -j ./models/download-ggml-model.sh base.en ./build/bin/whisper-cli -m ./models/ggml-base.en.bin -f your.wav -otxt
上述情况反映了该项目的快速启动。[4]
更喜欢 Python?
faster-whisper(CTranslate2) 通常比原生 Python 运行速度更快。
2) 设置 Piper TTS
git clone https://github.com/rhasspy/piper cd piper make # 下载你喜欢的语音模型,例如 en_US-amy echo "Hello there." | ./piper --model voices/en/en_US-amy-medium.onnx --output_file hello.wav aplay hello.wav
Piper 专为设备端 TTS 而设计,提供多种语音/语言选项。[5]
3) Python 中的最小辅助循环
刻意精简:等待唤醒词(占位符),录音,用whisper.cpp,生成回复(占位符),然后通过 Piper 说话。您可以将占位符替换为您喜欢的 LLM 或规则逻辑。
import os, subprocess, wave import sounddevice as sd WAKE_WORD = "hey computer" # 生产环境中替换为 Porcupine [2] RECORD_SECONDS = 6 SAMPLE_RATE = 16000 CHANNELS = 1 WORKDIR = "/home/pi/assistant" ASR_BIN = "/home/pi/whisper.cpp/build/bin/whisper-cli" # [4] ASR_MODEL = "/home/pi/whisper.cpp/models/ggml-base.en.bin" PIPER_BIN = "/home/pi/piper/build/piper" # [5] PIPER_VOICE = "/home/pi/piper/voices/en/en_US-amy-medium.onnx" os.makedirs(WORKDIR, exist_ok=True) def record_wav(path, seconds=RECORD_SECONDS): audio = sd.rec(int(seconds * SAMPLE_RATE), samplerate=SAMPLE_RATE, channels=CHANNELS, dtype='int16') sd.wait() with wave.open(path, 'wb') as w: w.setnchannels(CHANNELS); w.setsampwidth(2); w.setframerate(SAMPLE_RATE) w.writeframes(audio.tobytes()) def transcribe(path): cmd = [ASR_BIN, "-m", ASR_MODEL, "-f", path, "-otxt"] subprocess.run(cmd, check=True, cwd=WORKDIR) with open(path.replace(".wav", ".txt"), "r", encoding="utf-8") as f: return f.read().strip() def generate_reply(prompt): if "weather" in prompt.lower(): return "我看不到云,但天气可能还不错。以防万一,带件外套吧。" return "您说:" + prompt def speak(text): proc = subprocess.Popen([PIPER_BIN, "--model", PIPER_VOICE, "--output_file", f"{WORKDIR}/reply.wav"], stdin=subprocess.PIPE) proc.stdin.write(text.encode("utf-8")); proc.stdin.close(); proc.wait() subprocess.run(["aplay", f"{WORKDIR}/reply.wav"], check=True) print("助手已准备就绪。请输入唤醒词进行测试。") while True: typed = input("> ").strip().lower() if typed == WAKE_WORD: wav_path = f"{WORKDIR}/input.wav" record_wav(wav_path) text = transcribe(wav_path) reply = generate_reply(text) print("用户:", text); print("助手:", reply) speak(reply) else: print("输入唤醒词以测试循环。")
要实现真正的唤醒词检测,可以集成 Porcupine 的流式检测器(CPU 占用低,对每个关键词的灵敏度高)。[2]
真正重要的音频调校🎚️
一些小小的改动就能让你的助手感觉智能十倍:
-
麦克风距离:30-60厘米是许多USB麦克风的最佳距离。
-
电平:避免输入信号削波,保持播放正常;在排查代码问题之前,先修复路由。在 Raspberry Pi OS 上,您可以通过系统工具或
raspi-config。[1] -
房间声学:坚硬的墙壁会产生回声;麦克风下方放置软垫会有所帮助。
-
唤醒词阈值:太敏感→会触发幽灵唤醒词;太严格→你会对着塑料大喊大叫。Porcupine 允许你针对每个关键词调整灵敏度。[2]
-
散热:在 Pi 5 上进行长时间转录时,官方主动式散热器能带来持续稳定的性能。[1]
从玩具到家电:服务、自动启动、健康检查🧯
人会忘记运行脚本,电脑也会忘记友好待人。将你的循环脚本转换为托管服务:
-
创建 systemd 单元:
[单元] 描述=DIY语音助手 After=network.target sound.target [服务] 用户=pi 工作目录=/home/pi/assistant ExecStart=/usr/bin/python3 /home/pi/assistant/assistant.py Restart=always RestartSec=3 [安装] WantedBy=multi-user.target
-
启用它:
sudo cp assistant.service /etc/systemd/system/ sudo systemctl daemon-reload sudo systemctl enable --now assistant.service
-
原木尾部:
journalctl -u 助手 -f
现在它能开机启动,崩溃后自动重启,整体表现得像个智能设备。虽然有点乏味,但比以前好多了。.
技能系统:让它在家中真正发挥作用🏠✨
语音输入和语音输出功能完善后,添加操作:
-
意图路由:用于常见任务的简单关键字路由。
-
智能家居:向 MQTT 发布事件或调用 Home Assistant 的 HTTP 端点。
-
插件:快速 Python 函数,如
set_timer、what_is_the_time、play_radio、run_scene。
即使有云端 LLM 在回路中,为了速度和可靠性,也应首先路由明显的本地命令。.
本地部署 vs 云部署:权衡取舍,您将切身感受到🌓
仅限本地使用。
优点:私密、离线、成本可预测。
缺点:在小型电路板上,较复杂的模型运行速度可能较慢。如果将 Whisper 保存在设备本地或附近的服务器上,其多语言训练功能有助于提高模型的鲁棒性。[3]
云辅助的
优点:强大的推理能力、更大的上下文窗口。
缺点:数据会离开设备、依赖网络、成本不稳定。
混合模式通常更受欢迎:唤醒词 + ASR 本地 → 调用 API 进行推理 → TTS 本地。[2][3][5]
故障排除:奇怪的小故障及快速修复方法👾
-
唤醒词误触发:降低灵敏度或尝试使用其他麦克风。[2]
-
ASR 延迟:使用较小的 Whisper 模型或使用发布标志(
-j --config Releasewhisper.cpp。[4] -
TTS 断断续续:预先生成常用短语;请确认您的音频设备和采样率。
-
未检测到麦克风:请检查
arecord -l和混音器。 -
过热降频:为确保 Pi 5 的持续性能,请使用官方的 Active Cooler 散热器。[1]
您应该认真阅读的安全与隐私提示🔒
-
使用 APT 更新您的树莓派。.
-
如果您使用任何云 API,请记录您发送的内容,并考虑先在本地删除个人信息。.
-
以最小权限运行服务;除非必要,否则避免在 ExecStart 中
sudo -
提供本地模式或静音时段。
组合搭配:像三明治一样自由组合🥪
-
超本地化:Porcupine + whisper.cpp + Piper + 简单规则。私密且稳定。[2][4][5]
-
快速云辅助:Porcupine +(较小的本地 Whisper 或云 ASR)+ 本地 TTS + 云 LLM。
-
家庭自动化中心:添加 Node-RED 或 Home Assistant 流程,用于例程、场景和传感器。
示例技能:通过 MQTT 控制灯光开启💡
import paho.mqtt.client as mqtt MQTT_HOST = "192.168.1.10" TOPIC = "home/livingroom/light/set" def set_light(state: str): client = mqtt.Client() client.connect(MQTT_HOST, 1883, 60) payload = "ON" if state.lower().startswith("on") else "OFF" client.publish(TOPIC, payload, qos=1, retain=False) client.disconnect() # if "turn on the lights" in text: set_light("on")
添加一句语音,比如:“打开客厅的灯”,你就会感觉自己像个魔法师。.
为什么这套技术栈在实践中行之有效🧪
-
Porcupine 在小型电路板上能够高效、准确地检测唤醒词,这使得持续监听成为可能。[2]
-
Whisper 庞大的多语言训练使其能够适应各种环境和口音。[3]
-
whisper.cpp可以让像 Pi 这样的纯 CPU 设备也能利用这种强大的性能。[4] -
Piper 能够保持快速响应,而无需将音频发送到云端 TTS。[5]
太长了,没看完。
构建一个模块化、私有的DIY AI 助手,方法是结合 Porcupine(用于唤醒词)、Whisper(通过whisper.cpp )进行自动语音识别 (ASR)、选择合适的语音处理器进行回复,以及 Piper 进行本地文本转语音 (TTS)。将其封装为 systemd 服务,调整音频,并集成 MQTT 或 HTTP 操作。它的成本比你想象的要低,而且使用起来出奇地令人愉悦。[1][2][3][4][5]
参考
-
树莓派软件与散热– 树莓派镜像工具(下载及使用)和树莓派5主动式散热器产品信息
-
Porcupine唤醒词– SDK及快速入门(关键词、灵敏度、本地推理)
-
Whisper(ASR 模型) ——多语言、强大的 ASR 系统,训练时长约 68 万小时
-
Radford 等人, 《基于大规模弱监督的鲁棒语音识别(Whisper)》:阅读更多
-
-
whisper.cpp – 带有命令行界面和构建步骤的 CPU 友好型 Whisper 推理
-
Piper TTS – 快速、本地化的神经文本转语音系统,支持多种语音/语言