Rust + GPUI 技术方案

AI 会议托管工具
Rust 实现快照

当前版本已落地 Cargo Workspace 三层结构与可运行桌面端, 包含 WebSocket 握手、音频双向流、AEC3 实时回声消除、MCP tools 桥接与本地配置持久化。

20ms 分帧

Opus 上下行链路已跑通

AEC3 可观测

stream delay / ERL / ERLE

MCP 桥接

stdio / sse / stream

系统架构

代码实现映射架构

以 host-core / host-platform / host-app-gpui 为主干,串联音频主链路与 MCP 工具链路。

数据流转时序

01

连接握手

发送 hello(含 notify/mcp features),等待 session_id

02

采集上行

cpal 回调采集输入设备,10ms AEC 处理后聚合为 20ms 音频帧

03

编码发送

20ms PCM16 mono 编码为 Opus,通过 WebSocket Binary 连续上送

04

平台处理

平台执行 ASR/LLM/TTS,同时下发 stt/tts/notify/mcp 文本事件

05

下行播放

客户端解码 Opus 包并播放到选定输出设备,可镜像到系统扬声器

06

MCP 回包

处理 initialize/tools/list/tools/call 并按路由返回 JSON-RPC 响应

运行时关键参数(当前默认)

音频帧时长20ms
WS ping 间隔2s
WS ping 超时6s
hello 超时5s
MCP connect_timeout3000ms
MCP request_timeout8000ms
备注实时时延以 RTT/AEC 指标面板为准

协议兼容

灵矽增强协议 + xiaozhi 兼容

当前软件默认对接灵矽 WebSocket 协议族,兼容 xiaozhi-server 开源协议, 并支持通过环境变量覆盖目标地址。

默认接入灵矽协议族

桌面端默认连接灵矽平台协议服务,主链路包含 hello/listen/二进制音频帧。

默认 WS: wss://xrobo-io.qiniuapi.com/v1/ws/

在 xiaozhi 协议上增强

保持核心消息结构一致,并扩展 features.mcp、intent_trace 等能力字段与事件语义。

增强能力: MCP + 可观测事件

兼容 xiaozhi-server

与 xiaozhi-server 开源版本兼容,可直接复用 hello/listen/音频帧主链路进行联调。

兼容范围: 握手 + 音频双向流

快速获取在线智能体接入信息

前往灵矽平台创建或选择在线智能体,获取可用于本软件的接入信息(如 WS 地址与鉴权参数)。

前往 linx.qiniu.com

核心功能

与当前 Rust 代码一致的能力清单

覆盖连接、音频、AEC、MCP、配置与可观测性,反映当前可运行版本的真实落地状态。

实时音频采集

基于 cpal 采集输入设备,支持将输出设备作为 loopback 输入源,覆盖会议下行回采场景。

cpalCoreAudioWASAPI

握手与网络探测

实现 hello 超时校验、session_id 确认与 ping/pong RTT 采样,连接状态可在 UI 持续观测。

tokio-tungsteniterustlsRTT

Opus 双向音频链路

上行 20ms 帧 Opus 编码发送,下行 Opus 包实时解码播放到所选输出设备。

Opus20msBinary Frame

消息可视化

聊天面板实时展示 STT/LLM/TTS/MCP/intent_trace 事件,并统计响应延迟。

GPUI实时渲染

AEC3 回声消除

支持运行时开关、共享路由强制开启与实时指标输出(stream delay/ERL/ERLE)。

aec310ms动态延迟

听写模式控制

支持 manual/auto/realtime 三种 listen mode,可在连接态动态下发到网关线程。

listenmanualrealtime

MCP 工具桥接

支持 stdio/sse/stream 三类上游,完成 initialize/tools/list/tools/call 闭环。

rmcpJSON-RPCtool routing

配置持久化与脱敏

WS 参数、UI 偏好、MCP 列表本地保存;token/authorization 等敏感字段展示自动脱敏。

settings.jsonserderedaction

UI 设计原则

为实时音频场景而设计

界面设计以信息密度与实时性为核心诉求,GPUI 原生渲染确保视觉一致性和极致响应速度。

GPU 优先渲染

GPUI 将所有 UI 元素直接提交至 GPU,绕过传统 CPU 光栅化路径。文本、阴影、动画均在 Shader 中计算,确保 60fps 流畅交互,即使在高密度信息展示场景下也无卡顿。

最小化视觉噪声

音频网关工具需长时间后台运行,UI 采用低对比度深色主题,减少视觉干扰。关键状态指标(连接状态、音频电平、延迟数值)以高亮色突出,非核心信息保持克制。

实时反馈优先

音频电平、WebSocket 状态、RTT、AEC 指标与 STT/TTS 消息需持续可见。界面通过事件节流保证高频更新下仍可读、可控。

单窗口紧凑布局

桌面工具应尽量减少窗口数量。主界面包含设备选择、消息流、状态面板三大区域,通过 GPUI Flex 布局自适应窗口尺寸,支持拖拽调整区域比例。

键盘与低干扰交互

支持 Enter 发送指令、连接与采集开关快速操作、设置面板集中编辑。避免多层弹窗与过度动画,保证调试过程稳定流畅。

配置与状态同源

WS 参数、AEC 开关、listen mode、MCP servers 在同一设置面板编辑并落盘,确保 UI 展示、运行时行为与持久化配置一致。

跨平台策略

一套核心,多平台适配

当前代码以 cpal + Opus + AEC3 + rmcp 为跨平台公共主干, 平台差异主要集中在设备路由和虚拟音频生态联调。

