Python全栈项目--手机语音远程控制智能家居系统(含嵌入式控制)
Python全栈项目–手机语音远程控制智能家居系统含嵌入式控制一、项目简介本项目是一个面向智能家居物联网场景的 Python 全栈实战项目。系统支持在手机端网页中点击麦克风输入语音例如说出“打开客厅主灯”“卧室空调温度调到25”“我回来了”前端会调用浏览器 Web Speech API 将语音转换成文字FastAPI 后端完成指令解析、设备匹配、场景联动、日志记录并把控制命令下发给 ESP32/STM32/树莓派等嵌入式控制端。本项目实现了完整移动端语音输入能力和硬件控制链路手机网页语音输入 → Vue 前端 → FastAPI 鉴权接口 → 指令解析 → 设备/场景控制 ↓ 嵌入式命令队列 / HTTP直推 ↓ ESP32/STM32 控制继电器、PWM、红外、窗帘电机项目同时保留完整用户注册、登录、JWT 鉴权、设备管理、场景模式、日志审计功能适合用于课程设计、毕业设计原型和物联网项目二次开发。二、技术栈后端FastAPI、SQLAlchemy、Pydantic、JWT、Passlib数据库SQLite前端Vue 3 Vite手机语音Web Speech APISpeechRecognition / webkitSpeechRecognition嵌入式控制ESP32 Arduino 示例、HTTP 轮询、HTTP 回执、继电器/PWM 控制接口风格RESTful API认证方式OAuth2 Password Form Bearer Token部署方式后端 Uvicorn前端 Vite 开发服务器或静态构建部署三、系统架构手机 / 平板 / PC 浏览器 ├─ 登录/注册页面 ├─ 移动端语音按钮 ├─ 设备管理页面 ├─ 场景与日志页面 └─ 嵌入式命令队列页面 │ HTTP JWT FastAPI 后端 ├─ Auth 认证模块 ├─ Device 设备模块 ├─ Scene 场景模块 ├─ Voice Command 指令解析模块 ├─ Embedded Gateway 命令下发模块 └─ CommandLog 日志模块 │ ORM SQLite 数据库 │ ├─ pollingESP32 定时拉取 pending 命令 └─ http后端直接 POST 到嵌入式网关 endpoint前端负责用户交互、手机语音识别和状态展示后端负责认证、权限控制、语义解析、设备状态变更、场景联动、命令队列和数据持久化嵌入式端负责把后端命令转换成真实硬件动作。四、功能模块1. 用户认证模块用户注册用户登录密码哈希存储JWT token 生成与校验业务接口鉴权保护不同用户的设备、场景、日志互相隔离2. 手机端语音输入模块前端App.vue中封装浏览器语音识别能力constSpeechRecognitionwindow.SpeechRecognition||window.webkitSpeechRecognition recognitionnewSpeechRecognition()recognition.langzh-CNrecognition.continuousfalserecognition.interimResultstruerecognition.onresult(event){consttextArray.from(event.results).map(resultresult[0].transcript).join()voiceText.valuetextconstlastevent.results[event.results.length-1]if(last.isFinal)sendVoice()}用户可以在手机浏览器点击“按住/点击说话”识别结果会自动填入输入框并在最终识别完成后调用后端/api/voice/command。3. 智能设备模块设备不仅保存名称、房间、类型、状态、数值还增加了硬件控制字段字段说明hardware_id嵌入式设备编号例如 relay-light-1hardware_key设备轮询/回执使用的简单密钥protocol下发协议支持 polling、http、mqtt 预留、relayendpointHTTP 直推地址例如 http://192.168.1.50/controllast_command_at最近一次下发控制命令时间支持的设备类型包括灯光、空调、窗帘、插座、风扇、传感器等。4. 语音指令解析模块后端接收语音识别文本后进行规则解析“打开/开启/on” → 开启设备“关闭/关掉/off” → 关闭设备“调到/设置/温度/亮度/开度” 数字 → 设置设备数值精确命中场景口令 → 执行场景动作核心代码逻辑def_detect_action(text:str):normalizedtext.strip().lower()ifany(wordinnormalizedorwordintextforwordin[打开,开启,启动,on]):returnon,Noneifany(wordinnormalizedorwordintextforwordin[关闭,关掉,off]):returnoff,Noneifany(wordintextforwordin[调到,设置,温度,亮度,开度]):numsre.findall(r\d(?:\.\d)?,text)ifnums:returnset,float(nums[0])returnunknown,None5. 嵌入式控制模块后端在设备状态改变时会创建一条EmbeddedCommand记录。命令包含 hardware_id、action、value、payload、status 等字段。payload{command_id:command.id,hardware_id:device.hardware_id,device_name:device.name,room:device.room,type:device.device_type,action:action,status:bool(device.status),value:float(device.valueor0),unit:device.unit,source:source,}下发模式有两种polling 模式ESP32 定时调用后端接口拉取 pending 命令执行后 ack。http 模式后端直接向设备 endpoint POST JSON如果推送失败则保留 pending 队列等待轮询补偿。6. 场景联动模块用户可以创建场景口令例如“我回来了”。当前端提交该口令后后端会匹配场景并批量执行设备动作同时给每个受影响设备生成嵌入式控制命令。7. 日志与网关队列模块command_logs保存用户每次语音/文本指令和执行结果embedded_commands保存每条下发到硬件的命令及状态前端提供“嵌入式下发队列”页面便于查看 pending、sent、ack、failed 状态五、数据库/数据模型设计主要数据表如下表名说明users用户表保存用户名、邮箱和哈希密码devices设备表保存设备名称、类型、房间、状态、数值、硬件绑定信息scenes场景表保存场景名称、描述和触发口令scene_actions场景动作表保存场景与设备动作的关系command_logs指令日志表保存每次语音指令的执行记录embedded_commands嵌入式命令队列表保存待下发、已发送、已确认、失败命令设备模型节选classDevice(Base):__tablename__devicesidColumn(Integer,primary_keyTrue,indexTrue)nameColumn(String(100),nullableFalse)device_typeColumn(String(50),nullableFalse)roomColumn(String(80),nullableFalse)statusColumn(Boolean,defaultFalse)valueColumn(Float,default0)unitColumn(String(20),default)hardware_idColumn(String(80),default)hardware_keyColumn(String(80),default)protocolColumn(String(30),defaultpolling)endpointColumn(String(255),default)last_command_atColumn(DateTime,nullableTrue)owner_idColumn(Integer,ForeignKey(users.id),nullableFalse)六、后端接口设计方法路径说明是否鉴权POST/api/auth/register注册否POST/api/auth/login登录否GET/api/users/me当前用户是GET/api/devices设备列表是POST/api/devices创建设备是PUT/api/devices/{id}更新设备并下发控制命令是DELETE/api/devices/{id}删除设备是POST/api/voice/command执行语音指令是GET/api/scenes场景列表是POST/api/scenes创建场景是GET/api/logs指令日志是GET/api/gateway/commands查看嵌入式命令队列是POST/api/gateway/direct直接按 hardware_id 下发命令是GET/api/embedded/commands/{hardware_id}嵌入式设备轮询命令否使用 hardware_keyPOST/api/embedded/commands/{id}/ack嵌入式设备回执否使用 hardware_key七、前端页面设计前端使用 Vue 3 Vite主要页面区域包括移动端连接设置手机端配置后端局域网 API 地址。登录/注册卡片未登录时显示登录成功后保存 token。手机语音控制台点击麦克风识别语音也支持手动输入。添加设备表单录入设备名、房间、类型、数值单位和硬件参数。设备列表展示设备状态支持开启、关闭、设置数值、删除。场景模式创建场景口令并绑定设备动作。嵌入式下发队列查看命令下发和 ack 状态。指令日志展示最近执行记录。移动端 API 地址不能固定为 127.0.0.1因此api.js根据当前页面 hostname 自动生成默认后端地址constDEFAULT_BASE${window.location.protocol}//${window.location.hostname}:8000/apiconstAPI_BASElocalStorage.getItem(smart_home_api_base)||DEFAULT_BASE如果前后端部署在不同机器可以在页面“移动端连接设置”里手动保存 API 地址。八、嵌入式实现说明项目提供 ESP32 示例project/embedded/esp32_voice_home_controller.ino核心流程ESP32 连接 WiFi ↓ 定时 GET /api/embedded/commands/{hardware_id}?hardware_keyxxx ↓ 解析 actionon/off/set ↓ 控制 GPIO 继电器或 PWM 输出 ↓ POST /api/embedded/commands/{id}/ack 回传执行结果默认硬件映射GPIO26继电器输出可控制灯、插座、电机GPIO27PWM 输出可控制灯光亮度或风扇速度后续扩展方向使用红外 LED 发送空调遥控码使用 RS485/Modbus 控制智能开关面板使用 MQTT 接入 Home Assistant使用设备证书或签名提升安全性使用 HTTPS 或内网穿透支持公网远程控制九、部署与运行步骤1. 运行后端cdproject/backend python3-mvenv .venvsource.venv/bin/activate pipinstall-rrequirements.txt uvicorn app.main:app--reload--host0.0.0.0--port8000后端默认地址http://127.0.0.1:80002. 运行前端cdproject/frontendnpminstallnpmrun dev ----host0.0.0.0电脑访问http://127.0.0.1:5173手机访问http://电脑局域网IP:51733. 配置手机端 API 地址手机打开前端页面后在“移动端连接设置”里填写http://电脑局域网IP:8000/api例如http://192.168.1.8:8000/api4. 使用流程注册账号并登录。点击初始化演示设备或手动添加设备。如果使用 ESP32将代码中的API_BASE、HARDWARE_ID、HARDWARE_KEY改成和设备表一致。手机点击麦克风说“打开客厅主灯”。后端更新数据库状态并生成 embedded command。ESP32 轮询到命令后控制继电器/PWM并回传 ack。前端查看“嵌入式下发队列”和“指令日志”。十、项目总结本项目完整实现了一个“手机端语音输入 Python 后端解析 嵌入式远程控制”的智能家居系统。前端不再只是简单文本框而是加入移动端语音识别和手机访问配置后端不只更新数据库状态还会把控制动作转换成硬件命令队列并支持 ESP32 轮询、回执和 HTTP 直推数据库保存用户、设备、场景、日志和硬件命令形成了完整的全栈业务闭环。该项目可以作为真实智能家居系统的基础版本继续扩展加入大模型意图识别、ASR 云服务、MQTT 网关、Home Assistant、红外空调控制、设备证书、HTTPS、公网远程访问等能力。项目代码下载链接

