目录

灵犀 - OpenVela R528 端侧情感智能伙伴 (最终版)

心有灵犀一点通——懂你的话,更懂你的心和你身边的声音。

项目概述

灵犀是基于全志 R528 + OpenVela(NuttX) 的端侧情感智能伙伴系统:以 AI Agent 框架为核心, 集成 LVGL 图形界面、火山引擎 ASR/TTS、通义千问 LLM,提供 6 个桌面应用,形成”听得懂(语音对话)、 看得见(表情联动)、感受得到(心情专家)、听得见环境(声音检测)”的完整情感交互闭环—— 含小小怪科技风 AI 少女语音伙伴、自训练 CNN 声音检测。

🚀 快速开始(下载后三步上手)

本项目提供预编译镜像,无需编译环境即可体验全部功能:

  1. 烧录:用 PhoenixSuit 把 image/v112.img 烧入 R528 开发板 → 见下文《安装烧录》
  2. 联网:开机后在桌面点”WiFi 配置”连接热点 → 见下文《首次使用》
  3. 体验:对”语音控制”说:开灯,然后把音量调到 80,观察 LED 亮起与语音答复

需要修改功能或替换 API Key,请看下文《从源码编译》。

目录结构

灵犀-项目源代码/
├── image/                          # 烧录镜像
│   └── v112.img                    # v112 最终版 (32MB, NAND Flash,仅保留此一个)
├── src/                            # 应用层源码
│   ├── lv_100ask_xz_ai_main.c      # LVGL 桌面主界面 (6个app入口)
│   ├── xiaoguai.c / .h             # 小小怪应用 (科技风AI少女+8心情×4状态表情系统)
│   ├── voice_chat.c / .h           # 语音对话模块 (ASR->LLM->TTS, 小小怪复用)
│   ├── voice_periph.c              # 语音控制应用 (LLM function calling)
│   ├── mood_expert.c / .h          # 心情专家应用 (动态skill加载+双persona机制)
│   ├── simple_chat.c / .h          # LLM HTTP 通信基础库
│   ├── mood_default.md             # 心情专家默认skill(自助式积极心理学)
│   ├── aed_sound_detector/         # 声音检测模块 (自训练CNN, 咳嗽/敲击识别)
│   │   ├── aed_audio.c/h           # 音频采集 (48kHz -> 16kHz抽取)
│   │   ├── aed_pipeline.c/h        # 滑动窗口信号管线
│   │   ├── aed_features.c/h        # 12维特征提取
│   │   ├── aed_model.c/h           # 分类器 (训练管线导出参数)
│   │   ├── aed_tflm.h              # TFLite Micro INT8 推理接口
│   │   ├── aed_tflm_stub.c         # TFLM关闭时的降级stub
│   │   ├── aed_postprocess.c/h     # 状态机后处理(误报抑制)
│   │   ├── aed_alert.c/h           # 告警与冷却控制
│   │   └── aed_ui.c/h              # LVGL检测结果界面
│   ├── audio_capture.c             # 音频采集驱动
│   └── audio_playback.c            # 音频播放驱动
├── ai_agent/                       # ai_agent 框架 (packages_ai_agent-dev)
│   └── packages_ai_agent-dev/      # 完整框架源码
│       ├── include/                # 头文件 (agent_config.h 含API配置)
│       ├── src/                    # 框架源码
│       │   ├── core/               # agent_loop, context_builder, memory_store
│       │   ├── llm/                # llm_proxy, llm_router, llm_parse
│       │   ├── voice/              # volc_asr, volc_tts, audio_capture/playback
│       │   ├── tools/              # tool_registry, mcp_client, skill_loader
│       │   ├── channels/           # cmd_channel, feishu_bot, ws_server
│       │   ├── infra/              # vela_tls, config_store, network_manager
│       │   └── ui/                 # lvgl_ui_channel, qrcode_display
│       ├── agent_skills/           # Skill .md 文件集 (可插拔技能)
│       └── docs/                   # 架构文档
├── build/                          # 构建相关
│   ├── build_and_pack.sh           # 一键编译打包脚本
│   ├── add_license_headers.py      # 源文件协议头批量添加脚本
│   └── agent_config.h              # API密钥与服务端点配置
├── docs/                           # 开发文档
│   ├── 开发经验总结.md              # 踩坑记录与解决方案
│   ├── aiagent_guide.md            # ai_agent 框架使用指南
│   └── r528_build_experience.md    # R528 编译打包经验
├── LICENSE                         # Apache 2.0 开源协议
└── README.md                       # 本文档

