Skip to content

Navigation Menu

Sign in
Sign up

Repository files navigation

EdgeSight Assistant

RK3588S 离线多模态智能终端 Offline Multimodal Edge AI Assistant based on RK3588S

1. 项目简介

EdgeSight Assistant 是一个部署在 RK3588S 平台上的离线多模态智能终端项目。

当前开发阶段:视频推流 MVP

当前仓库优先交付与验证下面这条链路,暂不接入 ASR、Qwen3-VL、TTS 或 GUI:

Logitech C310 (MJPEG, 1280x720@30)
 -> FFmpeg V4L2 input + MJPEG decoder
 -> FFmpeg h264_rkmpp hardware encoder
 -> RTMP/FLV
 -> external SRS

程序是一个前台 C++ CLI。摄像头采集、解码、硬件编码和 RTMP 发布均使用 FFmpeg 库;如果 h264_rkmpp 不可用,程序会失败并说明原因,绝不退回软件编码。

Build and run on RK3588S

目标板须安装包含 V4L2、FLV、RTMP 和 h264_rkmpp 的 Rockchip FFmpeg 运行时及开发包。先检查环境:

scripts/check_dependencies.sh

随后创建本地配置、填入 SRS 地址并构建运行:

cp config/config.example.yaml config/config.yaml
scripts/preflight.sh
scripts/run.sh

目标板 FFmpeg 安装布局与依赖检查详见 docs/rk3588-dependencies.md。 运行时数据流、资源边界与失败行为见 docs/phase1-architecture.md

Hardware-free configuration test

在没有 RK3588S 或 FFmpeg 开发库的开发机上,可只构建并测试配置校验逻辑:

scripts/test.sh

配置文件中的 camera.device 有值时优先使用该设备;为空时才会按 camera.camera_name 自动发现。推流 URL 由 stream.serverstream.portstream.appstream.stream_key 拼成:

rtmp://<server>:<port>/<app>/<stream_key>

对于 C310,建议保留 camera.disable_dynamic_framerate: true。启动脚本会在发布器打开摄像头前设置 UVC 的 exposure_dynamic_framerate=0,避免自动曝光把实际帧率降到约 15 FPS;该控制设置失败时启动也会失败并输出诊断。

使用 Ctrl+C 正常停止。验收过程和记录模板见 docs/phase1-acceptance.md

Phase 1 完成后,Phase 2 的激活验证契约见 docs/phase2-activation.md。目前已增加可选的 edgesight_audio:它在目标板上读取 C310 的 ALSA 麦克风,调用 sherpa-onnx KWS,并输出结构化唤醒事件;VAD、唤醒后的 ASR 和最终唤醒词仍未完成验收。

项目使用罗技 C310 摄像头采集视频和麦克风音频,在设备本地完成:

  • V4L2 视频采集
  • 视频实时编码与网络推流
  • 离线 ASR 语音识别
  • Qwen3-VL 图像 / 场景理解
  • 离线 TTS 语音合成
  • ALSA 音频播放
  • 用户通过语音对当前摄像头画面进行问答

项目目标是在不依赖云端 AI API 的情况下,实现:

看得见、听得懂、能回答、会说话,同时还能持续推流。


2. 长期项目愿景(不属于当前 Phase 1)

以下是视频推流 MVP 验收后才会规划的长期方向;当前 Phase 1 不实现或验收其中的 AI、音频、GUI、自动重连或音视频合流功能:

Logitech C310
 |
 +-- V4L2 Video
 | |
 | +--> Video Encode --> RTMP/RTSP Stream
 | |
 | +--> Capture Latest Frame
 | |
 | v
 | Qwen3-VL
 | |
 | v
 | Text Answer
 |
 +-- ALSA Microphone
 |
 v
 Offline ASR
 |
 v
 User Question
 |
 +------------> Qwen3-VL
 |
 v
 Text Answer
 |
 v
 Offline TTS
 |
 v
 ALSA
 |
 v
 Speaker

目标示例:

用户面对摄像头说:

桌子上有什么?

系统执行:

C310 麦克风
 ↓
ASR
 ↓
"桌子上有什么?"
 ↓
获取当前最新视频帧
 ↓
Qwen3-VL
 ↓
"桌子上有一台笔记本电脑和一个水杯。"
 ↓
TTS
 ↓
喇叭播放

与此同时,视频推流链路保持持续工作,不等待大模型推理结束。


3. 目标平台

Hardware

  • Rockchip RK3588S
  • Firefly ROC-RK3588S-PC
  • Logitech C310 USB Camera
  • USB / 3.5mm / HDMI Speaker
  • 8GB / 16GB RAM 推荐
  • Ubuntu Linux

Software

  • Linux
  • C / C++
  • CMake
  • V4L2
  • ALSA
  • FFmpeg
  • Rockchip MPP
  • RKNN / RKLLM
  • Qwen3-VL
  • Offline ASR
  • Offline TTS

后续可选:

  • Qt 6
  • QML
  • RTSP
  • RTMP
  • SRS
  • WebSocket / HTTP API

4. AI 模型规划