相关新闻

阿兹特克的黄昏:英格兰3-2逆转墨西哥的战术叙事

阿兹特克的黄昏:英格兰3-2逆转墨西哥的战术叙事

导语 费城林肯金融球场的看台上,一位墨西哥老球迷在终场哨响后久久伫立。他手里攥着一件褪色的1986年墨西哥球衣,上面印着"阿兹特克雄鹰"的字样。四十年前,那支墨西哥队在世界杯上让世界颤抖;四十年后,他的国…

2026/7/7 5:18:07阅读更多 →
自媒体爆款流量的底层逻辑:不是内容好,是匹配用户需求

自媒体爆款流量的底层逻辑:不是内容好,是匹配用户需求

我做自媒体好几年了,发现一个很奇怪的现象,很多人特别努力,天天熬夜写文案、剪视频,细节抠得特别到位,内容看着也很专业,可就是没播放、没互动。反倒一些没怎么精心制作的普通博主,随随便便更新…

2026/7/7 5:18:07阅读更多 →
别再被复杂指标忽悠了:一个让账户扭亏为盈的“极简法则”

别再被复杂指标忽悠了:一个让账户扭亏为盈的“极简法则”

引言:为什么你学得越多,亏得越多?在二级市场折腾这么久,你累吗?每天盯盘到眼红,各种战法、指标学了一大堆,大大小小的消息面一个不落,可回头一看账户,还是在缩水。这种“…

