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, 请求拦截, 逆向工具