桌面应用一览

应用 功能 底层实现
WiFi 配置 扫描/连接 WiFi nsh wapi 命令
AI 助手 文字对话 (ai_agent框架) lvgl_ui_channel 队列通信
小小怪 科技风AI少女语音伙伴 ASR→LLM(心情判别)→TTS + canvas逐像素角色动画(8心情×4状态)
语音控制 语音控制硬件设备 LLM function calling (set_led/set_volume/read_adc)
心情专家 自助式心情调节+表情联动 动态skill加载+心情判别+危险预警
声音检测 咳嗽/敲击声音识别 自训练小卷积模型(MFCC+INT8) + 特征分类 + 状态机后处理

核心技术栈

组件 技术
OS OpenVela (NuttX)
MCU 全志 R528 (ARM Cortex-A7 双核)
GUI LVGL 8.x (320x480 竖屏 RGB565, SPI LCD)
语音识别(ASR) 火山引擎 豆包大模型 ASR V3
语音合成(TTS) 火山引擎 豆包语音合成 seed-tts-2.0 (音色:小何2.0)
大语言模型(LLM) 阿里通义千问 Qwen (function calling)
端侧AI 自训练小卷积模型 (MFCC + INT8 TFLite Micro)
网络 RTL8723 WiFi + mbedTLS TLS
存储 256MB NAND Flash (/data/ 持久化)

小小怪应用 (v112 全新设计)

科技风 AI 少女语音伙伴,复用心情专家的 ASR/LLM/TTS 能力,以纯语音交互:

  • 角色形象:LVGL canvas 逐像素程序化绘制——深空渐变星空背景、全息光环、蓝黑波波头+ 青色挑染、银白霓虹耳机(带呼吸指示灯)、大眼睛+腮红、胸前能量核心;全部由 1px 精度绘制 原语(实心圆/椭圆/圆弧/粗线/渐变混色)生成,零图片资源
  • 表情随交流变化:8 种心情 × 4 种对话状态的表情矩阵——
    • 心情(LLM update_mood 工具实时判别):快乐(弯月眼+闪光)、伤心(垂眉+泪滴)、愤怒(倒八眉+ 怒气标记)、急躁、抱怨、平静、低落、危险(红瞳+红色背景+感叹号警报)
    • 状态:待机(随机眨眼+呼吸浮动)、聆听(大眼+耳机声波)、思考(瞳孔上移+浮动问号)、 说话(三相位嘴型开合)
  • **对话自然 (persona机制)**:小小怪使用内置俏皮 AI 少女人设(口语化 1~2 短句、带语气词、 禁列表/Markdown),与心情专家的心理咨询人设通过 mood_expert_set_persona() 切换, 切换时清空对话历史防止”串戏”
  • 语音问候:首次进入自动播放欢迎语,引导用户按住 PTT 说话
  • 布局适配:页面宽度 LV_PCT(100) 适配 320x480 竖屏,规范顶栏(返回按钮完整可见+居中标题)
  • PTT按住说话:按下开始录音,松开启动 ASR→LLM→TTS 工作线程
  • 线程安全:32KB 工作线程栈(mbedTLS HTTPS 需求),UI 线程 vs 工作线程通过 volatile 标志通信
  • 容错处理:ASR 失败时 TTS 提示”听不清”,LLM 失败时 TTS 提示”稍后再试”,不崩溃

心情专家应用

