构建一个可适应的机器人
NOVA 的诞生源于一个简单的问题:技术是否可以适应人类,而不是总要求人类去适应技术?
儿童并不总是用语言表达自己的需求。他们可能会分心、感到沮丧,或在无法清晰传达当前情况时难以继续对话。这一点在为患有注意力缺陷多动障碍(ADHD)、自闭症或唐氏综合征等特殊儿童设计技术时尤为重要,因为这些儿童可能需要个性化的沟通与互动方式。
这一理念成为 NOVA 的基础:NOVA 是一款可适应性的社会机器人,旨在倾听、交流、观察并做出相应调整。
什么是 NOVA?
NOVA 由三个相互协作的系统构成,每个系统都有明确的职责分工。
NOVA 手持设备基于 Arduino Nano ESP32 构建,是用户直接交互的部分。它包含一个 ILI9341 触摸屏、一个 INMP441 I2S MEMS 麦克风,以及用于对话、游戏、设置和其他功能的接口。
Arduino Uno Q 作为设备上的主要处理单元。其 Linux 环境运行 NOVA 语音服务器(FastAPI,端口 5000),并负责语音转文字、文字转语音生成、自适应行为追踪以及计算机视觉任务。
NOVA 语言服务器是一个独立的 FastAPI 服务,托管对话逻辑。它在本地运行 Ollama,并使用 llama3.1:8b 模型生成 NOVA 的回复。该服务通过与语音服务器不同的本地网络地址和端口(:8000/chat)与 Uno Q 通信(:5000)。这种分离是因为语言模型推理比语音和视觉处理资源消耗大得多,因此隔离可确保 Uno Q 能够实时响应交互。
另外,一个 AI-Thinker ESP32-CAM 提供 NOVA 计算机视觉系统所需的视觉输入。
整体架构可以总结为:
当需要视觉反馈时:
NOVA 接口
手机触摸屏分为四个界面,所有界面采用相同的视觉风格,并通过底部或侧边菜单进行导航。
主屏幕
主屏幕显示NOVA的动画头像——一个简单的机器人面孔,其表情(开心、悲伤/愤怒或中性)会反映视觉系统当前检测到的情绪,同时显示当前的通信等级。这是用户闲置时默认看到的界面,也是NOVA无活动提醒出现的地方。
聊天界面
聊天界面是用户与NOVA交流的地方,可通过输入文字或按按钮录制语音消息进行对话。该界面会显示对话历史记录——用户的留言和NOVA的文字回复,同时通过连接至Uno Q的扬声器播放NOVA语音回复的声音。
游戏界面
游戏界面提供一个菜单,包含两个认知小游戏:记忆游戏(寻找匹配的卡片对)和反应游戏(在颜色变化时尽可能快速地点击)。每个游戏界面都会显示当前得分、尝试次数(记忆游戏)或反应时间(反应游戏),以及当前的难度级别。
设置界面
设置界面提供了NOVA自适应状态的透明视图。它以进度条的形式显示当前的LLM通信等级、当前游戏等级以及全球自适应得分(0–100),并附有标签提示难度即将增加、降低或保持稳定。同时,还会显示每款游戏的详细统计数据:已玩游戏数量、最高分和平均分或反应时间。
NOVA手机的构建
该手机基于Arduino Nano ESP32进行设计。
ILI9341 TFT触摸屏提供图形界面,用户可通过该界面在聊天、游戏、设置等系统功能之间进行切换。
语音输入由通过I2S连接的INMP441数字MEMS麦克风提供。麦克风由3.3V供电,并连接至Nano ESP32板的以下引脚:
麦克风被配置为16kHz I2S输入,读取32位采样数据(INMP441输出的24位数据在32位帧内以MSB对齐方式传输),随后经过缩放处理,转换为带饱和的有符号16位PCM格式。录制的采样数据会被组合成WAV文件,再发送至Uno Q。
该手机本身不执行任何语音识别、语言处理或文本转语音功能。它捕捉音频、进行封装、发送到服务器,并将结果显示给用户。这种职责分工使手机保持轻量化,适合小型嵌入式外形设计。
设备之间的通信
Nano ESP32 与 Uno Q 之间的通信通过 Wi-Fi 使用 HTTP 协议进行。
Uno Q 运行 NOVA 语音服务器(FastAPI,端口 5000),该服务器提供手机端用于聊天、语音转文字、文字转语音、设置、游戏和视觉控制等操作的接口:
•POST /api/chat – 发送用户文本及当前通信级别,返回 NOVA 的响应
•POST /api/stt – 上传 WAV 录音文件并返回其转录结果
•POST /api/tts – 根据文本生成语音音频文件
•POST /api/vision/start / POST /api/vision/stop – 控制摄像头子系统
•GET /api/settings – 返回游戏和通信设置信息,手机端会定期轮询以保持设置界面的最新状态
在内部,当 Uno Q 收到聊天请求时,它会将对话内容通过网络转发至独立的 NOVA 语言服务器。该服务器运行大语言模型(LLM)并返回生成的文本。随后,Uno Q 将此响应传回手机,并同时使用 TTS 引擎生成对应的语音版本。
基于HTTP的通信方式使得每个服务都能独立进行测试,例如,聊天端点可以直接通过POST /api/chat等请求进行测试,而无需连接实体手机。
Wi-Fi凭据和服务器地址均可根据部署情况灵活配置,而非固定嵌入项目中的静态值;每次构建前都应设置自己的网络名称、密码和服务器IP,然后进行刷机。
语音交互的工作原理
NOVA的语音交互采用多阶段流水线实现:
•Nano ESP32 从 INMP441 麦克风捕获音频,并将其编码为 WAV 文件。
•录音通过 Wi-Fi 传输至 Uno Q,其中 Whisper.cpp(使用针对罗马尼亚语配置的 Whisper 精简模型)将语音转换为文本。
•转换后的文本与当前通信层级信息一起发送至 NOVA 语言服务器,该服务器会为此层级生成系统提示,并调用运行在 llama3.1:8b 上的 Ollama 模型以生成响应。
•生成的回复被返回至 Uno Q,再由其转发到手机,最终在聊天界面上显示。
•与此同时,Uno Q 使用 Piper 搭配罗马尼亚语音模型(ro_RO-mihai-medium.onnx)将回复合成语音,并通过 USB DAC 和放大器连接到 Uno Q 的扬声器进行播放。
整个流程如下:
每个环节均可独立测试:麦克风可单独验证,Whisper 可与现有的 WAV 文件进行对比测试,语言服务器可通过其 API 直接查询,而 Piper 也可在完全不涉及手机的情况下生成并播放音频文件。
同一扬声器还用于 NOVA 的无活动提醒功能(见下文),因此两者均通过单一共享的音频通道传输,以避免播放重叠。
自适应通信
NOVA 的核心理念之一是,系统不应以完全相同的方式与每位用户进行通信。这种自适应性体现在两个独立的轨道上,均由一个名为 DifficultyManager 的统一管理模块控制:对话难度和游戏难度。
对话难度(基于情绪驱动)
NOVA 为每条从手机发送至语言服务器的请求维护一个 1 到 3 的通信等级。该等级会直接改变系统向大语言模型提供的提示内容:
•1级——简短句子,每句表达一个意思,不使用比喻语言,所有内容均逐步解释清楚。
•2级——中等长度的句子,逐步解释,使用简单示例,词汇较为常见。
•3级——自然、成人的对话水平,在适当情况下可进行更复杂的解释。
系统会根据对话中检测到的情绪自动调整级别:如果系统检测到持续20秒以上且置信度至少60%的愉快表情,则通信级别提升;若检测到相同置信度和持续时间的悲伤或愤怒表情,则级别降低。这种基于时间的阈值避免了对单个嘈杂帧的反应,而是反映持续的情绪趋势。
游戏难度(基于分数):本地分数与全局分数
NOVA的游戏采用独立的自适应机制,其依据是表现而非情绪。因此,需要区分两种不同的分数:
•本地分数属于单个游戏会话。在记忆游戏中,它从0开始,每正确配对一对就增加5分;在反应游戏中,每次尝试都会重新计算,从100分(反应时间低于200毫秒)开始,随着反应变慢逐渐降至最低50分。每当新游戏回合开始时,本地分数就会重置。
•全局分数由难度管理器(DifficultyManager)追踪,可在不同游戏和回合间持续保存。它初始值为50,并始终保持在0到100之间。每当本地分数发生变化——例如在记忆游戏中成功配对一对新组合,或在反应游戏中完成一次新尝试——该变化(或在反应游戏中,新的分数本身)都会被累加到全局分数中。
•全局分数才是实际决定游戏难度的关键因素:
•当全局分数达到80或以上时,游戏可提升难度等级(最高至3级)。
•当全球得分降至20分或以下时,游戏可降低难度等级(最低降至1级)。
•每次难度等级发生变化(增加或减少),全局得分都会重置为50,因此系统会从一个中性点重新评估新的趋势,而非延续极端数值。
这种双得分设计使每局游戏的逻辑更易于理解(提供清晰且可重置的本地得分以获得即时反馈),同时仍允许NOVA通过全局得分独立追踪用户随时间推移的整体表现趋势,不受单个回合的影响。
对话难度与游戏难度被刻意保持不相关——用户可能在进行1级游戏的同时处于3级沟通水平,反之亦然。两者均在上述设置界面中透明显示。
添加视觉反馈
在基本通信系统运行后,新增了计算机视觉作为独立子系统。
该视觉系统使用AI-Thinker ESP32-CAM。当聊天会话激活时,Nano ESP32会向Uno Q发送请求,启动视觉系统(POST /api/vision/start)。
Uno Q 然后与 ESP32-CAM 建立一个蓝牙 RFCOMM 连接。摄像头以大约每 0.2 秒一次的频率捕获 JPEG 图像,并通过该连接将图像流传输到 Uno Q。图像被保留在内存中,而不是保存到磁盘。
在 Uno Q 上,每个 JPEG 帧都会使用 OpenCV 进行解码,并经过两个处理阶段:
首先,使用 OpenCV 的 Haar Cascade 分类器(haarcascade_frontalface_default.xml)检测图像中的面部。
检测到的面部会被裁剪、转为灰度、调整大小至 48×48,然后进行归一化处理,并传送给一个 TensorFlow Lite 情绪识别模型,该模型会估计出七种情感类别之一:
•生气
•厌恶
•恐惧
•快乐
•悲伤
•惊喜
•中立
得分最高的情绪及其置信度值将传递给难度管理器(DifficultyManager),该管理器利用这些信息来驱动上述对话难度逻辑:
情绪识别系统并非旨在准确判断某人的真实情绪状态,而是为NOVA提供一个额外信号,用于决定是否调整交互过程。
当摄像头处于激活状态时
摄像头并非设计为持续运行。
视觉功能仅在用户开始实际的聊天交互时才启动——此时手机会调用POST /api/vision/start,从而启动视觉线程并建立与摄像头的蓝牙连接。
当用户离开聊天界面时,手机会调用POST /api/vision/stop,停止视觉线程并关闭摄像头连接。
这使得视觉系统拥有清晰的生命周期:
之所以选择这种方式,一方面是因为视觉反馈仅在活跃对话期间有意义,另一方面是为了避免在不需要时保持摄像头及其处理流程的运行。
项目开发方式
NOVA并非从一开始就作为单一大型系统构建。它逐步开发,每个子系统在添加下一个之前都会先进行测试:
•用户界面和手持设备——首先使用Nano ESP32来构建触摸屏界面和基本交互功能。
•硬件集成——麦克风、显示屏及其他手持设备组件分别进行集成和测试。
•Wi-Fi通信——Nano ESP32与Uno Q通过局域网连接。
•NOVA语音服务器——将Uno Q配置为主处理平台,并构建了其FastAPI服务器。
•NOVA语言服务器——独立开发了一个服务,用于托管对话逻辑和大语言模型(LLM),并将其与语音/视觉任务工作负载隔离。
•语音交互——音频采集、WAV生成、HTTP传输、Whisper.cpp、LLM查询及回复显示被整合为一个完整的流程。
•游戏与自适应交互——在基础流程运行后,添加了本地和全局的计分系统、游戏功能、设置以及活动管理。
•计算机视觉——ESP32-CAM、蓝牙图像传输、人脸识别和情绪识别被作为独立子系统加入。
•硬件集成——电子元件最终被集成到定制的PCB板和外壳中。
这种设计方式对于可复现性至关重要:当有人构建类似系统时,无需一次性调试整个机器人。每个阶段都可以独立构建和验证,然后再进入下一阶段。
开发过程中的挑战
在开发NOVA时遇到了多个问题,这些问题是最终架构形成的重要因素。
在Uno Q上集成计算机视觉时出现了早期兼容性问题:已安装的OpenCV版本未提供预期的CascadeClassifier功能,因此需要将视觉环境隔离,并单独调查其依赖项,再进行整合。
与ESP32-CAM通过蓝牙通信也需进行底层测试。标准的发现工具在开发环境中不可靠,因此直接从Python对RFCOMM连接进行测试,以确认Uno Q能够连接并接收摄像头传输的JPEG数据。
在与语音和视觉处理管道运行在同一台机器上的情况下,运行语言模型显得不切实际。因此,LLM被部署到独立服务器中,而非直接嵌入Uno Q进程——这一决策也使得对话逻辑可以独立于系统其他部分进行测试和优化。
要获得可靠的扬声器输出,还需要在硬件层面进行故障排查:通过集线器连接的USB-C DAC完全未被Uno Q识别,这实际上是众所周知的高通平台问题——当板子通过VIN引脚供电时,USB-C端口默认会进入外设(“设备”)模式而非主机模式。通过启动时强制设置主机模式(借助一个小型systemd服务),这一问题得以永久解决,使DAC、放大器和扬声器链路能够正常工作。
由于HTTP请求、Wi-Fi通信、摄像头处理和用户界面交互等都可能涉及阻塞操作,系统必须经过精心设计,以确保后台处理不会影响手机的响应能力。因此,TTS生成和视觉分析等长时间运行的任务被分离到后台线程和专用模块中。
硬件集成
最终的NOVA原型机并非仅是一组通过松散电线连接的开发板。
NOVA手机采用专为本项目设计的定制PCB,将所需连接功能整合到一个紧凑且可靠的平台上。与PCB一同设计并制造了专用外壳,使电子元件、显示屏和麦克风能够组装成一个真正的实体设备,而非面包板原型。
硬件和机械设计使用KiCad和Fusion 360完成,而固件和软件则基于Arduino IDE和Visual Studio Code开发。
为何选择这种构建方式
•NOVA的架构基于一个简单原则:每个组件应有明确的职责。
•Nano ESP32负责交互操作。
•Uno Q负责语音、视觉、音频输出以及自适应追踪。
•NOVA语言服务器处理对话内容。
•ESP32-CAM提供视觉信息。
•难度管理器决定NOVA如何调整其对话风格和游戏难度。
•定制的PCB和外壳将这些组件转化为实际的产品。
这种分离使得系统更易于理解、测试、修改和复现。同时,也使得NOVA能够逐步构建:初学者可以从手柄和显示屏开始,添加麦克风,建立Wi-Fi通信,搭建语音处理管道,连接语言服务器,加入自适应行为,最后引入计算机视觉。
NOVA背后的宗旨
NOVA目前仍处于原型阶段,有许多方面有待改进。情感识别的准确性可以进一步提升,对话系统可以变得更加智能,自适应行为也可以通过增加更多活动和策略来扩展。
更大的目标依然简单明了:
技术不仅应更擅长处理信息,还应更擅长适应使用它的用户。
NOVA正是对这一理念的探索。它将嵌入式系统、人工智能、计算机视觉、音频处理、无线通信、PCB设计和机械设计整合到一个以自适应交互为核心平台中。
该项目在开发时也充分考虑了可复现性。NOVA 不是作为一个单一复杂的系统来处理,其架构被划分为易于理解的阶段和独立的子系统,使得从基础开始的人也能遵循相同的总体路径——从一个简单的嵌入式设备发展到一个完整的自适应伴侣。
本文编译自hackster.io





