资讯动态

基于SaraKIT实现Home Assistant离线与混合语音控制方案

发布时间:2026/8/20 7:42:29 来源:尧图企业网站定制
1. 项目概述为家庭自动化系统打造离线与混合语音控制中枢如果你和我一样是个家庭自动化Home Assistant 简称HA的重度用户同时又对隐私和响应速度有近乎偏执的要求那么“离线语音控制”这个念头一定在你脑海里盘旋过无数次。市面上的智能音箱固然方便但一言一行都要经过云端处理延迟、隐私泄露风险还有断网时的“人工智障”状态都让人如鲠在喉。今天要聊的这个项目正是为了解决这些痛点而生基于SaraKIT实现HA的离线与混合语音控制。简单来说SaraKIT是一个集成了麦克风阵列、扬声器、处理单元和丰富接口的硬件开发板它就像一个专为语音交互设计的“大脑”。我们这个项目的核心就是让这个“大脑”本地化运行语音识别和语音合成引擎直接与你的HA服务器对话实现对灯光、窗帘、空调等所有智能设备的语音控制。更妙的是我们还可以设计一种“混合模式”——在联网状态下复杂或生僻的指令可以优雅地降级到云端处理一旦网络中断核心的本地指令库依然能保证基础功能的正常运行。这不仅仅是把控制权拿回自己手中更是构建了一个响应更快、更私密、更可靠的智能家居交互入口。无论你是想彻底摆脱对云服务的依赖还是希望打造一个无缝衔接的备用方案这个项目都值得你深入折腾一番。2. 核心架构与方案选型解析2.1 为什么是SaraKIT硬件选型的深层考量选择SaraKIT作为硬件基石绝非偶然。市面上类似的开发板或模组不少比如单纯的USB麦克风搭配树莓派或者一些集成的语音模块。但SaraKIT在智能家居语音控制这个细分场景下展现出了独特的优势。首先集成度与易用性是关键。SaraKIT通常预集成了环形麦克风阵列这对于远场语音拾取至关重要。普通的单麦克风在几米外就容易受到环境噪音干扰而麦克风阵列通过波束成形技术可以像手电筒聚焦光束一样将“收音”的焦点对准声源方向有效抑制其他方向的噪音。这意味着你可以在房间的另一头以正常音量发出指令SaraKIT也能清晰捕获。板载的扬声器驱动和音频接口让我们无需额外连接音响设备就能实现语音反馈开箱即用性极强。其次算力与接口的平衡。SaraKIT的核心处理器通常是性能足够的ARM芯片如全志H系列能够流畅运行轻量级的本地语音识别引擎。同时它提供了GPIO、UART、I2C等接口这意味着未来有极大的扩展空间。例如你可以通过GPIO连接一个物理按钮实现“一键唤醒/休眠”或者通过UART连接其他传感器打造更复杂的联动场景。这种“核心功能集成扩展能力开放”的设计非常适合DIY项目。最后社区与生态支持。一个硬件能否成功其背后的软件和社区活跃度至关重要。SaraKIT通常有较为活跃的开发者社区提供了基础的系统镜像、驱动和示例代码。这大大降低了我们后续部署语音引擎和对接HA的难度。相比之下一些更廉价或更冷门的模块可能需要在驱动层面耗费大量精力对于大多数爱好者而言门槛过高。注意在采购SaraKIT时务必确认其麦克风阵列的型号和芯片方案。不同版本可能在拾音效果和软件兼容性上有差异。建议优先选择社区讨论较多、资料齐全的型号。2.2 离线、在线与混合三种控制模式的战术设计确定了硬件接下来要规划软件层面的作战方案。我们将控制模式分为三类每种都有其适用的场景和实现逻辑。1. 纯离线模式隐私与速度的堡垒这是本项目的核心价值所在。所有语音识别ASR和语音合成TTS都在SaraKIT本地完成。你需要部署一个本地语音识别引擎如Vosk或Coqui STT。Vosk的优势在于模型小巧、资源占用低、支持多种语言并且有Python接口集成起来非常方便。Coqui STT的识别精度可能更高但对算力要求也相应提升。工作流程SaraKIT拾音 - 本地Vosk引擎识别为文本 - 文本在本地通过意图解析脚本如Rasa NLU的轻量版或自定义正则表达式转化为HA可执行的指令如turn_on实体- 通过HA的RESTful API或WebSocket API发送控制命令 - HA执行设备操作 - 需要语音反馈时调用本地TTS引擎如eSpeak或Piper生成音频 - 通过板载扬声器播放。优势零延迟通常500ms、数据完全不出本地网络、断网不影响使用。挑战本地语音模型词汇量有限对于复杂长句或生僻词识别率可能下降意图解析需要预先精心定义。2. 纯在线模式作为能力补充的备选此模式作为对比和备用。SaraKIT仅作为音频输入输出设备将录音流上传至云端语音服务如各大厂商的开放平台获取识别结果后再发送给HA。这本质上和智能音箱方案类似但好处是你可以自由选择云服务商并且控制链路依然经过你自己的HA服务器设备控制权还在自己手里。适用场景处理离线引擎无法识别的复杂查询例如“今天天气怎么样”需要联网获取信息或者作为离线模式识别失败时的降级方案。3. 混合智能模式兼顾体验与可靠的实践这是最具实用价值的模式也是本项目设计的精髓。它需要一个本地调度器我们可以在Python主程序中实现来决策每一条语音指令的处理路径。决策逻辑示例第一步本地唤醒词检测。始终在本地运行一个轻量级的唤醒词检测引擎如Porcupine只有检测到“小萨”、“你好管家”等特定词后才会开始录制后续指令。这能极大节省功耗和避免误触发。第二步本地优先识别。将录制的指令首先送入本地Vosk引擎尝试识别。第三步置信度判断。如果本地识别结果的置信度confidence score高于我们设定的阈值如0.85且意图解析器能明确匹配到一条本地指令例如“打开客厅灯”则直接走本地控制链路。第四步云端降级。如果本地识别置信度低或意图解析器返回“未知指令”则调度器自动将音频数据转发至配置好的云端语音服务进行识别。云端返回的文本再交给HA处理HA可以集成NLP插件来处理更自然的语言。第五步网络回退。在发起云端请求前调度器检查网络连接。如果网络不通则直接以“网络不可用请重试或使用本地指令”进行本地TTS反馈绝不会卡死。优势兼顾了离线模式的快和隐私以及在线模式的理解能力强。用户体验无缝感觉系统始终“聪明可用”。3. 系统搭建与核心组件部署实战3.1 基础环境准备与HA侧配置首先我们需要一个已经运行起来的Home Assistant。假设你的HA已经部署完毕无论是树莓派、虚拟机还是容器。在HA侧我们要做两件事创建长期访问令牌和配置一个用于接收命令的虚拟开关或脚本。获取HA长期访问令牌 登录你的HA前端点击右下角你的用户名滚动到最下方找到“长期访问令牌”部分点击“创建令牌”。为其命名例如“SaraKIT_Voice_Control”。创建后立即复制并妥善保存这个令牌字符串它只会显示一次。这个令牌将用于SaraKIT向HA发送API请求时的身份认证。在HA中创建命令接收器 我们并不直接让SaraKIT的脚本去控制每一个具体的设备那样脚本会过于臃肿且难以维护。更优雅的方式是在HA中创建一个“中间层”。最灵活的方法是使用input_text或rest_command。方法A使用input_text(推荐易于调试)。 在configuration.yaml文件中添加input_text: sara_voice_command: name: Sara Voice Command initial: 重启HA后你会看到一个名为“Sara Voice Command”的文本实体。SaraKIT只需要向HA发送一个服务调用将这个实体的值设置为识别出的文本如“turn_on_light_living_room”。然后我们在HA中使用自动化Automation或Node-RED来监听这个input_text的变化根据其值去执行具体的设备控制。这样做的好处是所有复杂的逻辑判断和设备操作都留在HA这个强大的中枢里SaraKIT只负责“传话”。方法B使用rest_command。 如果你希望SaraKIT直接触发某个特定动作可以在configuration.yaml中定义rest_command: sara_execute: url: http://localhost:8123/api/services/script/{{ command }} method: POST headers: authorization: Bearer {{ YOUR_LONG_LIVED_TOKEN }} content-type: application/json这样SaraKIT可以通过调用rest_command.sara_execute服务并携带参数来触发HA中预定义的脚本script。3.2 SaraKIT系统初始化与语音引擎部署拿到SaraKIT硬件后第一步是刷入一个合适的操作系统。通常社区会提供基于Armbian或定制Linux的镜像。使用工具将镜像写入SD卡插入SaraKIT并上电启动。系统基础配置# 更新系统 sudo apt update sudo apt upgrade -y # 安装必备工具 sudo apt install python3-pip python3-venv git wget -y # 设置Python虚拟环境避免污染系统环境 mkdir ~/sara_voice_assistant cd ~/sara_voice_assistant python3 -m venv venv source venv/bin/activate部署本地语音识别引擎以Vosk为例 Vosk提供了多种语言的小型模型非常适合在资源受限的设备上运行。# 安装Vosk的Python库 pip3 install vosk # 下载中文小模型约40MB wget https://alphacephei.com/vosk/models/vosk-model-small-cn-0.22.zip unzip vosk-model-small-cn-0.22.zip # 你可以将模型移动到合适目录如 ~/models mv vosk-model-small-cn-0.22 ~/models/vosk-model-cn测试一下模型是否能正常工作。创建一个简单的测试脚本test_vosk.pyfrom vosk import Model, KaldiRecognizer import sys import json # 请确保你的麦克风设备索引正确可能是hw:1,0或plughw:1,0需根据arecord -l命令结果调整 import pyaudio model Model(~/models/vosk-model-cn) rec KaldiRecognizer(model, 16000) p pyaudio.PyAudio() stream p.open(formatpyaudio.paInt16, channels1, rate16000, inputTrue, frames_per_buffer8000) stream.start_stream() print(请说话...) while True: data stream.read(4000) if len(data) 0: break if rec.AcceptWaveform(data): result json.loads(rec.Result()) print(识别结果, result.get(text, )) else: partial json.loads(rec.PartialResult()) print(实时结果, partial.get(partial, ))运行前需要安装pyaudiopip3 install pyaudio。如果遇到ALSA相关错误可能需要指定正确的音频设备。部署本地语音合成引擎以Piper为例 Piper是一个高质量的本地TTS引擎声音比传统的eSpeak自然很多。安装稍复杂但值得。# 安装依赖 sudo apt install cmake libsndfile1-dev libssl-dev -y # 克隆Piper仓库并编译 git clone https://github.com/rhasspy/piper.git cd piper mkdir build cd build cmake .. -DCMAKE_BUILD_TYPERelease make -j4 # 下载中文语音模型 wget -O ~/models/zh_CN-xiaoniao-medium.onnx https://huggingface.co/rhasspy/piper-voices/resolve/main/zh/zh_CN/xiaoniao/medium/zh_CN-xiaoniao-medium.onnx wget -O ~/models/zh_CN-xiaoniao-medium.onnx.json https://huggingface.co/rhasspy/piper-voices/resolve/main/zh/zh_CN/xiaoniao/medium/zh_CN-xiaoniao-medium.onnx.json你可以编写一个Python脚本来调用Piper进行合成。3.3 核心桥梁意图解析与HA通信脚本编写这是整个项目的“大脑”负责串联语音识别、意图判断和HA控制。我们将创建一个主程序main.py。程序骨架与配置import json import requests import threading from queue import Queue import sounddevice as sd import numpy as np from vosk import Model, KaldiRecognizer import subprocess import re # 配置文件 HA_URL http://YOUR_HA_IP:8123 HA_TOKEN YOUR_LONG_LIVED_TOKEN VOSK_MODEL_PATH /home/pi/models/vosk-model-cn PIPER_PATH /home/pi/piper/build/piper PIPER_MODEL /home/pi/models/zh_CN-xiaoniao-medium.onnx # 指令映射表本地关键词 - HA操作 COMMAND_MAP { r打开.*客厅.*灯: {entity_id: light.living_room, service: turn_on}, r关闭.*客厅.*灯: {entity_id: light.living_room, service: turn_off}, r客厅.*灯.*调亮: {entity_id: light.living_room, service: turn_on, data: {brightness_pct: 80}}, r今天.*天气: {type: cloud, handler: query_weather}, # 标记为需云端处理 # ... 可以扩展更多指令 } class VoiceAssistant: def __init__(self): self.model Model(VOSK_MODEL_PATH) self.audio_queue Queue() self.is_listening False def listen_loop(self): 持续监听音频放入队列 def audio_callback(indata, frames, time, status): if status: print(f音频流错误{status}) if self.is_listening: self.audio_queue.put(bytes(indata)) with sd.RawInputStream(samplerate16000, blocksize8000, dtypeint16, channels1, callbackaudio_callback): print(监听线程已启动...) while True: sd.sleep(1000) def process_audio(self): 从队列处理音频进行识别 rec KaldiRecognizer(self.model, 16000) while True: data self.audio_queue.get() if rec.AcceptWaveform(data): result json.loads(rec.Result()) text result.get(text, ).strip() if text: print(f识别到指令{text}) self.handle_command(text) else: # 可以处理实时中间结果用于UI反馈 pass def handle_command(self, text): 处理识别出的文本指令 # 1. 本地指令匹配 for pattern, action in COMMAND_MAP.items(): if re.search(pattern, text): if action.get(type) cloud: print(检测到需云端处理的指令尝试联网...) # 这里可以添加云端处理逻辑 self.cloud_fallback(text) else: # 执行本地HA控制 self.call_ha_service(action) return # 2. 本地未匹配尝试云端降级示例 print(本地未匹配指令尝试云端识别...) # 此处可集成在线ASR API如百度、阿里云 # cloud_text self.cloud_asr(audio_data) # self.handle_command(cloud_text) # 递归处理 # 3. 完全未知指令 self.speak(抱歉我没有听懂这个指令。) def call_ha_service(self, action): 调用HA服务 url f{HA_URL}/api/services/{action[domain]}/{action[service]} headers { Authorization: fBearer {HA_TOKEN}, Content-Type: application/json } data {entity_id: action[entity_id]} if data in action: data.update(action[data]) try: resp requests.post(url, headersheaders, jsondata, timeout5) if resp.status_code 200: print(fHA控制成功{action}) self.speak(已执行。) else: print(fHA控制失败{resp.status_code}, {resp.text}) self.speak(操作似乎失败了。) except Exception as e: print(f调用HA API异常{e}) self.speak(网络连接有问题。) def speak(self, text): 使用Piper进行本地TTS cmd [PIPER_PATH, -m, PIPER_MODEL, --output-raw] try: process subprocess.Popen(cmd, stdinsubprocess.PIPE, stdoutsubprocess.PIPE, stderrsubprocess.PIPE) # Piper从stdin读取文本输出原始音频数据到stdout raw_audio, _ process.communicate(inputtext.encode()) # 这里需要将raw_audio通过合适的音频播放接口输出到SaraKIT扬声器 # 例如使用pyaudio或alsa命令aplay -r 22050 -f S16_LE -t raw play_cmd [aplay, -r, 22050, -f, S16_LE, -t, raw] subprocess.run(play_cmd, inputraw_audio, checkTrue) except Exception as e: print(fTTS失败{e}) def cloud_fallback(self, text): 云端降级处理示例如查询天气 # 此处实现调用云端API的逻辑例如查询天气后再通过TTS播报 # 为简化这里直接模拟 print(f模拟云端处理指令{text}) self.speak(今天天气晴朗气温25度。) if __name__ __main__: assistant VoiceAssistant() # 启动监听线程 listen_thread threading.Thread(targetassistant.listen_loop, daemonTrue) listen_thread.start() # 在主线程处理识别 assistant.process_audio()这个脚本提供了一个完整的骨架。它创建了两个线程一个负责不断采集音频数据放入队列另一个负责从队列取出数据用Vosk识别并根据COMMAND_MAP进行匹配和执行。意图解析的优化 上面的例子使用了简单的正则表达式匹配这对于固定句式是有效的。但对于更自然的语言如“能把客厅的灯弄亮一点吗”正则表达式就会很吃力。这里有两个升级方向使用Rasa NLU本地可以在SaraKIT上部署一个轻量级的Rasa NLU服务它能够进行更强大的意图识别和实体提取。但这会消耗更多资源。利用HA的NLP集成如果采用混合模式可以将未匹配的文本直接发送给HA。HA社区有一些NLP集成如OpenAI Conversation或Rasa Conversation它们能更好地理解自然语言并返回需要执行的服务调用。这样SaraKIT的本地部分只做简单的关键词过滤复杂理解交给HA中枢架构更清晰。4. 混合模式调度器与网络状态感知实现混合模式的核心在于一个智能的调度器。我们需要增强VoiceAssistant类使其具备网络状态判断和决策能力。网络状态检测import socket import time class NetworkChecker: def __init__(self, test_host8.8.8.8, test_port53, timeout3): self.test_host test_host self.test_port test_port self.timeout timeout self._is_online False def check(self): 检查网络是否连通 try: socket.setdefaulttimeout(self.timeout) socket.socket(socket.AF_INET, socket.SOCK_STREAM).connect((self.test_host, self.test_port)) self._is_online True return True except socket.error: self._is_online False return False def is_online(self): return self._is_online # 在主程序中初始化 network_checker NetworkChecker() # 可以定时检查例如每30秒一次 def network_monitor(): while True: network_checker.check() time.sleep(30)增强型指令处理逻辑 修改handle_command方法融入网络状态和置信度判断。def handle_command(self, text, confidence0.9): # confidence来自Vosk识别结果 # 规则1高置信度且匹配本地指令 - 本地执行 for pattern, action in COMMAND_MAP.items(): if re.search(pattern, text) and confidence 0.85: if action.get(type) cloud: # 规则2标记为云端的指令检查网络 if network_checker.is_online(): self.cloud_fallback(text) else: self.speak(此功能需要网络当前网络不可用。) else: self.call_ha_service(action) return # 规则3低置信度或未匹配但网络良好 - 尝试云端ASR if confidence 0.85 and network_checker.is_online(): print(f本地识别置信度低({confidence})尝试云端重识别...) # 这里调用云端ASR API获取新的文本和置信度 # cloud_text, cloud_confidence self.call_cloud_asr(original_audio) # 然后递归调用 self.handle_command(cloud_text, cloud_confidence) # 为示例我们直接模拟 self.speak(让我再想想...) return # 规则4其他所有情况网络差且本地不识别的指令 self.speak(我没听清请再说一遍。)这个逻辑确保了网络好时系统能力最强网络差时核心功能不受影响识别不确定时有补救机制。5. 性能调优、问题排查与进阶玩法5.1 性能调优与稳定性保障在资源有限的嵌入式设备上运行完整的语音流水线优化至关重要。音频设备与参数调优 SaraKIT的麦克风阵列可能需要特定的ALSA配置。使用arecord -l和aplay -l查看设备列表。你可能会发现设备名称为hw:1,0或plughw:1,0。在Python的sounddevice或pyaudio中需要指定正确的设备索引。排查麦克风无声先用arecord -D plughw:1,0 -f cd -d 5 test.wav命令测试录音再用aplay test.wav播放。确保硬件和基础驱动正常。降低采样率与精度对于语音识别16kHz采样率、16位深、单声道已足够。更高的设置只会增加处理负担。在sounddevice或pyaudio初始化时明确指定这些参数。Vosk模型选择与优化 Vosk提供不同大小的模型。vosk-model-small-cn-0.22约40MB适合树莓派3B或同级设备。如果你的SaraKIT性能更强如基于RK3566可以尝试vosk-model-cn-0.22约1.1GB以获得更好的识别率。在内存有限的设备上务必使用小模型。启用Vosk的流式识别我们示例中使用的AcceptWaveform就是流式识别它允许持续喂入音频数据适合实时交互。避免使用一次性识别整个长音频文件的方法。进程管理与看门狗 长时间运行的程序可能因为内存泄漏或未知异常而挂起。建议使用系统服务systemd来管理主程序并添加一个简单的“看门狗”逻辑。创建systemd服务创建文件/etc/systemd/system/sara-voice.service。[Unit] DescriptionSaraKIT Voice Assistant Afternetwork.target sound.target [Service] Typesimple Userpi WorkingDirectory/home/pi/sara_voice_assistant EnvironmentPATH/home/pi/sara_voice_assistant/venv/bin ExecStart/home/pi/sara_voice_assistant/venv/bin/python /home/pi/sara_voice_assistant/main.py Restartalways RestartSec10 [Install] WantedBymulti-user.target然后使用sudo systemctl enable --now sara-voice使其开机自启并立即运行。简易看门狗在主程序中可以创建一个定时器线程定期如每5分钟向一个日志文件写入心跳时间戳。再编写一个单独的脚本或使用systemd的Restart机制来检测心跳是否超时。5.2 常见问题与排查实录在部署过程中你几乎一定会遇到以下问题。这里是我的排查笔记问题现象可能原因排查步骤与解决方案运行后无任何声音程序也不报错1. 音频设备索引错误。2. ALSA配置冲突或被其他进程占用。3. 麦克风硬件开关未打开或损坏。1. 执行python3 -m sounddevice查看可用设备列表在代码中尝试不同的设备索引。2. 运行sudo fuser -v /dev/snd/*查看哪个进程占用了声卡必要时终止冲突进程如pulseaudio。3. 使用alsamixer命令确保麦克风通道未被静音MM表示静音按M键解除并调高音量。Vosk识别率极低全是乱码1. 音频格式不匹配采样率、位深。2. 麦克风输入音量过大或过小导致音频失真或信噪比太低。3. 模型语言不匹配用了英文模型识别中文。1. 确保代码中KaldiRecognizer的采样率与音频流采样率完全一致都是16000。2. 用arecord录制一段标准语音用aplay回放听是否清晰。在alsamixer中调整“Capture”音量到适中水平通常70-80%。3. 确认下载和加载的是中文模型vosk-model-small-cn-0.22。调用HA API总是返回401或403错误1. 长期访问令牌错误或已失效。2. HA的URL地址或端口错误。3. HA配置了IP访问限制。1. 在HA中重新生成令牌并确保代码中HA_TOKEN变量填写正确注意不要有多余空格。2. 尝试在SaraKIT上用curl命令测试curl -X GET -H Authorization: Bearer YOUR_TOKEN http://YOUR_HA_IP:8123/api/应该返回HA的欢迎信息。3. 检查HA的configuration.yaml中http:模块是否限制了trusted_proxies或ip_ban_enabled。程序运行一段时间后卡死或无响应1. 内存泄漏特别是频繁创建识别器实例。2. 音频队列堵塞。3. 网络请求超时未设置导致线程阻塞。1. 确保KaldiRecognizer实例只创建一次并在循环中重复使用AcceptWaveform。2. 检查audio_queue的put和get操作是否平衡考虑设置队列最大长度。3. 所有网络请求如requests.post必须设置timeout参数如5秒并使用try-except捕获异常。混合模式下云端回退从未触发1. 网络检查逻辑有误始终返回True。2. 本地正则表达式过于宽松匹配了本该云端处理的指令。3. 云端ASR API调用失败但未处理异常。1. 在NetworkChecker.check()中加入日志打印每次检查的结果。尝试ping一个不存在的地址来测试失败情况。2. 优化COMMAND_MAP中的正则表达式使其更精确。对于明确需要云端的指令可以降低其匹配优先级或增加特殊前缀。3. 在cloud_fallback函数中详细记录云端API的请求和响应日志。5.3 进阶扩展与场景深化当基础功能稳定后你可以考虑以下进阶玩法让这个系统更智能、更融合声纹识别与多用户个性化 集成Resemblyzer或Pyannote-audio等库实现简单的声纹识别。在唤醒后系统可以判断当前说话人是谁进而调用该用户在HA中的个性化场景。例如爸爸说“我回家了”系统执行打开客厅灯、播放新闻的场景妈妈说同样的话则执行打开氛围灯、播放轻音乐的场景。本地唤醒词引擎集成 使用Porcupine或Snowboy已停止维护但仍有可用模型替代持续全时监听。让SaraKIT在休眠状态下只运行一个低功耗的唤醒词检测线程当听到“小萨小萨”时再激活完整的语音识别流程可以大幅降低CPU占用和误触发率。与HA的深度双向交互 目前主要是语音控制HA。反过来也可以让HA主动通过SaraKIT进行语音播报。在HA中创建一个script或automation当特定事件发生时如传感器报警、定时提醒调用SaraKIT上运行的一个简易HTTP服务接口触发TTS播报。这需要你在SaraKIT上再用Flask或FastAPI写一个简单的接收端。分布式麦克风阵列 如果单个SaraKIT无法覆盖全屋可以考虑部署多个。让它们都连接到同一个MQTT Broker。其中一个作为主节点处理识别和逻辑其他节点只负责拾音并通过MQTT将音频流或识别结果转发给主节点。这样可以实现全屋的无死角语音覆盖。这个项目的魅力在于它从一个具体的需求点出发逐渐演变成一个可深可浅、极具探索空间的系统工程。从最基础的离线命令控制到混合智能决策再到与智能家居生态的深度结合每一步都充满了动手的乐趣和解决问题的成就感。最重要的是你最终获得了一个完全受控于自己、响应迅速且保护隐私的语音交互入口这才是智能家居本该有的样子。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价