ARCHITECTURE_SUMMARY.md 5.3 KB

ASR 项目架构总结

概述

该仓库包含一个实时语音识别和 AI 助手系统,主要由以下部分组成:

  1. asr_agent/ - 后端 ASR + LLM + TTS Worker 逻辑。
  2. flutter_asr_client/ - Flutter 移动客户端应用。
  3. livekit-server/ - LiveKit 部署配置。

系统使用 LiveKit 进行实时音频传输和数据通道消息传递,并结合本地 ASR 和可选的云服务备用方案。


1. 后端 (asr_agent/)

1.1 入口与服务层

  • dispatcher.py
    • 提供 POST /connect:创建唯一房间、生成 LiveKit token,并启动对应房间的 Worker
    • 提供 GET /health:检查并清理已结束的 Worker。
    • 使用 aiohttp 提供 HTTP 接口。

1.2 Worker 运行时

  • worker.py
    • Worker 作为机器人连接到 LiveKit 房间。
    • 监听参与者的远端音频轨道。
    • 执行管道:VAD -> ASR -> LLM -> TTS。
    • 通过 LiveKit 数据通道发布实时转写和回复事件。
    • 通过本地音频轨道发布合成语音。

1.3 语音处理流水线

  • VAD:优先使用 Silero VAD ONNX 模型,否则回退到能量检测。
  • ASR:
    • 默认使用本地 Qwen3-ASR 模型,封装在 whisper_asr/qwen_engine.py
    • 可通过 ASR_PROVIDER=mimo 切换为远程 Mimo ASR。
  • LLM:
    • 默认使用本地 vLLM REST/SSE 接口(VLLM_URL)。
    • 可通过 LLM_PROVIDER=mimo 切换为云端 Mimo LLM。
  • TTS:
    • 使用 Mimo API 进行语音合成。
    • _TTSSegmenter 实现二级分句,保证语音播放更流畅。

1.4 支持模块

  • whisper_asr/audio_processor.py
    • 负责音频缓冲、PCM 转换、语音活动检测、队列管理。
  • whisper_asr/qwen_engine.py
    • 封装 Qwen3-ASR 模型加载和转写接口。

1.5 关键技术

  • livekit Python RTC 客户端
  • onnxruntime + Silero VAD
  • qwen_asr 本地语音模型
  • aiohttp 异步 Web 服务器
  • pyjwt 生成 LiveKit token

2. Flutter 客户端 (flutter_asr_client/)

2.1 应用入口与路由

  • lib/main.dart
    • 启动 ProviderScope,并注入 LiveKitServiceImpl
  • lib/app.dart
    • 使用 Riverpod 和 GoRouter 创建 MaterialApp.router
  • lib/router/app_router.dart
    • 定义主应用导航:
    • /tasks
    • /records
    • /reports
    • /profile
    • /recording

2.2 状态与业务逻辑

  • lib/providers/livekit_providers.dart
    • 定义 LiveKitService 抽象。
    • 暴露消息流和房间名提供者。
  • lib/providers/settings_providers.dart
    • 提供应用设置和服务 URL。
  • lib/pages/recording/notifiers/recording_notifier.dart
    • 管理录音生命周期。
    • 请求 Dispatcher 房间信息。
    • 连接 LiveKit 并订阅服务端消息流。
    • 处理实时转写、AI 回复、暂停/恢复和结束录音。

2.3 LiveKit 服务封装

  • lib/services/livekit_service.dart
    • 实现 LiveKitService
    • 连接 LiveKit 并发布麦克风音频。
    • 监听数据通道中的 transcription 消息。
    • 包含开发环境下的 JWT 生成逻辑。

2.4 音频采集服务

  • lib/services/audio_capture_service.dart
    • 使用 record 插件采集 PCM16 音频。
    • 暴露音量流和录音开始/停止方法。
    • 注意:应用真实音频传输路径是通过 LiveKit 麦克风发布。

2.5 UI 层

  • lib/pages/shell/app_shell.dart
    • 底部导航壳,带中央 FAB 进入录音。
  • lib/pages/recording/recording_page.dart
    • 录音页面,显示实时话语、AI 回复、连接状态和控制按钮。

2.6 数据模型

  • lib/models/websocket_message.dart
    • 定义客户端请求消息与服务端消息类型。
    • 服务端消息包括 connectedpartialutterancereplyreply_partialtranscripterror

3. LiveKit 部署

  • livekit-server/docker-compose.yml
  • livekit-server/livekit.yaml

这些文件配置了应用和后端使用的 LiveKit 实时音频房间服务。


4. 端到端流程

  1. Flutter 应用进入录音页面。
  2. RecordingNotifier 调用 Dispatcher 的 /connect
  3. Dispatcher 创建 LiveKit 房间并返回 URL/room/token。
  4. Flutter 连接 LiveKit 并发布麦克风音频流。
  5. Dispatcher 为该房间启动一个 Worker
  6. Worker 加入房间,订阅参与者音频并运行 VAD。
  7. 语音片段通过 ASR 转写。
  8. 转写与回复更新通过 LiveKit 数据通道传递给客户端。
  9. Worker 还可能合成回复音频并发布到房间。
  10. 客户端显示实时文本,并可听到 AI 语音。

5. 系统特性

  • 房间级 Worker 模型:每次连接创建一个 Worker。
  • 音频轨道 + 数据通道结合架构。
  • 本地/云混合能力:本地 Qwen ASR / vLLM,可选 Mimo 备用。
  • Flutter 前端使用 Riverpod 状态管理和 GoRouter 路由。
  • 后端通过环境变量配置,前端通过 SharedPreferences 配置。

6. 配置点

  • 后端环境变量:
    • LIVEKIT_URLPUBLIC_LIVEKIT_URL
    • ASR_MODEL_PATH
    • VLLM_URLLLM_MODEL
    • MIMO_KEYMIMO_API_BASE
    • LLM_PROVIDERASR_PROVIDER
  • Flutter 设置:
    • Dispatcher URL
    • LiveKit URL
    • WebSocket 后端 host/port

7. 备注

  • Dispatcher 使用开发 JWT 密钥和房间创建逻辑,生产环境应替换。
  • Flutter 应用中录音状态包含固定测试/演示元数据。
  • 后端 Worker 目前将转写与 AI 回复生成放在同一个服务流中。