8种心情状态:快乐、伤心、愤怒、急躁、抱怨、平静、抑郁、严重抑郁(危险)

  • 自助式积极心理学Skill:从 /data/mood_skills/*.md 加载心理学规则,支持即插即用
    • 三件好事、善意行为、感恩日记、4-7-8呼吸法、正念冥想、感官着陆等循证练习
    • 明确声明为自助式工具,不替代专业心理治疗
  • 双persona机制:EXPERT(心理咨询)与XIAOGUAI(俏皮少女)两套人设共用心情判别引擎, 进入对应应用时自动切换,互不干扰
  • 上下文记忆:RAM循环缓冲保留最近15轮对话
  • 持久化:心情状态写入 /data/mood_state.json (NAND寿命保护)
  • 危险预警:识别到自杀/自残/伤人/重性精神障碍 → LED亮 + 警报声 + 红色表情 + 就医热线

声音检测应用 (初代: 自训练小卷积模型)

当前版本只检测”敲击”和”咳嗽”两类事件——这是有意为之的高难度选题:两者都是短促的 宽频瞬态冲击信号,时域包络和频谱形态高度相似,简单的能量/频率阈值完全无法区分,必须 依靠模型学习细微的时频差异。

我们的检测过程(自己训练模型)

  1. 数据采集:openvela 开发板 DMIC 板端自采——咳嗽 50 条、敲击 50 条、背景约 30 分钟 (覆盖 0.5m/1m/2m 距离场景);辅以 ESC-50 公开数据集的辅助正样本和背景硬负样本 (键盘声/鼓掌/打喷嚏等易混淆声音),数据集 train/val/test = 2049/551/536
  2. 特征前端:48kHz 采集 → 16kHz 单声道 → 1 秒滑动窗口(250ms 步进) → 49×40 MFCC 时频特征图
  3. 模型训练:自训练小卷积网络——Conv2D + DepthwiseConv2D 深度可分离结构(3 层卷积 + 全局平均池化 + Softmax),全整数 INT8 量化导出 TFLite,模型体积仅约 10KB
  4. 板端推理:TFLite Micro 推理(tensor arena 128KB);同一训练管线同时导出质心分类器 轻量后端参数,供与 LVGL/mbedTLS/ai_agent 共存的集成镜像在内存受限时切换
  5. 后处理:2500+ 行状态机——开机噪声自校准(2s)、临近事件合并(咳嗽 2s/敲击 1.5s)、 误报抑制与事件确认

实测成绩

  • 离线:验证集准确率 90.56%,测试集 89.93%
  • 板端:纯咳嗽 5/5、纯敲击 5/5、混合场景 2+2 全部命中;安静背景零误报; 30 分钟压力长测持续运行不崩溃

演进路线

本应用为初代版本,规划路线:

  1. 初代(当前):咳嗽/敲击两类高相似瞬态事件
  2. 下一代:扩展哭声、笑声、喘气声、急促呼吸声等各类微弱声音信号
  3. 最终目标:融入小小怪与心情专家,构建”听觉情绪感知”——检测到哭声/急促呼吸时 AI 伙伴 主动安抚,声学事件作为心情判别的辅助证据,形成”听觉+对话”双通道情感理解

语音控制工具

工具名 参数 硬件接口
set_led on/off /dev/gpio2 (GPIO)
read_adc 无 /dev/adc0 (GPADC)
set_volume 0-100 amixer numid 6,7 (DAC volume 0-255)
get_volume 无 amixer get 6

安装烧录(预编译镜像,推荐)

1. 准备

项目 要求
开发板 全志 R528(r528s3-velaevb1,256MB NAND),带 320×480 SPI LCD、FT5x06 触摸、DMIC、扬声器、LED
烧录工具 Windows 下安装 PhoenixSuit(或 LiveSuit),首次使用需安装全志 USB 驱动(安装包自带)
镜像 本项目 image/v112.img(约 32MB)
可选 USB 转 TTL 串口线(接 UART0,波特率 115200),用于查看日志

2. 烧录步骤(FEL 模式)

  1. 打开 PhoenixSuit → “一键刷机”页 → 选择 image/v112.img
  2. 开发板断电;按住板上 FEL 键不松,用 USB 线连接电脑
  3. PhoenixSuit 识别到设备后弹窗,选择全盘擦除升级,开始烧录
  4. 进度条走完提示成功(约 1~2 分钟),拔插 USB,重新上电
  5. 验证:LCD 点亮并显示 6 应用桌面即烧录成功;接了串口的话可看到 启动日志停在 nsh> 提示符

烧录失败排查:① 设备未识别 → 重新按 FEL 插拔,确认驱动已装; ② 烧录中断 → 换 USB 线/接口,不要经过 HUB。

3. 首次使用

  1. 连 WiFi:桌面点”WiFi 配置” → 扫描 → 选热点输入密码(语音/对话功能依赖网络, 声音检测为纯端侧推理,断网也能用)
  2. 逐个体验:
    • AI 助手:屏幕打字对话,验证 LLM 链路
    • 语音控制:按住说话“开灯,然后把音量调到 80”,验证多步推理 + 硬件联动
    • 心情专家 / 小小怪:按住 PTT 说话,观察心情判别与表情联动
    • 声音检测:进入后等 2 秒自校准,咳嗽一声或敲两下桌面验证检出
  3. 串口观察(可选):115200 8N1,可看到 ASR 识别文本、tool_calls 日志、 update_mood 心情判别等全部过程

注意:镜像内置的云服务 API Key 为开发测试配额,如失效请按下文 《从源码编译》替换为自己的 Key 后重新编译。

从源码编译(需要修改功能时)

1. 环境准备

  • Ubuntu 22.04(物理机或虚拟机),磁盘 ≥ 100GB
  • 获取 openvela 源码与 R528 厂商 SDK(vendor/allwinnertech),工作目录约定为 ~/vela-opensource(若不同,需同步修改 build/build_and_pack.sh 首行 cd 路径)
  • 交叉工具链使用源码树自带的 prebuilts/gcc/linux-x86_64/arm-none-eabi,无需另装

2. 部署本项目源码

# ① 应用层源码 → lvgldemo(含桌面/小小怪/心情专家/声音检测等全部应用)
cp -r src/* ~/vela-opensource/apps/examples/lvgldemo/

# ② ai_agent 框架 → packages
cp -r ai_agent/packages_ai_agent-dev ~/vela-opensource/packages/ai_agent

# ③ API 配置(先改成你自己的 Key,见下文"API 配置")
cp build/agent_config.h ~/vela-opensource/packages/ai_agent/include/

# ④ 构建脚本
cp build/build_and_pack.sh ~/vela-opensource/

3. 一键编译打包

cd ~/vela-opensource
bash build_and_pack.sh

脚本自动完成四步(缺一不可,都已写在脚本里):

步骤 内容 通过标准
1 编译 ./build.sh .../configs/nsh -e -Wno-error -j4 无 Error,生成 nuttx/nuttx(约 40MB ELF)
2 objcopy 剔除 .ARM.attributes 等段生成精简二进制 nsh_small.bin 为 4~8MB(如是 1GB 即失败,这是最常见坑)
3 复制 拷到 .../velaevb1_nand/configs/nsh.fex 大小与上一步一致
4 打包 source envsetup.sh && lunch_nuttx && p 输出 Dragon execute image.cfg SUCCESS !

产物镜像:

vendor/allwinnertech/lichee/out/r528s3/velaevb1_nand/rtos_nuttx_r528s3-velaevb1_uart0_256Mnand.img

取回 Windows 后按上文《安装烧录》烧入即可。

增量编译(只改了源码):cd ~/vela-opensource/nuttx && make -j4,然后从脚本 第 2 步继续。更多坑(.o 缓存不刷新、p 命令退出码怪癖等)见 docs/r528_build_experience.md,每次构建前建议先读。

4. API 配置(替换为自己的 Key)

编辑 build/agent_config.h(部署前改好再拷入):

  • 通义千问 LLM:dashscope API Key(阿里云百炼开通,Qwen 系列均可)
  • 火山引擎 ASR:App Key + Access Token,resource_id = volc.bigasr.sauc.duration(大模型版)
  • 火山引擎 TTS:resource_id = seed-tts-2.0,speaker = zh_female_xiaohe_uranus_bigtts(小何2.0)
  • Key 由 voice_chat.c 的 force_config() 在启动时写入 config_store,无需板上手动配置
  • TTS 采样率固定 16kHz,与 WAV 播放匹配(改动会导致音色变调,勿改)

安全提醒:agent_config.h 中的 Key 不要提交到公开仓库。

openvela 社区贡献

本项目的通用修复和 AI Agent 能力改进按照 openvela 常规社区贡献流程提交,目标均为官方仓库的 dev 分支。比赛作品代码继续保留在本仓库,社区 PR 只包含可独立审核、可复用的最小改动。

贡献 官方仓库与目标分支 当前状态 改动范围
FT5x06 Y 轴阈值修复 open-vela/nuttx:dev PR #330 已提交;checkpatch 与 CLA 复检均已通过,等待维护者审核 修复 Y 轴位移误用 X 轴变量和阈值的问题;明确作为 Apache NuttX 上游修复的 backport
火山引擎大模型 ASR V3 支持 open-vela/packages_ai_agent:dev PR #26 已提交;checkpatch 与 CLA 复检均已通过,等待维护者审核及其余 CI 增加 V3 WebSocket 端点、X-Api-* 鉴权、V3 请求及响应解析,同时保留现有 V2 配置兼容性

FT5x06 修复依据

ASR V3 上游化范围

两项 PR 均于 2026-07-30 提交,并已通过 openvela CLA 复检。当前等待官方维护者审核及剩余 CI;PR 实际合入前,本节不会标记为“已合入”。

版本历史

仓库仅保留最终版镜像 image/v112.img;以下为版本演进记录。

  • v112 (最终版): 小小怪全新设计——科技风AI少女形象(canvas逐像素程序化绘制); 布局修复 (适配320x480, 返回按钮完整可见); 8心情×4状态表情矩阵+眨眼/呼吸浮动/声波/问号/危险警报; persona机制(小小怪俏皮人设与心情专家心理咨询人设独立, 切换清空历史); 首次进入语音问候
  • v111: 新增小小怪应用(像素风怪兽语音对话,复用心情专家,表情/嘴型动画); 删除语音对话应用; 修复ASR失败崩溃与UI遮挡
  • v108: 心情专家Skill升级为自助式积极心理学版; TTS播放采样率修复(16kHz匹配)
  • v107: WAV采样率 24000→16000 修复TTS播放变调
  • v106: TTS诊断日志(speaker确认)
  • v105: volc_tts.c 强制使用AGENT_VOICE_DEFAULT_SPEAKER
  • v104: voice_chat.c 默认音色改为小何2.0 + force_config
  • v103: TTS音色改为小何2.0
  • v102: 声音检测添加返回按钮, 删除AI速聊应用
  • v101b: AED线程栈改堆分配, 移除LVGL符号字体依赖
  • v101: 新增声音检测应用(AED咳嗽/敲击识别)
  • v100: 修复TTS resource_id (seed-tts-2.0), 全量编译验证

开源协议

本项目整体采用 Apache License 2.0 开源协议:

  • 根目录 LICENSE 为协议全文,适用于仓库内全部自研代码
  • src/ 下所有自研源文件均已添加 SPDX-License-Identifier: Apache-2.0 协议头 (Copyright (C) 2026 Lingxi Team)
  • ai_agent/packages_ai_agent-dev/ 为 openvela 上游框架,本身即 Apache 2.0 (附带其自有 LICENSE),我们的改动同样以 Apache 2.0 发布,协议上与上游完全兼容
  • 新增源文件可运行 python build/add_license_headers.py 自动补齐协议头
关于
969.6 MB
邀请码
    Gitlink(确实开源)
  • 加入我们
  • 官网邮箱:gitlink@ccf.org.cn
  • QQ群
  • QQ群
  • 公众号
  • 公众号

版权所有:中国计算机学会技术支持:开源发展技术委员会
京ICP备13000930号-9 京公网安备 11010802047560号