基于 LAM (Large Avatar Model) 数字人的 AI 模拟面试系统。项目保留了 OpenAvatar 的低延迟语音链路,同时把面试能力拆成独立项目:支持简历驱动问答、LangGraph 多智能体工作流、实时情绪评估、面试报告生成,以及 LAM 数字人实时播报。
- 低延迟全双工语音面试:Silero VAD + Smart Turn EOU + Semantic Turn Detector,支持打断和连续追问
- LAM 数字人播报:TTS 音频驱动 LAM Audio2Expression,输出口型和面部表情
- 简历驱动题目规划:支持 PDF / DOCX / TXT / MD 简历上传,自动分析背景并生成面试问题
- LangGraph 多智能体编排:面试官、简历分析、题目规划、对话分析、评估、报告生成协同工作
- 双路径情绪评估:候选人每轮回答后先做低延迟规则评估,再异步做 LLM refine,指导后续追问策略
- 会话落盘与可追踪调试:
runtime/sessions/<session_id>/session.json持久化题目、轮次、情绪状态、分析结果与报告状态 - 多格式报告:自动生成 Markdown、HTML 预览和 PDF 报告
- 多传输模式:支持 WebRTC、WebSocket 以及 LAM 前端页面
- 前端创建
session_id,上传简历并轮询题目规划状态。 - 用户进入 RTC / WS 面试页,与数字人面试官开始对话。
- VAD 检测候选人发言结束后,ASR 输出文本给
InterviewAgentHandler。 InterviewerAgent基于当前题目、最近对话、简历摘要和情绪上下文生成下一轮回复。- 回复文本进入 TTS,再驱动 LAM 数字人播报。
- 面试结束后后台自动运行对话分析、综合评估和报告生成。
当前 emotion 模块只依赖候选人的文本回答,不使用摄像头或音频情绪特征。
- 候选人本轮文本到达后,
InterviewGraph.fast_assess_emotion(...)立即执行规则评估。 - 规则评估结果会立刻写入会话状态:
latest_fast_emotion_assessmentlatest_emotion_assessmentlatest_interview_policy
InterviewerAgent在生成下一轮 prompt 时,会优先读取:latest_refined_emotion_assessment- 否则回退到
latest_fast_emotion_assessment - 再回退到
latest_emotion_assessment
- 面试官当前轮回复结束后,后台线程再触发一次 LLM refine:
- 使用
EmotionAgent.assess(...) - 默认模型
emotion_model_name = qwen-plus - 结果写入
latest_refined_emotion_assessment
- 使用
- refine 后的 assessment 会继续覆盖后续 prompt 上下文和
latest_interview_policy。
Emotion 的目标不是临床判断,而是给面试官一个追问策略信号,例如:
confident:可以继续深入stable:正常推进anxious:降难度、减压、先给台阶
Frontend (Vue 3)
├─ dashboard / interview pages
├─ WebRTC / WebSocket client
└─ session_id persistence
│
▼
FastAPI + ChatEngine (src/demo.py)
├─ Client Handler
│ └─ LamClient / RTC
├─ Voice Pipeline
│ ├─ SileroVad
│ ├─ SenseVoice
│ ├─ SemanticTurnDetector
│ └─ CosyVoice
├─ Interview Pipeline
│ ├─ InterviewAgentHandler
│ ├─ InterviewGraph
│ ├─ InterviewerAgent
│ ├─ EmotionAgent
│ ├─ DialogueAnalyzerAgent
│ ├─ EvaluationAgent
│ └─ ReportGeneratorAgent
└─ Avatar Pipeline
└─ LAM Audio2Expression
| Agent | 职责 |
|---|---|
ResumeAnalyzerAgent |
解析简历,提取技能、经历、项目亮点 |
QuestionPlannerAgent |
结合简历生成题目计划和追问方向 |
InterviewerAgent |
负责实时面试问答、追问和结束判断 |
EmotionAgent |
基于候选人回答输出交互状态和追问策略 |
DialogueAnalyzerAgent |
面试结束后分析覆盖度、表达质量和技术深度 |
EvaluationAgent |
输出结构化评估结果、风险和录用建议 |
ReportGeneratorAgent |
生成 Markdown 报告,再派生 HTML/PDF |
- Python 3.11
- 推荐使用
uv - CUDA 环境可用
- Node.js 仅在需要重建前端时使用
至少需要:
export DASHSCOPE_API_KEY=your_key如果使用兼容 OpenAI 的其他服务,也可以按需配置对应 api_url / api_key。
cd /media/liang/12T/han/OpenAvatarInterview
uv synccd /media/liang/12T/han/OpenAvatarInterview
uv run python src/demo.py --config config/interview_with_lam.yaml默认配置当前使用:
- 服务端口:
8382 - LAM 资产:
lam_samples/chatting_avatar_20260519004403.zip - TTS:
cosyvoice-v2 - Emotion refine 模型:
qwen-plus
- 根路径:
http://127.0.0.1:8382/ - 面试 UI:
http://127.0.0.1:8382/ui/index.html - Dashboard:
http://127.0.0.1:8382/ui/dashboard.html - 健康检查:
http://127.0.0.1:8382/liveness
OpenAvatarInterview/
├── config/
│ └── interview_with_lam.yaml
├── lam_samples/
│ └── *.zip # LAM 数字人资产
├── models/
│ ├── iic/ # SenseVoice
│ ├── LAM_audio2exp/ # LAM Audio2Expression
│ ├── smart_turn/ # Smart Turn EOU
│ └── wav2vec2-base-960h/ # LAM 音频特征
├── runtime/
│ └── sessions/<session_id>/ # 会话落盘、报告和中间文件
├── src/
│ ├── demo.py
│ ├── chat_engine/
│ ├── handlers/
│ │ ├── asr/
│ │ ├── avatar/
│ │ ├── client/
│ │ ├── interview/
│ │ │ ├── agents/ # 面试相关 Agent
│ │ │ ├── emotion/ # emotion_types / features / prompt / integration
│ │ │ ├── graph/ # InterviewGraph
│ │ │ ├── models/ # InterviewSessionState / InterviewTurn
│ │ │ ├── prompts/ # interviewer prompt 模板
│ │ │ ├── services/ # resume / report html / pdf
│ │ │ └── storage/ # session repository
│ │ ├── llm/
│ │ ├── logic/
│ │ ├── tts/
│ │ └── vad/
│ └── service/frontend_service/frontend/
├── tests/
└── pyproject.toml
主配置文件是 config/interview_with_lam.yaml。当前结构是 default.chat_engine.handler_configs,不是旧版的 handlers: 列表格式。
示例:
default:
service:
host: "0.0.0.0"
port: 8382
chat_engine:
handler_search_path:
- "src/handlers"
handler_configs:
SileroVad:
module: vad/silerovad/duplex_vad_handler
SenseVoice:
module: asr/sensevoice/asr_handler_sensevoice
SemanticTurnDetector:
module: llm/semantic_turn_detector/semantic_turn_detector_handler
CosyVoice:
module: tts/bailian_tts/tts_handler_cosyvoice_bailian
InterviewAgent:
module: interview/interview_agent_handler
LAM_Driver:
module: avatar/lam/avatar_handler_lam_audio2expression和 emotion 直接相关的配置在 InterviewAgent 对应的 InterviewAgentConfig 中:
model_nameevaluator_model_namereport_model_nameresume_analyzer_modelquestion_planner_modeldialogue_analyzer_modelemotion_model_name
runtime/sessions/<session_id>/session.json 当前会包含以下 emotion 相关字段:
latest_fast_emotion_assessmentlatest_refined_emotion_assessmentlatest_emotion_assessmentlatest_interview_policyemotion_state_history
普通对话轮记录在 turns 里,默认事件类型是:
{"role": "candidate", "text": "你好", "event": "turn"}这里的 event: "turn" 表示普通面试轮次,不是系统事件。
| 方法 | 路径 | 说明 |
|---|---|---|
GET |
/openavatarinterview/sessions/{session_id} |
获取会话状态 |
POST |
/openavatarinterview/sessions/{session_id}/resume |
上传简历并触发后台分析 |
GET |
/openavatarinterview/sessions/{session_id}/questions |
获取题目计划 |
GET |
/openavatarinterview/sessions/{session_id}/analysis |
获取对话分析、评估和报告状态 |
GET |
/openavatarinterview/sessions/{session_id}/report |
下载 Markdown 报告 |
GET |
/openavatarinterview/sessions/{session_id}/report/html |
获取 HTML 报告预览 |
GET |
/openavatarinterview/sessions/{session_id}/report/pdf |
下载 PDF 报告 |
| 层级 | 技术 |
|---|---|
| 后端 | Python 3.11, FastAPI, uvicorn |
| 智能体 | LangGraph, OpenAI SDK 兼容调用 |
| ASR | FunASR SenseVoice |
| TTS | DashScope CosyVoice |
| VAD / 轮次检测 | Silero VAD, Smart Turn EOU, Semantic Turn Detector |
| 数字人 | LAM Audio2Expression, Wav2Vec2 |
| 通信 | WebRTC, WebSocket |
| 前端 | Vue 3, TypeScript, Vite |
| 报告 | Markdown + HTML Renderer + PDF Renderer |
待补充。