告别唤醒词!打造你的专属AI家庭助手:Onju Voice完全部署指南
你是否厌倦了每次与智能音箱交互都必须先说唤醒词?是否担心语音数据被云端处理的隐私问题?本文将带你从零开始构建一个无需唤醒词、本地化运行的AI家庭助手平台——Onju Voice,通过改造20美元的Google Nest Mini硬件,实现真正属于你的智能语音交互体验。
读完本文,你将能够:
- 理解Onju Voice平台的架构与工作原理
- 完成从硬件改造到软件部署的全流程
- 配置本地语音识别与AI响应系统
- 实现智能家居控制、消息处理等实用功能
- 优化语音交互体验,消除唤醒词限制
平台架构概览
Onju Voice是一个模块化的AI家庭助手平台,采用"设备-服务器"架构,主要由三部分组成:
核心组件解析
| 组件 | 功能 | 技术栈 | 位置 |
|---|---|---|---|
| 音频输入 | 采集语音信号 | SPH0645麦克风 | 设备端 |
| 语音活动检测 | 识别说话开始/结束 | webrtcvad算法 | 服务器端 |
| 语音识别 | 音频转文本 | Whisper模型 | 服务器端 |
| 指令处理 | 理解用户意图 | LLM模型(GPT-3.5/4) | 服务器端 |
| 文本转语音 | 生成语音响应 | ElevenLabs API | 服务器端 |
| 音频输出 | 播放响应 | 内置扬声器 | 设备端 |
| 状态指示 | 显示设备状态 | NeoPixel LED | 设备端 |
硬件准备与改造
设备选型
Onju Voice基于Google Nest Mini(2nd gen)改造,选择该设备的原因:
- 价格低廉(二手市场约$20-40)
- 优质的扬声器和麦克风阵列
- 紧凑的设计与良好的声学特性
- 内置静音开关和触摸控制
硬件改造步骤
-
拆解Nest Mini
- 使用塑料撬棒沿边缘小心分离上盖
- 卸下4颗固定螺丝
- 断开电池和主板连接线
-
PCB替换
- 移除原装主板
- 安装Onju Voice定制PCB
- 连接扬声器、麦克风和LED灯带
-
组件焊接
- 焊接ESP32-S3模块
- 连接触摸传感器
- 安装PSRAM芯片
定制PCB可通过PCBWay订购,设计文件位于项目
hardware目录下。
替代方案
如果没有Nest Mini,可使用以下组件搭建原型:
| 组件 | 推荐型号 | 用途 |
|---|---|---|
| 开发板 | ESP32-S3 DevKitC | 主控制器 |
| 麦克风 | Adafruit SPH0645 | 音频输入 |
| 放大器 | PAM8302 | 音频放大 |
| 扬声器 | 1W 4Ω小型扬声器 | 音频输出 |
| LED | NeoPixel RGB灯带 | 状态指示 |
服务器环境搭建
系统要求
- CPU: 4核及以上(推荐Intel i5/Ryzen 5)
- 内存: 8GB RAM(运行Whisper base模型)
- 存储: 至少10GB可用空间
- 操作系统: Ubuntu 20.04+/Windows 10+/macOS 12+
安装步骤
- 克隆代码仓库
git clone https://link.gitcode.com/i/02a42fbdf94f8ff67c6ccd3efb2eb1ad
cd onju-voice/server
- 创建虚拟环境
python -m venv venv
source venv/bin/activate # Linux/macOS
# 或
venv\Scripts\activate # Windows
- 安装依赖
pip install -r requirements.txt
- 安装Whisper
pip install -U openai-whisper
# 安装ffmpeg
sudo apt update && sudo apt install ffmpeg # Linux
# 或
brew install ffmpeg # macOS
配置文件详解
核心配置文件server/config.yaml参数说明:
# 功能模块开关
use_maubot: False # 消息处理模块
use_home_assistant: True # 智能家居控制
use_notes: True # 笔记系统
# LLM配置
llm:
gpt_model: "gpt-3.5-turbo" # 模型选择
max_messages: 15 # 对话历史长度
users_name: "用户" # 用户名
init_prompt: > # 系统提示词
你是用户的友好助手,始终用少于20个词回应...
# 音频处理配置
mic:
chunk: 480 # 音频块大小(30ms)
format: "int16" # 音频格式
rate: 16000 # 采样率
channels: 1 # 声道数
# VAD配置
vad:
window_length: 0.8 # 音频窗口长度(秒)
pre_buffer_length: 1.0 # 前置缓冲长度(秒)
silence_stopping_ratio: 0.2 # 停止录音的静音比例
silence_stopping_time: 1.5 # 静音停止时间(秒)
软件安装与配置
服务器端部署
- 配置凭据
# 复制凭据模板
cp credentials.json.example credentials.json
编辑credentials.json添加必要信息:
{
"openai_api_key": "your_openai_key",
"elevenlabs_api_key": "your_elevenlabs_key",
"home_assistant_url": "http://localhost:8123",
"home_assistant_token": "your_ha_token"
}
- 启动服务器
# 基础启动
python server.py
# 带功能模块启动
python server.py --n --ha --mb --send --whisper base.en
参数说明:
--n: 启用笔记功能--ha: 启用家庭助手集成--mb: 启用消息处理--send: 允许发送消息--whisper: 指定Whisper模型
设备固件烧录
- Arduino IDE设置
- 添加ESP32开发板URL:
https://espressif.github.io/arduino-esp32/package_esp32_index.json - 安装ESP32开发板支持(版本2.0.0+)
- 安装依赖库:
- Adafruit NeoPixel Library
- WiFiManager
- 配置固件
# 进入固件目录
cd onjuino
# 配置WiFi凭据
cp credentials.h.example credentials.h
编辑credentials.h设置WiFi信息:
const char* ssid = "your_wifi_ssid";
const char* password = "your_wifi_password";
- 烧录固件
- 连接ESP32-S3到电脑
- 选择开发板:
ESP32S3 Dev Module - 配置工具选项:
- USB CDC on Boot: Enabled
- PSRAM: OPI PSRAM
- 端口: 选择正确的COM端口
- 点击上传按钮
功能模块详解
语音交互流程
智能家居控制
通过Home Assistant集成控制智能设备:
-
配置Home Assistant
- 安装Home Assistant
- 在配置文件中启用API
- 创建长期访问令牌
-
使用示例
# 控制灯光示例(llm.py)
def control_light(self, device, entity_id, rgb_color=None, brightness=None):
"""控制智能家居灯光"""
data = {}
if rgb_color:
data['rgb_color'] = rgb_color
if brightness:
data['brightness'] = brightness
url = f"{self.ha_url}/api/services/light/turn_on"
headers = {
"Authorization": f"Bearer {self.ha_token}",
"Content-Type": "application/json"
}
response = requests.post(url, headers=headers, json={
"entity_id": entity_id,** data
})
return response.json()
- 语音指令示例
- "把客厅灯调亮"
- "将卧室灯光设为蓝色"
- "关闭所有灯光"
消息处理系统
集成Maubot和Beeper处理消息:
-
配置Maubot
- 安装Maubot服务器
- 部署Onju Voice插件
- 配置Beeper集成
-
消息处理功能
# 消息回复示例(llm.py)
def reply_message(self, device, index, message):
"""回复消息"""
url = f"{self.maubot_url}/reply/{index}"
headers = {
"Content-Type": "application/json"
}
payload = {
"message": message,
"footer": self.footer
}
if self.send_replies:
response = requests.post(url, headers=headers, json=payload)
return response.json()
else:
self.log.info(f"[DRY RUN] 回复消息 #{index}: {message}")
return {"status": "dry_run", "message": message}
笔记系统
快速记录和查询笔记:
-
添加笔记
- 语音指令: "记笔记:明天早上9点开会"
- 自动保存到
notes.json
-
查询笔记
- 语音指令: "我昨天记了什么笔记?"
- LLM自动解析日期并返回相关笔记
-
笔记数据结构
{
"notes": [
{
"id": 1,
"content": "明天早上9点开会",
"timestamp": 1680000000,
"device": "living_room"
}
]
}
高级配置与优化
本地LLM部署
为增强隐私性,可部署本地LLM替代OpenAI API:
- 安装Ollama
curl https://ollama.ai/install.sh | sh
- 下载模型
ollama pull mistral
- 修改配置
# 在config.yaml中设置
llm:
gpt_model: "local"
local_llm_url: "http://localhost:11434/api/generate"
local_model_name: "mistral"
性能优化
- Whisper模型选择
| 模型 | 大小 | 准确率 | 速度 | 推荐场景 |
|---|---|---|---|---|
| tiny.en | 14MB | 低 | 最快 | 资源受限设备 |
| base.en | 39MB | 中 | 快 | 一般用途 |
| small.en | 124MB | 高 | 中等 | 追求平衡 |
| medium.en | 417MB | 很高 | 慢 | 高性能服务器 |
-
网络优化
- 使用5GHz WiFi减少干扰
- 配置QoS确保音频流优先
- 优化UDP缓冲区大小
-
电源管理
- 配置深度睡眠模式
- 调整LED亮度降低功耗
- 设置空闲超时自动关闭
常见问题与解决方案
连接问题
| 问题 | 解决方案 |
|---|---|
| 设备无法连接WiFi | 检查凭据格式,确保使用2.4GHz网络 |
| 服务器找不到设备 | 验证多播设置,检查防火墙规则 |
| 音频断断续续 | 减少WiFi干扰,优化网络带宽 |
语音识别问题
| 问题 | 解决方案 |
|---|---|
| 识别准确率低 | 切换到更大的Whisper模型,减少背景噪音 |
| 频繁误触发 | 调整VAD阈值,增加silence_stopping_time |
| 识别延迟高 | 使用更小的模型,优化服务器性能 |
性能问题
| 问题 | 解决方案 |
|---|---|
| 响应延迟长 | 启用流式处理,优化LLM提示词 |
| 服务器CPU占用高 | 降低Whisper模型复杂度,限制并发连接 |
| 设备发热 | 优化固件,减少不必要的传感器 polling |
使用技巧与最佳实践
日常使用技巧
-
交互方式
- 轻触设备唤醒麦克风(默认超时5分钟)
- 使用静音开关完全禁用录音
- 双击设备播放上次响应
-
指令示例
- "设置客厅温度为24度"
- "明天天气怎么样?"
- "读一下未读消息"
- "添加购物清单:牛奶、鸡蛋"
-
场景模式
- 早晨模式:新闻简报+天气+日程
- 离家模式:关闭灯光+锁门+启动监控
- 睡眠模式:调低音量+夜间响应模式
自定义与扩展
- 自定义LED效果
// 在onjuino.ino中添加
void customLedEffect(int pattern) {
switch(pattern) {
case 0: // 呼吸效果
for(int b=0; b<255; b++) {
setAllLeds(b, 0, 0);
delay(5);
}
// ... 呼吸效果实现
break;
case 1: // 彩虹效果
// ... 彩虹效果实现
break;
}
}
- 添加新功能
- 创建新的Python模块(如
calendar.py) - 实现功能函数(如
get_events()) - 在LLM提示词中添加功能描述
- 更新函数调用定义
- 创建新的Python模块(如
项目扩展与贡献
扩展方向
-
多房间音频同步
- 实现多设备音频同步播放
- 支持立体声和环绕声
-
高级语音识别
- 添加说话人识别
- 支持多语言切换
- 实现自定义命令词
-
本地TTS替代方案
- 集成Coqui TTS
- 训练个性化语音模型
- 实现完全离线语音合成
贡献指南
-
提交代码
- Fork项目仓库
- 创建特性分支:
git checkout -b feature/amazing-feature - 提交更改:
git commit -m 'Add some amazing feature' - 推送分支:
git push origin feature/amazing-feature - 创建Pull Request
-
报告问题
- 使用GitHub Issues跟踪bug
- 提供详细的复现步骤
- 包含系统配置和日志信息
-
改进文档
- 更新README.md
- 添加新功能教程
- 完善API文档
总结与展望
Onju Voice提供了一个灵活、可扩展的AI家庭助手平台,通过改造低成本硬件实现了无唤醒词交互的智能体验。本文详细介绍了从硬件改造到软件部署的全过程,涵盖了核心功能模块和高级配置选项。
未来发展方向:
- 完全离线运行能力
- 多模态交互支持(语音+视觉)
- 增强的隐私保护功能
- 更自然的对话能力
通过不断优化和扩展,Onju Voice有潜力成为商业智能音箱的真正开源替代方案,让用户完全掌控自己的智能家庭助手。
资源与参考
如果觉得本项目有帮助,请点赞、收藏并关注后续更新。下期将介绍如何训练自定义语音模型,实现更个性化的TTS体验。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



