完全本地语音助手搭建指南
摘要
基于树莓派和Platypush搭建完全本地语音助手指南,涵盖热词检测、语音转文字、文字转语音以及家庭自动化集成。
<p><a href="https://lobste.rs/s/luosjw/fully_local_voice_assistant_setup">评论</a></p>
查看缓存全文
缓存时间: 2026/06/23 03:41
# 在2026年构建一个完全本地的语音助手
来源:https://blog.platypush.tech/article/Local-voice-assistant
### 一个基于 Platypush 的、适合树莓派的实用语音助手搭建方案
- 流水线 (https://blog.platypush.tech/article/Local-voice-assistant#the-pipeline)
- 环境准备 (https://blog.platypush.tech/article/Local-voice-assistant#setup)- 模型 (https://blog.platypush.tech/article/Local-voice-assistant#models)- 唤醒词检测 (https://blog.platypush.tech/article/Local-voice-assistant#hotword-detection) - 语音转文字 (https://blog.platypush.tech/article/Local-voice-assistant#speech-to-text) - 文字转语音 (https://blog.platypush.tech/article/Local-voice-assistant#text-to-speech) - 配置 (https://blog.platypush.tech/article/Local-voice-assistant#configuration)- 智能家居插件 (https://blog.platypush.tech/article/Local-voice-assistant#home-automation-plugins)
- 构建 (https://blog.platypush.tech/article/Local-voice-assistant#build)
- 运行 (https://blog.platypush.tech/article/Local-voice-assistant#run)- Linux (https://blog.platypush.tech/article/Local-voice-assistant#linux) - macOS (https://blog.platypush.tech/article/Local-voice-assistant#macos) - Windows (https://blog.platypush.tech/article/Local-voice-assistant#windows)
- 使用 (https://blog.platypush.tech/article/Local-voice-assistant#usage)
- 扩展助手 (https://blog.platypush.tech/article/Local-voice-assistant#extending-the-assistant)- 开始对话 (https://blog.platypush.tech/article/Local-voice-assistant#starting-a-conversation) - 确定性命令 (https://blog.platypush.tech/article/Local-voice-assistant#deterministic-commands) - AI 命令 (https://blog.platypush.tech/article/Local-voice-assistant#ai-commands)- 语音转意图 (https://blog.platypush.tech/article/Local-voice-assistant#speech-to-intent) - 回退响应 (https://blog.platypush.tech/article/Local-voice-assistant#response-fallback) - 聆听时暂停音乐 (https://blog.platypush.tech/article/Local-voice-assistant#pausing-music-while-listening)
- 完全本地化 (https://blog.platypush.tech/article/Local-voice-assistant#going-fully-local)
- 为何这套架构经久不衰 (https://blog.platypush.tech/article/Local-voice-assistant#why-this-architecture-ages-well)
- 最后的话 (https://blog.platypush.tech/article/Local-voice-assistant#final-notes)
关注我一段时间的朋友都知道,我对自建语音助手有一种执念。
多年来我的实验可以总结如下:
- *2007年*: Voxifera (https://github.com/blacklight/voxifera),我首次尝试构建一个原始的语音助手,基于隐马尔可夫模型 (https://en.wikipedia.org/wiki/Hidden_Markov_model)。当然不适合通用场景,但在2007年足以区分十几个简单的语音命令。
- *2019年*: 第一个语音助手 (https://blog.platypush.tech/article/Build-your-customizable-voice-assistant-with-Platypush),基于 Platypush (https://platypush.tech/) 构建。它在树莓派上使用现已废弃的 Google Assistant Library (https://developers.google.com/assistant/sdk/guides/library/python/),配合麦克风和扬声器,通过事件钩子可接入任何自动化例程和自定义命令。
- *2020年*: 第二次迭代 (https://blog.platypush.tech/article/Build-custom-voice-assistants) 基于 #Platypush (https://blog.platypush.tech/tags/platypush),这次还支持了其他助手插件——Alexa(集成已移除)、Snowboy(因项目已死而移除)、Mozilla DeepSpeech(因 Mozilla 停止维护而移除)、PicoVoice,以及 mimic3(基于 Mycroft 的文本转语音引擎,Mycroft 现已破产)。
- *2024年*: 第三次迭代 (https://blog.platypush.tech/article/The-state-of-voice-assistant-integrations-in-2024) 基于 Platypush,这次增强了 PicoVoice 集成,并新增了基于 OpenAI API 的语音转文字和文字转语音插件。
但现在是2026年,或许硬件和软件都已足够成熟,可以构建完全基于设备的语音助手,且采用可能长期存在的完全开源方案。
在本文中,我们将用 Platypush 来填补最后一块拼图:
- `assistant.openwakeword` (https://docs.platypush.tech/platypush/plugins/assistant.openwakeword.html) 本地监听唤醒词。
- `assistant.vosk` (https://docs.platypush.tech/platypush/plugins/assistant.vosk.html) 本地转录命令。
- `tts.piper` (https://docs.platypush.tech/platypush/plugins/tts.piper.html) 本地播报回答。
- `openai` (https://docs.platypush.tech/platypush/plugins/openai.html) 仅在语言模型有用时才使用:将杂乱的语音转化为意图,或回答一般性问题。
- 现有的智能家居插件,如 `light.hue` (https://docs.platypush.tech/platypush/plugins/light.hue.html)、`music.mpd` (https://docs.platypush.tech/platypush/plugins/music.mpd.html) 或 `weather.openweathermap` (https://docs.platypush.tech/platypush/plugins/weather.openweathermap.html),用于执行动作。
结果并不是另一个换皮的云助手。唤醒词引擎、语音识别、命令分发和语音合成都可以在设备上运行。如果 `openai` 步骤指向本地的 OpenAI 兼容服务器,那么整个流水线也可以留在你的局域网内。
## 流水线
架构可以总结如下:
监听
触发
唤醒词已检测
触发
语音已识别
短语匹配本地命令
普通响应
文字转语音
文字转语音
处理意图
播放语音响应
后续追问
对话结束
对话结束
麦克风
assistant.openwakeword
HotwordDetectedEvent
assistant.vosk.start_conversation
ConversationStartEvent
SpeechRecognizedEvent
本地命令钩子
openai.get_response
tts.piper
扬声器
ConversationEndEvent
监听
触发
唤醒词已检测
触发
语音已识别
短语匹配本地命令
普通响应
文字转语音
文字转语音
处理意图
播放语音响应
后续追问
对话结束
对话结束
麦克风
assistant.openwakeword
HotwordDetectedEvent
assistant.vosk.start_conversation
ConversationStartEvent
SpeechRecognizedEvent
本地命令钩子
openai.get_response
tts.piper
扬声器
ConversationEndEvent
**唤醒词检测**(“OK Google”、“Alexa”等)是一个持续、低延迟的工作负载,不需要网络。
**语音转文字**也很适合本地推理:Vosk 模型足够小,可以在包括树莓派在内的中等硬件上运行,对于短小的智能家居命令完全够用。
**文字转语音**是另一个当今本地模型已经足够好的领域:Piper 声音库快速、小巧,而且比老旧的机器人式 `espeak` 回退方案好得多。
唯一可选的需要网络的部分是**语言模型**。
但这是一种策略选择,而非语音栈的硬性要求。
## 环境准备
克隆助手示例仓库:
``
git clone https://git.platypush.tech/platypush/assistant-sample
cd assistant-sample
``
### 模型
下一步是下载语音栈所需的语音模型。
#### 唤醒词检测
服务首次启动时,会自动下载所有可用模型。
之后,你可以使用以下命令列出可用的模型(当服务运行时):
``
curl -s -XPOST \
-H 'Content-type: application/json' \
-H "Authorization: Bearer $PLATYPUSH_TOKEN" \
-d '{"type":"request", "action":"assistant.openwakeword.list_models"}' \
http://localhost:8008/execute
``
其中 `$PLATYPUSH_TOKEN` 是运行服务的用户的令牌。
你可以在服务首次启动时访问 `http://localhost:8008` 获取令牌。创建凭证,然后选择 *设置* -> *令牌* -> *生成 API 令牌*。
#### 语音转文字
Vosk 语音模型的完整列表在此处 (https://alphacephei.com/vosk/models)。
关于英语模型质量的一些反馈:
模型大小备注`vosk-model-small-en-us-0.15` (https://alphacephei.com/vosk/models/vosk-model-small-en-us-0.15.zip)40 MB非常快速且轻量的模型,甚至在老树莓派上也能运行,但准确性可能较低。`vosk-model-en-us-0.22-lgraph` (https://alphacephei.com/vosk/models/vosk-model-en-us-0.22-lgraph.zip)128 MB对于清晰的母语者语音相当准确,但体积足够小,即使在树莓派上也能流畅运行。`vosk-model-en-us-0.22` (https://alphacephei.com/vosk/models/vosk-model-en-us-0.22.zip)1.8 GB准确的通用美式英语模型。在笔记本电脑或 x86 处理器上很快,但在树莓派上可能有点重。将选中的模型下载到 Docker 卷工作目录:
``
mkdir -p ./workdir/assistant.vosk/models
cd ./workdir/assistant.vosk/models
wget "https://alphacephei.com/vosk/models/vosk-model-en-us-0.22-lgraph.zip"
unzip "vosk-model-en-us-0.22-lgraph.zip"
rm "vosk-model-en-us-0.22-lgraph.zip"
``
#### 文字转语音
从此处 (https://rhasspy.github.io/piper-samples/) 下载语音合成模型。
音频样本也可获取,以便在下载前了解声音类型。
模型通常包含一个 `*.onnx` 文件和一个 `*.onnx.json` 文件。将这两个文件下载到 Docker 卷工作目录:
``
mkdir -p ./workdir/piper_tts
cd ./workdir/piper_tts
wget "https://huggingface.co/rhasspy/piper-voices/resolve/main/en/en_US/hfc_female/medium/en_US-hfc_female-medium.onnx"
wget "https://huggingface.co/rhasspy/piper-voices/resolve/main/en/en_US/hfc_female/medium/en_US-hfc_female-medium.onnx.json"
``
### 配置
复制并编辑示例配置文件 (https://git.platypush.tech/platypush/assistant-sample/src/branch/main/config/config.example.yaml)。
``
cp config/config.example.yaml config/config.yaml
``
#### 智能家居插件
当识别的语音能够到达家中其他设备时,助手才真正有用。
例如,Hue 灯:
``
light.hue:
bridge: hue
groups:
- Living Room
``
以及 MPD/Mopidy 用于音乐:
``
music.mopidy:
host: localhost
music.mpd:
host: localhost
poll_interval: null
``
这些只是普通的 Platypush 插件 (https://docs.platypush.tech/plugins.html)。
助手不需要特别了解 Hue、MPD、Chromecast、Zigbee、MQTT 或其他任何东西。
它只需要发出事件;你的钩子来决定如何处理它们。
构建助手服务的容器镜像:
``
docker build -t platypush-voice .
``
## 运行
助手需要访问主机的麦克风和扬声器。容器通过 PulseAudio 路由 ALSA,因此下面的示例将其连接到主机上运行的 PulseAudio 服务器。
### Linux
安装了 PulseAudio 或 `pipewire-pulseaudio` 的情况下:
``
docker run --rm \
-e PULSE_SERVER=unix:/run/pulse/native \
-v /run/user/$(id -u)/pulse/native:/run/pulse/native \
--name voice-assistant \
-p 8008:8008 \
-v ./config:/etc/platypush \
-v ./workdir:/var/lib/platypush \
platypush-voice
``
### macOS
在主机上安装并启动 PulseAudio:
``
brew install pulseaudio
pulseaudio --daemonize=yes --exit-idle-time=-1
pactl load-module module-native-protocol-tcp \
auth-anonymous=1 \
listen=0.0.0.0 \
port=4713
``
然后启动容器:
``
docker run --rm \
-e PULSE_SERVER=tcp:host.docker.internal:4713 \
--name voice-assistant \
-p 8008:8008 \
-v "$(pwd)/config:/etc/platypush" \
-v "$(pwd)/workdir:/var/lib/platypush" \
platypush-voice
``
如果 `pactl load-module` 报告模块已加载,你可以继续使用现有的 PulseAudio 守护进程。
### Windows
为 Windows 安装 PulseAudio,然后在 `pulseaudio.exe` 所在目录创建一个 `default.pa` 文件:
``
load-module module-waveout sink_name=output source_name=input record=1
load-module module-native-protocol-tcp auth-anonymous=1 listen=0.0.0.0 port=4713
set-default-sink output
set-default-source input
``
从 PowerShell 启动 PulseAudio:
``
.\pulseaudio.exe -F .\default.pa --exit-idle-time=-1
``
然后从仓库目录启动容器:
``
docker run --rm `
-e PULSE_SERVER=tcp:host.docker.internal:4713 `
--name voice-assistant `
-p 8008:8008 `
-v "${PWD}/config:/etc/platypush" `
-v "${PWD}/workdir:/var/lib/platypush" `
platypush-voice
``
确保在 Windows 隐私设置中为桌面应用启用了麦克风访问,如果提示,请允许 PulseAudio 通过防火墙。
## 使用
一旦服务运行,你就可以通过语音命令与之交互(默认激活词是“Alexa”)。
如果启用了天气插件,有关天气的任何问题将由天气插件解析。
如果启用了音乐或灯光插件,则可以通过语音命令控制它们(“停止音乐”、“打开灯”等)。
否则,助手将使用 `openai` 插件来回答你的问题,当 OpenAI 的响应也是一个问题时,会进行后续轮次。
## 扩展助手
助手逻辑通过 `config/scripts` (https://git.platypush.tech/platypush/assistant-sample/src/branch/main/config/scripts) 下的简单 Platypush 钩子建模。
你可以通过定义自己的钩子或修改现有钩子来随意扩展它。
### 开始对话
通过钩住 `HotwordDetectedEvent` (https://docs.platypush.tech/platypush/events/assistant.html#platypush.message.event.assistant.HotwordDetectedEvent) 开始对话。
``
import logging
from platypush import run, when
from platypush.events.assistant import HotwordDetectedEvent
logger = logging.getLogger(__name__)
ai_plugin = "openai"
assistant_plugin = "assistant.vosk"
@when(HotwordDetectedEvent)
def on_hotword_detected(event: HotwordDetectedEvent):
"""
当检测到唤醒词时,开始一段对话。
"""
logger.info(f"检测到唤醒词 {event.hotword}")
run(f"{assistant_plugin}.start_conversation")
``
### 确定性命令
对于常见的智能家居命令,常规事件钩子仍然是最佳工具。它们速度快、可检查、而且不会产生幻觉。
``
from platypush import run, when
from platypush.events.assistant import SpeechRecognizedEvent
@when(SpeechRecognizedEvent, phrase="turn on (the)? lights")
def turn_on_lights():
"""
当用户说“turn on the lights”(正则表达式)时运行的钩子
"""
run("light.hue.on")
@when(SpeechRecognizedEvent, phrase="play (the)? music")
def play_music():
"""
当用户说“play the music”(正则表达式)时运行的钩子
"""
run("music.mpd.play")
@when(SpeechRecognizedEvent, phrase="set the music volume (to|on|at) ${volume}")
def set_volume(volume: int):
"""
当用户说“set the music volume to ${volume}”(含参数的正则表达式)时运行的钩子
"""
run("music.mpd.set_volume", volume=volume)
``
### AI 命令
如果启用了 `openai` (https://docs.platypush.tech/platypush/plugins/openai.html) 插件,你可以使用它来帮助回答问题。
语音助手有两个通用用例中 AI 插件是有益的:
- **语音转意图**
- **回退响应**
#### 语音转意图
你可能需要这个来处理一般性问题、不适合整洁正则表达式的命令,或者将原始句子(例如:
> 调暗一点并降低音乐音量
)转换为结构化的动作计划,比如:
``
[
{
"action": "light.hue.set_lights",
"args": {
"bri": 50
}
},
{
"action": "music.mpd.set_volume",
"args": {
"volume": 20
}
}
]
``
助手示例中提供了一个天气预报 (https://git.platypush.tech/platypush/assistant-sample/src/branch/main/config/sc) 的例子。
相似文章
正如承诺,这是我的100%本地语音到语音助手的GitHub链接
Athena 是一款完全离线、隐私优先的语音助手,完全运行在本地硬件上,结合了多种AI模型用于语音识别、语言理解和情感感知语音合成,具备长期记忆和可中断性。
构建了一个JARVIS风格的助手:具备唤醒词、视觉模式、本地语音克隆和LLM生成的系统命令
一位开发者构建了一个名为CYBER的JARVIS风格个人助手,具备唤醒词激活、通过XTTS v2的本地语音克隆、视觉模式以及LLM生成的系统命令,全部在本地运行,无需云端依赖。
Pine64推出面向Home Assistant爱好者的50美元智能音箱
Pine64推出了PineVoice,一款面向Home Assistant爱好者的50美元RISC-V智能音箱,采用开源固件并通过Wyoming协议实现本地语音控制。
我正用Go从头构建一个本地AI桌面助手
作者正用Go编程语言从头构建一个本地AI桌面助手。
打造了一个本地AI助手,因为我一直知道这一天会到来,而昨天让它变得无比真实
一位开发者构建了Bantz,一个完全本地的AI个人助手,运行在Gemma 4b上,具有管家角色,集成了Gmail、日历、网页搜索、系统监控和桌面控制,强调不依赖云基础设施。