Skip to content
跳到项目内容
全部项目
AI 产品/本地原型

语音交互应用平台

连接 ASR、语言模型与语音合成

RustAxumWebSocketMCP
应用配置与原生语音资源01 / 02
01

核心业务

语音应用平台将项目、应用、厂商资源和发布版本分开管理。应用可以选择 ASR、LLM、TTS 与 MCP 工具;已有资源配置可以复用,但修改厂商资源不会直接改写已经发布的应用快照。

运行端既处理 ASR → LLM → TTS 级联,也处理阿里、豆包等厂商实时协议。工程重点是轮次、传输、模型配置和工具调用之间的状态一致性,尤其要区分服务端已生成回复、浏览器已收到音频和用户已播放完成。

应用与发布
项目和应用配置保存为版本快照,体验入口绑定发布配置,支持回滚。
厂商资源
模型目录、地址、鉴权方式和能力配置按 Provider 管理,凭据只在服务端使用。
实时会话
ASR、模型回复、音频播放和 MCP 调用按会话与轮次归属,终态后拒绝迟到事件。
02

技术栈

界面
JavaScript · 浏览器音频 · WebSocket
服务端
Rust · Axum · Tokio · SQLx
数据与校验
SQLite · JSON Schema · 加密凭据存储
接入协议
ASR / LLM / TTS Adapter · MCP
03

系统架构与部署

管理端生成应用快照,运行端装载固定配置。厂商协议适配与 MCP 工具通过会话编排连接,数据记录保留轮次和故障原因。

平台后端

Rust / Axum / Tokio / SQLite

管理应用、资源、会话、发布快照与权限,持久化轮次和处理阶段。

实时连接

WebSocket / 厂商 Adapter

代理音频与事件,分别约束上行厂商连接和下行浏览器连接。

浏览器体验

WebAudio / 测试麦克风 / 配置界面

接收正式回复与音频,展示会话阶段和故障状态。

04

核心业务链路

配置更新与已发布应用隔离

厂商资源 → 应用配置 → 发布快照 → 会话初始化

模型发现只更新资源目录,不自动切换应用模型;应用重新发布后才使用新选择。拉取目录失败保留上一次成功结果,过期的异步响应不能覆盖并发修改后的账号配置。

传输失败后保持不可恢复的轮次终态

写入期限 → 首个故障原因 → 停止事件 → 持久化 failed / cancelled

上游和浏览器写入设置期限,失败后不再复用对应 sink。客户端正常关闭保留取消原因;故障后到达的完成、输入或输出事件不会把已失败轮次改成成功。初始化失败只向仍健康的浏览器通知。

05

关键机制与取舍

跨厂商协议统一的是业务语义

级联 ASR / LLM / TTS 与厂商实时接口的帧格式、轮次结束和音频输出不同,简单转发无法形成可解释的应用状态。

将厂商协议封装为 Adapter,平台会话保存统一的轮次与处理阶段;正式回复、思考内容与音频结果分别处理。模型目录刷新有大小、超时和重定向限制,不将上游错误正文透传到界面。

应用配置面向能力和资源,实时运行仍保留厂商协议特征,避免通过隐藏差异制造错误兼容。

双跳连接的首故障与关闭语义

上游先失败、浏览器随后关闭时,收尾通知又可能失败。如果每次错误都覆盖原因,真实问题会被最后一个连接错误掩盖。

记录首个传输故障,同时独立标记浏览器是否可写。失败或已发送关闭帧后拒绝后续事件;数据库暂时失败时停止业务接收,并在关闭路径按原始原因重试保存。

正常取消、上游发送失败和浏览器发送失败有明确区别,迟到事件不能恢复终止轮次。

06

实践成果与验证

418 项

Rust 回归

实时传输与轮次故障专项后的本地全量结果;另有两项浏览器测试单独执行。

7 个场景

浏览器语音验证

使用 Chrome WebSocket、WebAudio 与本地厂商协议模拟,覆盖桌面和手机布局。

5 秒

写入期限

浏览器下行与厂商上行设置期限,失败后不继续复用连接写端。

  • 项目、应用、资源发现、MCP 和发布回滚构成本地平台闭环。
  • 传输故障、正常关闭与迟到事件经过故障注入和浏览器协议模拟验证,结果不等同于真实厂商与实体设备验收。

继续浏览

语音交互应用平台 · 应用配置与原生语音资源
100%
语音交互应用平台放大预览

应用配置与原生语音资源

别急,先让缓存热一下。