构建一个智能摄像头:捕捉到一个手势以启动对话
如果相机不仅能看见,还能听见、理解并回话,那会怎样?
这个项目正是将reCamera变成了这样。
在后台,reCamera 负责完成所有复杂的协调工作:它在设备上运行 YOLO11n Pose 实时检测您的手势,然后通过 Node-RED 协调完整的 STT → LLM → TTS 流程。而实际的“思考”过程——语音识别、推理和语音合成——则由 iFlytek 云平台通过 WebSocket API 进行处理。
由于reCamera内置麦克风和扬声器,无需电脑、额外开发板,也无需 tethering(数据连接),只需接通电源并连接Wi-Fi,即可获得一个完整且免手动操作的语音交互设备。
关于上方的演示视频:该视频展示了一个早期的概念验证,其中STT和TTS管道被临时卸载到电脑上,以便快速原型开发。本项目走得更远:我已将整个STT → LLM → TTS的流程完全移植到reCamera本身(运行在Node-RED环境中),彻底消除了对电脑的依赖。此外,我还为reCamera的Node-RED环境添加了一个自定义的仪表盘用户界面,使您能够直接通过浏览器实时监控触发状态、系统日志以及API调用结果。
我为何建造它
大多数边缘AI摄像头看东西很好,但沟通能力却很差。它们会将结果显示在屏幕上——如果你站在车间里,双手拿着工具,或浑身油腻,那这种屏幕信息就完全用不上了。
我想要一台会听也会回应的摄像头。不需要键盘,不需要手机应用,也不需要盯着屏幕。只需一个简单的动作(交叉手腕)就能唤醒它,然后就是纯粹的语音交互:你大声提出问题,摄像头就会用语言回答,就像一个有眼睛的智能助手。
在内部,它将敏感功能(如姿势检测)置于边缘,实现即时响应,同时借助云端AI进行复杂的推理和语音处理。但对用户而言,你只感受到一个免提、自给自足的设备,能将任何环境转变为可语音控制的空间——无需电脑。
工作原理(系统架构)
建筑说明:本项目采用“边缘协同 + 云端模型”的分层架构。设备端的 Node-RED 负责手势触发和流程逻辑处理,而 iFlytek 云 API 则负责语音识别、大语言模型推理和语音合成。这种设计有效降低了延迟,并在摄像头端保持了隐私安全,同时避免了本地运行大规模生成模型的必要性。
整个工作流的编排通过 Node-RED 在 reCamera 上运行(无需 PC 服务器)。视觉手势在设备端执行;STT/LLM/TTS 通过 WebSocket 调用 iFlytek 的云 API。
管道概览:
1. 摄像头节点捕获帧 → YOLO11n 估计出17个关键点。
2. 动作判定功能节点计算左腕到右腕的距离与左肩到右肩的距离。当腕部距离小于肩部距离(手腕并拢时),则触发该手势(冷却时间为10秒)。
3. 触发 → 蓝色LED亮起 → `arecord` 记录5秒 → 蓝色LED熄灭。
4. 读取WAV文件并去除44字节的头部信息,以获取原始PCM数据。
5. STT功能节点通过WebSocket将PCM发送至iFlytek,然后返回识别后的文本。
6. LLM功能节点通过WebSocket将文本发送至Spark Lite → 返回简短回复。
7. TTS功能节点启动一个子节点进程,通过WebSocket调用iFlytek TTS → 将响应写入 `/tmp/reply.wav`。
8. `aplay` 通过扬声器播放回复。
入门指南:reCamera上的语音交互
步骤1 — 设置 reCamera
1. 请按照官方reCamera入门指南完成基本配置。
2. 为设备供电并连接到您的网络(与iFlytek云API可访问的同一网络)。
3. 打开浏览器,访问 `http://192.168.42.1`,然后登录 Node-RED 工作区。
步骤2 — 导入预建的Node-RED工作流
此演示提供了一个预配置的工作流(`voice_interaction.json`),其中包含所有节点和连接,包括语音识别(STT)、大语言模型(LLM)和文本转语音(TTS)功能节点。
1. 在 SenseCraft AI 平台上创建一个新应用程序。
2. 下载工作流(或直接从 GitHub 导入 `voice_interaction.json`)。
从 GitHub 仓库下载 voice_interaction.json。
在 reCamera Node-RED 编辑器中,点击菜单(☰)→ 导入 → 剪贴板,粘贴 JSON 内容,然后点击导入。
3. 将其导入 reCamera 的 Node-RED 编辑器。(参见访问 reCamera 预览仪表板。)
如果工作流出现在您的 Node-RED 编辑器中,则导入成功。
步骤3 — 配置工作流参数
导入后,请调整以下参数以匹配您的环境和凭据。
3.1 模型节点 — 姿势模型
模型节点自带多个训练好的模型。在此演示中,请选择 YOLO11n Pose 进行人体姿态检测。
3.2 动作判定 — 手势触发逻辑
“操作决定”功能节点用于确定何时触发语音交互:
•它提取了左肩(关键点5)、右肩(关键点6)、左手腕(关键点9)和右手腕(关键点10)。
•需要四个关键点的置信度都大于0.4,才能避免误报。
•核心逻辑:当两只手腕之间的距离小于两只肩膀之间的距离(手腕并拢时),该手势即被触发。
•10秒的冷却时间可防止在录音和播放过程中重复触发。
你可以编辑此函数节点来更改手势或冷却时间。
3.3 执行节点 — LED 控制与记录
两个 Exec 节点控制蓝色 LED。请将 reCamera 的 `root` 密码更新为与您的设备匹配的密码:
LED 状态:
LED 关闭:
麦克风录音(5秒,16 kHz单声道):
3.4 STT功能节点
“iFlytek STT(WebSocket)”功能节点将原始PCM音频发送至iFlytek IAT API,并返回识别出的文本。打开该节点并填写您的iFlytek凭据:
此节点需要 `ws` 和 `crypto` 库(在节点的设置选项卡中声明)。
完整的STT功能节点代码:
3.5 LLM 功能节点
“iFlytek LLM(WebSocket)”功能节点将识别的文本发送至 Spark Lite,并接收简短的智能回复。请填写相同的 iFlytek 账户信息:
完整LLM功能节点代码:
系统提示默认设置为:“您是部署在智能摄像头reCamera上的语音助手……”(要求回答简短、友好,不超过50个字符)。您可以在代码中的 `system` 消息内编辑此提示,以自定义助手的个性。
3.6 TTS功能节点
“TTS(execSync 子进程)”函数节点会根据LLM的回复生成语音。由于Node-RED沙箱限制了长期WebSocket连接,该节点会将一个小型独立的Node.js脚本写入`/tmp/_tts_runner.js`,并通过`child_process.execSync`来启动它。该脚本:
1. 连接到 iFlytek TTS WebSocket 端点。
2. 发送回复文本。
3. 收集返回的PCM音频数据块。
4. 将它们封装在 WAV 头部(16 kHz,单声道,16 位)中,并写入 `/tmp/reply.wav`。
请在此节点中填写您的 iFlytek 账户信息。此节点需要 `crypto`、`fs` 和 `child_process` 库。
完整TTS功能节点代码:代码章节
步骤4 — 运行演示
1. 点击 Node-RED 中的“部署”以激活工作流。
2. 站在reCamera前面,将手腕对齐(手腕间距小于肩宽)。
3. 蓝色LED灯亮起 → 5秒录音开始。
4. 请将您的问题通过麦克风说出。
5. LED灯关闭 → Node-RED 依次调用云STT → LLM → TTS(设备端编排,模型位于iFlytek云端)→ 回复内容将自动通过扬声器播放。
音符与调音
•每次触发后都会强制执行10秒的冷却时间,以防止在STT → LLM → TTS循环期间重复触发。您可以在“动作判定”功能节点中更改此设置。
•录音时长固定为5秒。如果需要更长或更短的录制时间,请在 `arecord` 执行节点中调整 `-d 5` 参数。
•手势触发需要四个关键点(肩膀 + 手腕)的置信度都大于 0.4。在函数节点中提高此阈值,以减少误报。
•LLM 系统提示符将回复限制在约 50 个中文字符以内,以缩短语音合成处理时间。可根据需要进行调整。
•始终使用正确的 `aplay` 参数(`-f S16_LE -c 1 -r 16000`);否则播放可能会失败。请根据 TTS 输出格式匹配这些参数。
本文编译自hackster.io