4.1 ASR

功能:

Audio -> Text

候选方案:

  • SenseVoiceSmall
  • sherpa-onnx
  • Paraformer
  • Whisper Tiny / Base

第一版优先考虑:

SenseVoiceSmall / sherpa-onnx

要求:

  • 完全离线
  • ARM64 可运行
  • 尽量支持 C/C++
  • 中文识别效果较好
  • 尽量降低 CPU / 内存占用

4.2 Vision Language Model

核心模型:

Qwen3-VL-2B

后续阶段可优先使用 2B 版本跑通完整链路。

后续根据 RK3588S 实际性能测试升级:

Qwen3-VL-4B

功能:

  • 单帧图像理解
  • 场景描述
  • Visual Question Answering
  • 多帧图像理解
  • 简单视频语义理解

第一版不要求逐帧运行 Qwen3-VL。

建议工作模式:

视频:25/30 FPS 持续采集
Qwen3-VL:语音触发 / 手动触发 / 定时抽帧

4.3 TTS

功能:

Text -> Audio

候选:

  • sherpa-onnx TTS
  • Piper
  • VITS
  • MeloTTS

优先要求:

  • 完全离线
  • ARM64 支持
  • 中文支持
  • 启动速度快
  • 内存占用低

5. 视频处理

5.1 视频采集

使用:

V4L2

目标设备:

Logitech C310

采集线程必须独立运行。

基础流程:

V4L2
 ↓
Frame Capture
 ↓
Latest Frame Buffer

建议使用"最新帧"模型,不为 AI 模块积压大量历史帧。


6. 视频推流

视频推流链路与 AI 推理链路必须解耦。

推荐结构:

 +--> AI Latest Frame
 |
V4L2 --> Frame --+
 |
 +--> Encoder --> RTMP / RTSP

AI 推理变慢时:

不得阻塞视频采集
不得阻塞视频编码
不得阻塞网络推流

优先考虑:

V4L2
 ↓
MPP Hardware Encoder
 ↓
H.264 / H.265
 ↓
RTMP / RTSP

也可以第一版先通过 FFmpeg 完成推流验证。


7. 音频采集

C310 自带麦克风。

通过 ALSA 获取 PCM 数据。

流程:

ALSA Capture
 ↓
PCM Buffer
 ↓
VAD
 ↓
ASR

后续考虑加入 VAD(Voice Activity Detection),避免持续将静音数据送给 ASR。


8. 语音交互逻辑

推荐第一版采用:

语音触发视觉分析

而不是让 Qwen3-VL 持续分析所有视频帧。

状态流程:

IDLE
 ↓
检测到用户讲话
 ↓
录制一段语音
 ↓
ASR
 ↓
得到问题文本
 ↓
获取当前最新视频帧
 ↓
Qwen3-VL(question + image)
 ↓
得到回答
 ↓
TTS
 ↓
Speaker
 ↓
IDLE

9. 并发架构

建议模块:

VideoCaptureThread
AudioCaptureThread
VideoEncodeThread
StreamThread
ASRWorker
VLWorker
TTSWorker
AudioPlaybackThread

线程之间避免直接耦合。

建议使用:

  • 有界阻塞队列
  • Latest Frame Buffer
  • std::mutex
  • std::condition_variable
  • atomic flag
  • shared_ptr / unique_ptr
  • RAII

10. Latest Frame 设计

Qwen3-VL 不应该处理视频采集队列中已经过期的帧。

例如:

30 FPS camera

如果一次 VL 推理需要较长时间,则不应该:

frame1
frame2
frame3
...
frame60

排队依次推理。

而应该:

VL Ready
 ↓
直接读取 latest_frame

旧帧自动被覆盖。

这样可以保证用户问:

"现在画面里面有什么?"

看到的是尽可能新的画面。


11. 推荐目录结构

EdgeSight-Assistant/
├── README.md
├── CMakeLists.txt
├── config/
│ └── config.yaml
├── include/
│ ├── video/
│ ├── audio/
│ ├── ai/
│ ├── stream/
│ └── common/
├── src/
│ ├── main.cpp
│ ├── video/
│ │ ├── v4l2_capture.cpp
│ │ └── frame_buffer.cpp
│ ├── audio/
│ │ ├── alsa_capture.cpp
│ │ ├── audio_player.cpp
│ │ └── vad.cpp
│ ├── ai/
│ │ ├── asr_engine.cpp
│ │ ├── qwen_vl_engine.cpp
│ │ └── tts_engine.cpp
│ ├── stream/
│ │ ├── video_encoder.cpp
│ │ └── stream_publisher.cpp
│ └── common/
├── models/
│ ├── asr/
│ ├── qwen3_vl/
│ └── tts/
├── scripts/
├── tests/
└── docs/

模型文件不提交 Git。

.gitignore 中应包含:

models/
build/
*.rknn
*.rkllm
*.onnx
*.bin
*.wav
*.mp4
*.log

12. 模块接口建议

VideoCapture

职责:

  • 初始化 V4L2
  • 设置分辨率 / FPS / Pixel Format
  • mmap buffer
  • 获取视频帧
  • 更新 latest frame