macOS 平台实现详情

音频采集

CoreAudio (cpal) + loopback 输入选择

音频输出

默认输出或 BlackHole 等虚拟设备

虚拟麦克风

通过输出设备路由到 BlackHole/Loopback

UI 渲染引擎

GPUI Metal 后端渲染

功能兼容矩阵

功能模块macOSWindowsLinux
音频设备枚举/选择
Opus 编解码
WebSocket 通信
AEC3 运行时开关
MCP 管理页 + 持久化
MCP tools 桥接
Loopback 回采
音频镜像监听
虚拟麦克风一键编排
应用签名分发
已实现 进行中 计划中

性能优化

实时性与稳定性并重

当前实现重点放在链路稳定、延迟可观测和故障隔离, 所有结论均以已落地代码路径为依据。

GPUI 原生 GPU 渲染

  • 桌面端 UI 使用 GPUI 渲染,不依赖 WebView
  • 音频高频事件在 UI 侧做节流刷新,降低重绘压力
  • 连接状态、RTT、AEC 指标与消息面板可并行更新

Tokio 异步运行时

  • 网关运行在独立 worker 线程中,内部持有 Tokio runtime
  • 命令通道与事件通道解耦 UI 与网络/音频任务
  • WebSocket 文本、二进制、pong 事件分别处理,互不阻塞

固定帧音频管线

  • 上行统一 20ms/16kHz/mono 口径,便于链路稳定与调试
  • Opus 编码使用固定码率与复杂度,降低抖动
  • 下行解码后按输出采样率重建播放缓冲并限长保护

AEC3 动态延迟校准

  • 采集与播放回调延迟、播放缓冲延迟持续采样
  • 按平滑策略更新 stream delay,减少回声残留与抖动
  • 支持运行时开关与共享路由强制开启策略

可降级的容错策略

  • 上行帧队列满时触发丢包告警,避免阻塞主循环
  • hello 握手、MCP 连接、MCP 调用均有超时边界
  • 单个 MCP server 异常时返回可用子集,不中断主链路

运行态可观测

  • 状态栏展示会话时长、上下行速率、RTT 与响应延迟
  • 设置面板展示 AEC stream delay/ERL/ERLE 等关键指标
  • 敏感字段在展示前统一脱敏,提升调试与安全平衡

模块化设计

Cargo Workspace 三层架构

核心逻辑、平台适配、UI 应用三层清晰分离,每层可独立编译测试, 便于未来扩展新平台或替换 UI 框架。

Cargo.toml — workspace
[workspace]
members = [
    "crates/host-core",       # 协议与模型
    "crates/host-platform",   # WS 适配层
    "apps/host-app-gpui",     # GPUI 桌面应用
]

[workspace.dependencies]
tokio              = "1.44"
tokio-tungstenite  = "0.26"
rustls             = "0.23"
cpal               = "0.15"
opus               = "0.3"
aec3               = "0.1"
gpui               = "0.2"
gpui-component     = "0.5"
rmcp               = "1.1"
serde/serde_json   = "1.0"
host-core

crates/host-core

核心协议与领域模型层,不依赖具体平台和 UI

  • `hello` / `listen` / `mcp` 文本协议模型
  • JSON-RPC 请求/响应结构定义
  • 16kHz/20ms/mono 音频帧常量
  • Gateway 状态与基础枚举类型
  • 协议序列化测试
host-platform

crates/host-platform

WebSocket 传输适配层,承载连接与事件流

  • URL/header 组装(Authorization/device-id/client-id)
  • hello 握手等待与超时控制
  • 文本/二进制/pong 事件分发
  • listen/mcp/jsonrpc 发送封装
  • WS 主链路集成测试
host-app-gpui

apps/host-app-gpui

桌面应用层,串联 UI、音频运行时与 MCP 网桥

  • GPUI 窗口、侧栏、聊天面板、设置面板
  • cpal 采集/播放 + Opus 编解码 + AEC3 指标
  • MCP server 管理页与本地探测
  • MCP JSON-RPC 路由(initialize/tools/list/tools/call)
  • 本地 settings.json 持久化与脱敏展示

依赖方向

host-app-gpui
-->host-platform
-->host-core

host-app-gpui 同时依赖 host-platform 与 host-core

产品路线图

从 MVP 到全功能平台

路线图已按当前代码状态刷新:先完成跨平台联调与发布质量,再扩展会议智能能力。

MVP

最小可行产品

进行中
Cargo Workspace + GPUI 桌面壳
WebSocket 双向通信(hello / listen / 音频帧)
GPUI 聊天消息可视化界面
cpal 麦克风采集 + Opus 编码上行
下行 Opus 解码 + 扬声器播放
输入/输出设备列表选择
MCP 管理页 + tools 桥接闭环
Loopback 回采与音频镜像
AEC3 实时回声消除 + 指标面板
跨平台实机联调(Windows/Linux)
V1.0

稳定发布版

计划中
虚拟麦克风一键自动编排
网关自动重连与健康检查
VAD 智能打断 + 静音检测
MCP 调用审计与指标看板
macOS + Windows 应用签名分发
系统托盘常驻 + 快捷键控制
音频质量监控仪表板
V2.0

能力扩展版

规划中
Linux PulseAudio/PipeWire 支持
多角色 AI(主持人 / 客服 / 秘书)
实时会议翻译
AI 自动参会(日历集成)
插件系统支持自定义 AI 后端
团队协作与会议管理后台