2026/7/7 5:13:07阅读更多 →
Balena Etcher:如何重新定义系统镜像烧录的体验?

Balena Etcher:如何重新定义系统镜像烧录的体验?

Balena Etcher:如何重新定义系统镜像烧录的体验? 【免费下载链接】etcher Flash OS images to SD cards & USB drives, safely and easily. 项目地址: https://gitcode.com/GitHub_Trending/et/etcher 在数字时代,制作系统启动盘曾…

2026/7/7 6:23:15阅读更多 →
CTF实战:从ZIP伪加密识别到时间戳掩码爆破的完整解题思路

CTF实战:从ZIP伪加密识别到时间戳掩码爆破的完整解题思路

1. 项目概述:一次从伪加密到掩码爆破的完整CTF解题之旅最近在复盘一些经典的CTF杂项(MISC)题目,BUUCTF平台上的[GUET-CTF2019]zips这道题给我留下了挺深的印象。它不像那些单纯考脑洞的题目,而是非常扎实地串联了ZIP文…

2026/7/7 6:23:15阅读更多 →
“人机共生,产需共融”,2026世界机器人大会定档8月19日至23日

“人机共生,产需共融”,2026世界机器人大会定档8月19日至23日

7月6日,2026世界机器人大会新闻发布会在北京召开,向全球传递以机器人科技赋能高质量发展、以国际协作共享创新成果的鲜明信号,让机器人更好走进千行百业、服务民生福祉,践行科技向善使命。全国政协常委、致公党中央专职副主席、全…

