akkupratap323/pharma-medinfo-voice

GitHub: akkupratap323/pharma-medinfo-voice

面向制药医学信息线的实时多智能体语音 AI 系统,融合双通道情绪检测、FDA 标签 RAG 与合规关卡,支持通话中智能体实时转接。

Stars: 0 | Forks: 0

# PersonaAI **生产级实时语音 AI,具备多智能体人格、混合情绪检测、实时坐席转接和动态可视化 UI —— 端到端延迟均在 1–1.5 秒内。** 🔗 **在线演示:** [https://3.6.92.112.nip.io/](https://3.6.92.112.nip.io/) ## 截图


## 这是什么? PersonaAI 是一个基于 [Pipecat](https://github.com/pipecat-ai/pipecat) 框架 (v0.0.98) 构建的全栈语音对话助手。你说话 —— AI 倾听、理解你的情绪、思考、用恰当的声音回复,并可选地渲染实时可视化 UI 卡片 —— 所有这一切都在实时进行。 它支持 **6 种不同的 AI 智能体人格**,每种人格都有自己独特的声音、性格和领域专长。各个智能体之间相互知晓,并可以 **在通话过程中进行转接** —— 旧的智能体会说一句过渡语,新的智能体会带着对你对话内容的完整上下文继续服务。 ## 核心功能 ### 6 个专家级 AI 智能体(完全互联) 每个智能体都知道其他所有智能体,并且可以在通话中途将你转接。语音会瞬间切换。新智能体会接收到你之前讨论的内容并自然地继续对话 —— 没有尴尬的重新开始。 | 智能体 | 角色 | 专长 | 语言 | |-------|------|-----------|----------| | **Brooke** | 通用助手 | 了解各方面的知识,负责将你引导至合适的人 | English | | **Blake** | 问题解决者 | 故障排除 —— 技术问题、中断的工作流、僵持的决策 | English | | **Arushi** | 印地英语全能手 | 温暖的本土助手 —— 从科学到宝莱坞,全用 Hinglish 交流 | Hinglish | | **Morgan** | 商业战略家 | 战略、销售、融资、走向市场、谈判 | English | | **Daniel** | 技术专家 | 编码、AI/ML、分布式系统、云基础设施、语音 AI | English | | **Naya** | 生活方式教练 | 健康、健身、旅行、美食、自我提升、人际关系 | English | **实时坐席转接的工作原理:** 1. 任何智能体都可以在对话中途调用 `transfer_to_agent()` 2. 旧的智能体会说一句简短的交接语:*“让我把你转接给 Daniel —— 这是他的专业领域。”* 3. LLM 系统提示词会静默切换到新智能体的人格 4. TTS 语音通过 `tts.set_voice(voice_id)` 实时切换 —— 无需重新连接,无需重新加载 5. 前端的球体颜色、头像和 UI 主题色都会瞬间更新 6. 新智能体会带着完整的上下文继续服务:*“Brooke 已经告诉我了 —— 你刚才在问关于分布式缓存的事情,对吧?”* ### 混合情绪检测(原创研究) 本项目的核心研究贡献:一套 **双通道加权融合情绪检测系统**,它在后台非阻塞运行 —— 为语音管线增加零延迟。 #### 架构 ``` Audio Frames ──► MSP-PODCAST wav2vec2 ──► arousal, dominance, valence (70% weight) \ ──► Weighted Fusion ──► Emotion Label ──► Voice Switch / Text Transcription ──► Google Gemini ──► text sentiment (30% weight) ``` #### 通道 1:音频情绪 (MSP-PODCAST wav2vec2) - **模型:** `audeering/wav2vec2-large-robust-12-ft-emotion-msp-dim` - **训练数据:** MSP-Podcast v1.7 —— 真实的播客对话(非表演式语音) - **输出:** 维度情绪 —— 唤醒度 (0–1)、支配度 (0–1)、效价 (0–1) - **为什么使用维度模型?** 基于表演数据集训练的分类模型(开心/悲伤/愤怒)在自然对话语音中会失效。基于真实对话训练的维度模型能更好地泛化到真实世界的韵律中。 - **针对 4GB RAM / 2 vCPU Lightsail 的优化:** - INT8 动态量化 → 推理速度提升 2–3 倍,模型占用空间缩小 75% - 线程调优:2 个线程匹配 vCPU 数量,防止 CPU 抖动 - 为 Lightsail 的 Intel Xeon CPU 启用 Intel MKL-DNN - 定期 GC 以防止长会话中的内存碎片化 #### 通道 2:文本情感 (Google Gemini Flash) - **模型:** 通过 Google AI API 调用 Gemini 2.0 Flash - **输入:** 原始转录文本 - **输出:** 情感标签 + 置信度分数 - **作用:** 捕捉被掩饰的情绪 —— 比如有人用沮丧的声音说“我没事”。音频捕捉到了挫败感;文本捕捉到了字面意思。融合机制负责解决这种冲突。 #### 融合逻辑 ``` final_emotion = (audio_result × 0.7) + (text_result × 0.3) ``` 当置信度较低时进行动态权重调整。失配检测阈值设为 0.8 —— 当音频和文本出现强烈分歧时(潜在的讽刺),两个信号都会被标记,系统会使用保守的兜底策略。 #### 维度到语音语气的映射 | 唤醒度 | 效价 | 映射语气 | |---------|---------|-------------| | 高 | 低(消极) | frustrated | | 高 | 高(积极) | excited | | 低 | 低(消极) | sad | | 低 | 高(积极) | neutral / calm | #### 稳定性系统 - 情绪需要满足 **2 帧稳定性** 才能触发语音切换(防止瞬态读数引起的抖动) - 检测到的情绪具有 **10 秒的 TTL** —— 陈旧的读数不会在长时间的沉默中持续存在 - 语音切换是非阻塞的:通过后台异步任务执行,管线永远不会等待情绪推理 ### 语音管线 (Pipecat) ``` Mic Input │ ▼ [Silero VAD] (conf=0.92 — only clear direct speech triggers) │ ▼ [Deepgram Nova-3 STT] (streaming, 300ms endpointing for SmartTurn) │ ▼ [ToneAwareProcessor] ← MSP-PODCAST + Gemini hybrid emotion (background async) │ ▼ [STTMuteFilter] (mutes STT during initial greeting — prevents self-interruption) │ ▼ [SmartTurn v3] (ONNX ML end-of-turn detection — replaces silence heuristics) │ ▼ [LLM Context Aggregator + DeepSeek V3] │ ├─► call_rag_system() → LightRAG → Answer + optional A2UI visual card ├─► transfer_to_agent() → Live agent swap (voice + persona + context) └─► end_conversation() → Farewell TTS + graceful disconnect │ ▼ [VisualHintProcessor] (word-by-word streaming to frontend for A2UI) │ ▼ [TextFilterProcessor] (strips markdown before TTS) │ ▼ [Cartesia Sonic-3 TTS] (word-level timestamps, emotion voice control) │ ▼ Audio Output ``` **关键设计决策:** - **选择 Silero VAD 而非 Deepgram VAD** —— 本地控制;Deepgram VAD 曾导致错误的打断 - **SmartTurn v3 ONNX** —— 用 ML 的轮次结束预测取代了简单的静音检测 - **非阻塞情绪** —— 后台异步任务,对管线延迟影响为零 - **立即强行介入** (`min_words=0`) —— 任何语音都会瞬间停止 TTS - **纯 CPU PyTorch** —— 适配每月 12 美元的 Lightsail 实例上的 2GB RAM 限制 - **连接池** —— 共享的 `httpx` 异步客户端用于 LightRAG 查询 ### A2UI —— 语音驱动的可视化卡片 当 LLM 通过 RAG 回答查询时,它还可以触发在前端渲染的 **动态可视化卡片** —— 无需用户操作。卡片会与语音回复一同出现。 模板选择采用三层系统: 1. **显式关键词匹配** —— 快速的、基于模式的检测 2. **语义匹配** —— MiniLM 句子转换器用于模糊意图匹配 3. **兜底** —— 默认使用 `simple-card` 可用模板:`simple-card`、`template-grid`、`timeline`、`contact-card`、`comparison-chart`、`stats-flow-layout`、`team-flip-cards`、`service-hover-reveal`、`magazine-hero`、`faq-accordion`、`image-gallery`、`video-gallery`、`sales-dashboard` ### RAG (检索增强生成) 知识查询通过 **LightRAG** 进行路由 —— 这是一个基于图的 RAG 系统,能够理解实体关系,而不仅仅是关键词相似度。 - 通过 `/query/stream` 流式响应 - 通过 `/query` 非流式兜底 - 使用 `X-API-Key` 标头进行身份验证 - 通过共享的 `httpx` 异步客户端进行连接池管理 ## 技术栈 | 层级 | 技术 | |-------|-----------| | **语音管线** | Pipecat v0.0.98 | | **STT** | Deepgram Nova-3 | | **LLM** | DeepSeek V3 (`deepseek-chat`) | | **TTS** | Cartesia Sonic-3 (带词时间戳 + 情绪控制) | | **音频情绪** | MSP-PODCAST wav2vec2 (`audeering/wav2vec2-large-robust-12-ft-emotion-msp-dim`) | | **文本情感** | Google Gemini 2.0 Flash | | **融合** | 定制 70/30 加权混合检测器 | | **RAG** | LightRAG (基于图) | | **轮次检测** | SmartTurn v3 ONNX | | **VAD** | Silero VAD (conf=0.92) | | **后端** | FastAPI + uvicorn | | **前端** | TypeScript + Vite | | **实时传输** | Pipecat RTVI WebSocket | | **部署** | 在 AWS Lightsail 上使用 Docker + Caddy (自动 HTTPS) | | **CI/CD** | GitHub Actions → GHCR → SSH 部署 | ## 架构 ``` Browser (TypeScript/Vite) │ │ WebSocket (/ws) — Pipecat RTVI Protocol │ FastAPI (app/main.py) — port 7860 │ ├─ Pipecat Pipeline (per session) │ ├─ STT: Deepgram Nova-3 │ ├─ LLM: DeepSeek V3 │ ├─ TTS: Cartesia Sonic-3 │ ├─ Emotion: HybridEmotionDetector (background async) │ │ ├─ MSP-PODCAST wav2vec2 (audio channel, 70%) │ │ └─ Gemini Flash (text channel, 30%) │ ├─ Turn: SmartTurn v3 ONNX │ └─ A2UI: VisualHintProcessor → frontend card render │ ├─ Session Management │ ├─ ConnectionManager (max 20 concurrent sessions) │ ├─ Per-session VoiceAssistant isolation │ └─ Live agent transfer (in-session swap, no reconnect) │ └─ External Services ├─ LightRAG (graph RAG server) ├─ Deepgram (STT streaming API) ├─ Cartesia (TTS API) └─ Google AI (Gemini text sentiment) ``` ## 本地运行 ### 前置条件 - Python 3.10+ - Node.js 18+ - API 密钥: `DEEPGRAM_API_KEY`, `DEEPSEEK_API_KEY`, `CARTESIA_API_KEY`, `CARTESIA_VOICE_ID`, `GOOGLE_API_KEY`, `LIGHTRAG_API_KEY`, `LIGHTRAG_BASE_URL` ### 后端 ``` python -m venv .venv && source .venv/bin/activate pip install -r requirements.txt cp .env.example .env # Fill in your API keys export PYTHONPATH=$(pwd) python app/main.py # → http://localhost:7860 ``` ### 前端 ``` cd client npm install npm run dev # → http://localhost:5173 npm run build # Production build npm run typecheck # TypeScript type checking ``` ### 测试 ``` pytest tests/ # All tests pytest tests/unit/ # Unit tests only pytest tests/integration/ # Integration tests only ``` ## Docker 部署 ``` cd deployment/docker docker-compose -f docker-compose.https.yml up -d ``` Caddy 处理自动 HTTPS (通过 nip.io 使用 Let's Encrypt)。后端在端口 7860 上运行,前端在 80/443 上运行。 ## 配置 所有设置都位于 `app/config/config.yaml` 中,在启动时加载,并使用来自 `.env` 的 `${ENV_VAR}` 进行变量替换。 关键部分: | 部分 | 控制内容 | |---------|-----------------| | `conversation.system_prompt` | 默认智能体 (Brooke) 系统提示词 | | `personas.agents` | 所有 6 个智能体定义 —— 语音 ID、性格、问候语 | | `server.vad` | VAD 置信度和音量阈值 | | `server.smart_turn` | SmartTurn ONNX 超时和 CPU 设置 | | `server.emotion_detection_enabled` | 切换混合情绪检测开关 | | `a2ui` | 模板层级模式、置信度阈值、流式传输 | | `stt.config` | Deepgram 流式设置、修正 | ## 项目结构 ``` app/ ├── main.py # FastAPI entrypoint ├── core/ │ ├── voice_assistant.py # Pipeline assembly + agent transfer wiring │ └── server.py # WebSocket server + session management ├── services/ │ ├── conversation.py # LLM context, function calling, agent transfer logic │ ├── msp_emotion_detector.py # MSP-PODCAST wav2vec2 audio emotion (INT8 quantized) │ ├── hybrid_emotion_detector.py # 70/30 fusion of audio + text sentiment │ ├── llm_text_sentiment.py # Google Gemini text sentiment │ ├── rag.py # LightRAG graph RAG integration │ └── a2ui/ # Agentic UI — template selection + rendering ├── processors/ │ ├── tone_aware_processor.py # Emotion detection + Cartesia voice switching │ ├── smart_interruption.py # Context-aware barge-in (disabled — StartFrame bug) │ └── text_filter.py # Strips markdown before TTS └── config/ ├── config.yaml # All configuration (env var substitution) └── loader.py # Config loader with ${VAR} substitution client/src/ ├── app.ts # Main app — RTVI client, agent transfer, orb, UI ├── components/ │ ├── EmotionAnalysisWidget/ # Live emotion visualization panel │ ├── KnowledgeGraphWidget/ # RAG knowledge graph (Sigma.js + Graphology) │ ├── SynchronizedAnalysisWidget/ # Topic flow analysis │ └── a2ui/ # A2UI visual card renderers └── style.css # Agent color theming + transfer animations ``` ## 已知限制 - `SmartInterruptionProcessor` 已禁用 —— StartFrame 排序 bug(正在修复中) - AIC 语音增强已禁用 —— SDK v1/v2 不匹配 - MSP-PODCAST 模型在较新的 `transformers` 版本上会回退到纯文本情绪 - INT8 量化不支持 Apple Silicon (M1/M2/M3) —— 会自动跳过 - Koala 噪声抑制需要付费 API 密钥;WebRTC AEC 用作免费兜底方案 ## 部署 **在线:** [https://3.6.92.112.nip.io/](https://3.6.92.112.nip.io/) **基础设施:** AWS Lightsail —— 每月 12 美元 (2GB RAM, 2 vCPU, 60GB SSD, 1.5TB 传输量) **CI/CD:** GitHub Actions → Docker 构建 → 推送到 GHCR → SSH 拉取 + 重启 **HTTPS:** 通过 nip.io 使用 Caddy 自动配置 Let's Encrypt **RAM 管理:** 2GB swap + INT8 量化用于受限硬件上的模型加载
标签:RAG, 人工智能, 医疗信息学, 多智能体, 实时语音处理, 用户模式Hook绕过, 语音AI, 请求拦截, 逆向工具