ASREngine

输入:

PCM audio

输出:

std::string text

QwenVLEngine

输入:

image
question

输出:

answer

接口形式示例:

std::string infer(
 const ImageFrame& image,
 const std::string& prompt
);

TTSEngine

输入:

text

输出:

PCM audio

StreamPublisher

输入:

EncodedPacket

输出:

RTMP / RTSP

13. 第一阶段开发顺序

不要一开始同时集成所有模型。

Phase 1

完成:

C310 -> V4L2 -> 获取视频

验收:

  • 稳定运行
  • FPS 正常
  • 无持续内存增长

Phase 2

完成:

V4L2 -> Encoder -> RTMP / RTSP

验收:

  • 持续推流
  • 画面流畅
  • 长时间稳定

Phase 3

完成离线 ASR:

C310 Mic -> ALSA -> ASR -> Console Text

Phase 4

完成 Qwen3-VL:

Current Frame + Text Prompt -> Qwen3-VL -> Answer

第一版先使用静态图片验证。

再接入 V4L2 最新帧。

Phase 5

完成 TTS:

Text -> TTS -> ALSA -> Speaker

Phase 6

打通:

Speech
 ↓
ASR
 ↓
Question
 ↓
Current Frame
 ↓
Qwen3-VL
 ↓
Answer
 ↓
TTS
 ↓
Speaker

Phase 7

保证 AI 工作期间:

视频仍持续推流

14. 第二阶段功能

完成基础版本后,可增加:

  • 多轮对话
  • 多帧视觉理解
  • 定时场景描述
  • 异常事件检测
  • VAD
  • Wake Word
  • Qt GUI
  • 对话历史
  • 截图
  • 视频录像
  • Web 管理界面
  • REST API
  • WebSocket
  • RTSP Server
  • RTMP 推流
  • AI 结果叠加到视频
  • AI 文本字幕
  • TTS 音频与视频合流

15. 性能设计原则

本项目不是让 Qwen3-VL 逐帧处理 30 FPS 视频。

设计目标是:

视频链路:实时
AI 链路:异步

例如:

Video Capture 30 FPS
Video Stream 25~30 FPS
ASR Event Driven
Qwen3-VL Event Driven
TTS Event Driven

后续再测试周期性视觉分析:

0.2 FPS
0.5 FPS
1 FPS

根据 RK3588S 实际性能决定。


16. 关键指标

需要统计:

Video

  • Capture FPS
  • Encode FPS
  • Stream FPS
  • Encode latency
  • Stream latency

ASR

  • Audio duration
  • Recognition latency
  • Real-time factor

Qwen3-VL

  • Vision preprocessing time
  • Prefill time
  • First token latency
  • Decode tokens/s
  • Total response latency
  • Peak memory

TTS

  • First audio latency
  • Synthesis time
  • Real-time factor

System

  • CPU utilization
  • NPU utilization
  • Memory utilization
  • Temperature
  • Power consumption

17. 第一版验收标准

第一版完成以下场景即可认为项目主链路跑通:

  1. C310 视频能够稳定采集。
  2. 视频能够持续实时推流。
  3. C310 麦克风能够正常采集语音。
  4. ASR 能够离线识别中文问题。
  5. Qwen3-VL 能够读取当前视频帧。
  6. Qwen3-VL 能根据用户问题理解画面。
  7. TTS 能够离线生成中文语音。
  8. 喇叭能够播放回答。
  9. AI 推理期间视频推流不中断。
  10. 整个 AI 主链路无需云端 API。

18. 示例演示

Demo 1:询问画面内容

用户:

你现在看到了什么?

系统:

画面中有一张桌子,桌子上放着一台电脑和一个水杯。

Demo 2:询问物体位置

用户:

我的手机在哪里?

系统根据当前画面回答。

Demo 3:持续推流

另一台电脑通过 RTMP / RTSP 播放器观看实时画面。

用户与设备进行语音问答时:

视频推流保持正常。

19. 项目定位

该项目重点不是训练大模型,而是:

  • RK3588S 大模型部署
  • 端侧视觉语言模型
  • C++ AI 工程化
  • V4L2 视频采集
  • ALSA 音频处理
  • 硬件视频编码
  • 实时网络推流
  • 多线程任务调度
  • ASR / VLM / TTS 多模型协同
  • 边缘多模态 AI 系统设计

20. 最终目标

 RK3588S
 |
 +----------+----------+
 | |
 Camera Microphone
 | |
 V4L2 ALSA
 | |
 +----+----+ ASR
 | | |
Stream Latest Frame Question
 | | |
 | +-------+--------+
 | |
RTMP/RTSP Qwen3-VL
 |
 Answer
 |
 TTS
 |
 ALSA
 |
 Speaker

最终形成一套完全本地运行的:

Offline Multimodal Edge AI Assistant

About

基于 RK3588S 和qwen3-vl-2B的边缘视觉与语音助手,支持 摄像头推流、离线语音识别和tts语音转换

Topics

Resources

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

AltStyle によって変換されたページ (->オリジナル) /