2026/7/7 6:23:15阅读更多 →
字符串学习笔记

字符串学习笔记

前缀函数:�(�)π(i),以 �i 结尾的最长 border 的长度。求 �π 数组对于已经求出了前 �i 项时,是可以做到找到以 �i 结尾的所有 border。具体的,我们将 &#…

2026/7/7 6:23:15阅读更多 →
C语言调用OpenSSL实现RSA加解密:从原理到实战完整指南

C语言调用OpenSSL实现RSA加解密:从原理到实战完整指南

1. 项目概述:为什么用C和OpenSSL实现RSA?如果你正在学习密码学、网络安全,或者需要在C语言项目中集成非对称加密功能,那么“基于OpenSSL的RSA加解密实现”绝对是一个绕不开的经典练手项目。RSA算法作为非对称加密的基石&#xff0…

2026/7/7 6:23:15阅读更多 →
Balena Etcher终极指南:三步搞定系统启动盘制作,新手也能轻松上手

Balena Etcher终极指南:三步搞定系统启动盘制作,新手也能轻松上手

Balena Etcher终极指南:三步搞定系统启动盘制作,新手也能轻松上手 【免费下载链接】etcher Flash OS images to SD cards & USB drives, safely and easily. 项目地址: https://gitcode.com/GitHub_Trending/et/etcher 你是否曾经为了给树莓派…

2026/7/7 6:18:14阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/7 4:43:43阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/7 2:56:31阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/7 1:03:28阅读更多 →
Acunetix v24.8 深度解析:DAST漏洞扫描器核心原理与DevSecOps实践

Acunetix v24.8 深度解析:DAST漏洞扫描器核心原理与DevSecOps实践

1. 项目概述:Acunetix v24.8 高级版漏洞扫描器深度解析作为一名在网络安全领域摸爬滚打多年的老兵,我深知一款趁手的“兵器”对于安全测试工作意味着什么。今天要聊的,就是Web应用安全测试领域里一个响当当的名字——Acunetix。特别是其v24.8…

2026/7/7 0:02:41阅读更多 →
国产化信创改造:达梦/人大金仓适配与多数据库兼容方案实战(SpringBoot)

国产化信创改造:达梦/人大金仓适配与多数据库兼容方案实战(SpringBoot)

国产化信创改造:达梦/人大金仓适配与多数据库兼容方案实战(SpringBoot) 🌐 演示地址:http://ruoyioffice.com | 📦 源码1GitHub:ruoyi-office | 📦 源码2GitCode:ruoyi-o…

2026/7/7 0:02:41阅读更多 →
CentOS 7/8 SSH 连接失败:5步系统性排错流程与决策树

CentOS 7/8 SSH 连接失败:5步系统性排错流程与决策树

CentOS SSH连接故障排查:从基础检查到深度修复的完整指南引言当你尝试通过Xshell或其他SSH客户端连接CentOS服务器时,突然遭遇"Connection refused"或"Connection timed out"的错误提示,这种经历对任何运维人员或开发者来…

2026/7/7 0:02:41阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/7 5:11:21阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/7 5:11:21阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/7 5:11:21阅读更多 →