hhs d78cdb509d feat: 前端 401 拦截器 — access token 过期时自动刷新并重试原请求
api.ts:
- 增加 setAuthCallbacks 回调注入机制(避免 api/auth 循环依赖)
- request() 对非公开路径自动附加 Authorization header
- 收到 401 时自动触发 refresh token 刷新,成功后重试原请求
- 并发保护:多个 401 只触发一次 refresh,其余等待同一 Promise
- refreshTokenDirect 内部方法绕过 401 拦截避免递归

auth.tsx:
- 用 ref 保存 persistAuth/scheduleRefresh 最新引用(避免闭包陈旧)
- 初始化时调用 setAuthCallbacks 注入认证回调
2026-06-20 14:57:27 +08:00
2026-06-14 23:59:00 +08:00
2026-06-19 18:41:35 +08:00
2026-06-12 10:50:07 +08:00
2026-06-14 23:59:00 +08:00

CamTalk

多模态实时 AI 视觉对话助手。用户通过摄像头和麦克风与 AI 交互AI 理解视觉场景和语音输入后,以文字和语音形式给出自然回应。

⚠️ 注意:由于线上地址使用 HTTP 协议,浏览器默认禁止在非 HTTPS 环境下调用摄像头和麦克风。需要按以下步骤配置 Chrome 浏览器:

  1. 在浏览器地址栏中输入 chrome://flags/#unsafely-treat-insecure-origin-as-secure,回车
  2. Insecure origins treated as secure 选项设置为 Enabled(已启用)
  3. 在输入框中输入 http://8.161.227.145:9000 地址
  4. 点击右下角弹出的 Relaunch 按钮,自动重启浏览器

重启后即可在该 HTTP 地址下正常调用摄像头和麦克风。

架构

三层系统,前端做轻量预处理,后端做智能编排,云端 AI 服务按需调用:

graph TB
    subgraph client[浏览器客户端]
        A1[媒体采集]
        A2[VAD 语音检测]
        A3[关键帧检测]
        A4[UI 渲染]
    end

    subgraph gateway[Go 网关 :8080]
        B1[WebSocket Handler]
        B2[Session Manager]
        B3[AI Orchestrator]
        B4[REST API]
    end

    subgraph cloud[云端 AI 服务]
        C1[STT 语音识别]
        C2[LLM 多模态推理]
        C3[TTS 语音合成]
    end

    client <-->|WebSocket| gateway
    gateway <-->|HTTP| cloud

关键模式LLM 文本流和 TTS 音频流并行推送,用户先看到文字、紧接着听到语音,感知延迟 < 0.5 秒。

技术栈

层级 技术
前端 React 18, TypeScript, Vite, @ricky0123/vad-web
后端 Go, Gin, gorilla/websocket, Viper, Zap
STT Deepgram默认 / MiMo ASR
LLM GPT-4o默认通过 OpenAI 兼容接口可切换)
TTS OpenAI TTS默认 / MiMo TTS

项目结构

CamTalk/
├── frontend/                   # 浏览器客户端
│   └── src/
│       ├── components/         # UI 组件
│       │   ├── CameraManager/  # 摄像头流采集
│       │   ├── MicManager/     # 麦克风音频采集
│       │   ├── EdgeProcessor/  # VAD + 关键帧检测
│       │   ├── WebSocketManager/ # WS 连接管理
│       │   ├── ChatPanel/      # 消息展示
│       │   ├── VideoPreview/   # 摄像头画面预览
│       │   ├── ConfigPanel/    # 配置面板
│       │   └── Toast/          # 通知提示
│       ├── hooks/              # 自定义 Hooks
│       │   ├── useVisionSession.ts  # 核心会话 Hook
│       │   └── useObservationMode.ts # 观察模式
│       ├── lib/                # 工具库
│       │   ├── websocket.ts    # WebSocket 连接管理
│       │   ├── audio.ts        # 音频编码
│       │   ├── ttsPlayer.ts    # TTS 播放器
│       │   └── sampling.ts     # 采样策略
│       └── types/              # TypeScript 类型定义
├── backend/                    # Go 网关
│   ├── cmd/server/             # 入口
│   └── internal/
│       ├── ai/                 # AI 服务抽象层
│       │   ├── llm/            # LLM 服务OpenAI 兼容)
│       │   ├── stt/            # STT 服务Deepgram/MiMo
│       │   └── tts/            # TTS 服务OpenAI/MiMo
│       ├── orchestrator/       # AI 编排器STT→LLM→TTS 管道)
│       ├── session/            # 会话管理Memory/Redis
│       ├── ws/                 # WebSocket Handler
│       ├── api/                # REST API
│       ├── config/             # 配置管理
│       ├── models/             # 数据模型
│       ├── errors/             # 错误码
│       └── logger/             # 日志
├── docs/                       # 设计文档
└── CLAUDE.md                   # Claude Code 指引

快速开始

前置条件

  • Node.js >= 18
  • Go >= 1.24

前端

cd frontend
npm install
npm run dev          # Vite 开发服务器 http://localhost:5173

后端

cd backend
go mod download
go run ./cmd/server  # 启动网关 :8080

配置

后端配置文件位于 backend/config.yaml,支持环境变量覆盖(前缀 CAMTALK_)。

# 最小启动(需要至少一个 AI 服务的 API Key
cd backend
CAMTALK_AI_LLM_API_KEY=sk-xxx \
CAMTALK_AI_STT_API_KEY=xxx \
go run ./cmd/server

配置优先级:环境变量 > config.{env}.yaml > config.yaml > .env

WebSocket 协议

连接地址:ws://localhost:8080/ws

所有消息为 JSON 文本帧,统一信封格式 {type, request_id?, timestamp?}

客户端 → 服务端queryconfiginterruptping 服务端 → 客户端connectedstt_resultllm_chunkllm_donetts_audioerrorpong

完整协议见 docs/03-接口文档.md

文档

文档 内容
01-项目概述 项目目标与核心挑战
02-系统架构 三层架构、技术栈、部署方案
03-接口文档 WebSocket 协议、REST API、配置管理
04-技术选型 AI 服务栈、持久化层、前端边缘处理选型
05-用户故事 用户场景与优先级
06-语音交互 VAD → STT → LLM → TTS 全链路
07-视觉理解 帧采样、关键帧检测、多模态输入
08-成本控制 采样策略、端云协同、模型分级

License

MIT © XEngineers

Description
No description provided
Readme MIT 3.5 MiB
Languages
Go 53.5%
TypeScript 34%
CSS 11.7%
Shell 0.3%
Dockerfile 0.3%
Other 0.2%