面试表达
面试时怎么讲
一句话:我围绕「Realtime / Voice Agent(低延迟语音 / WebRTC / VAD / Barge-in)」做过从问题拆解、方案设计、工程落地到效果验证的闭环。
追问重点:为什么这么设计、指标怎么验证、失败案例如何定位、上线后怎么观测和回滚。
证据建议:准备 README、架构图、关键代码片段、评测表和 2 个坏例复盘。
把 Agent 从"打字聊天"升级到"实时语音":WebRTC / WebSocket / SIP、VAD、barge-in、首音时延、语音工具调用、电话机器人 / 面试陪练。
本地学习进度
只保存在当前浏览器,不上传服务器。
学习产出
实战交付,P2。阅读时尽量把知识点转成可演示项目、面试回答和简历证据。
能回答
课程目标(14 天) / 为什么值得学(2026 趋势) / 架构对比(面试速记)
能交付
整理一页项目笔记,记录问题、方案、指标和取舍
下一步
把本篇总结成 90 秒面试讲述
面试表达
一句话:我围绕「Realtime / Voice Agent(低延迟语音 / WebRTC / VAD / Barge-in)」做过从问题拆解、方案设计、工程落地到效果验证的闭环。
追问重点:为什么这么设计、指标怎么验证、失败案例如何定位、上线后怎么观测和回滚。
证据建议:准备 README、架构图、关键代码片段、评测表和 2 个坏例复盘。
简历表达
围绕 Realtime / Voice Agent(低延迟语音 / WebRTC / VAD / Barge-in) 场景,完成「把 Agent 从"打字聊天"升级到"实时语音":WebRTC / WebSocket / SIP、VAD、barge-in、首音时延、语音工具调用、电话机器人 / 面试陪练。」相关能力建设,沉淀可复用工程方案、测试样本和面试表达材料。
读完本课你要能:
传统三段式(延迟高,可控性强)
麦克风 → VAD → ASR → LLM → TTS → 扬声器
端到端 2-4s
原生 Realtime(延迟低,黑盒)
麦克风 → WebRTC → Realtime 模型(speech2speech)→ WebRTC → 扬声器
端到端 300-800ms,支持打断选型矩阵:
| 需求 | 推荐 |
|---|---|
| 极致低延迟对话(< 1s) | OpenAI Realtime / Gemini Live(原生) |
| 合规可控 / 本地化 / 离线 | 三段式(自建 ASR + LLM + TTS) |
| 电话外呼 / 热线接入 | Realtime + SIP 网关(Twilio / FreeSWITCH) |
| 会议记录(非实时对话) | WebSocket + 批量 ASR + 后处理 |
| 通道 | 优点 | 缺点 | 场景 |
|---|---|---|---|
| WebRTC | 端到端最低延迟、自带回声消除/抖动缓冲/自适应码率 | 协议复杂、要 TURN/STUN | 浏览器 / App 语音 |
| WebSocket | 好调试、跨防火墙 | 需自己处理抖动、无 NAT 穿透 | 后台实时转写 |
| SIP / PSTN | 接电话网 | 老派协议、要网关 | 呼叫中心 |
| WebTransport | 前沿、QUIC 流 | 生态不成熟 | 观望 |
// 浏览器端:WebRTC 直连 Realtime API
const pc = new RTCPeerConnection();
pc.ontrack = (e) => audioEl.srcObject = e.streams[0];
pc.addTrack(localStream.getAudioTracks()[0]);
const offer = await pc.createOffer();
await pc.setLocalDescription(offer);
const ans = await fetch("https://api.openai.com/v1/realtime", {
method: "POST",
headers: { Authorization: `Bearer ${EPHEMERAL_KEY}`, "Content-Type": "application/sdp" },
body: offer.sdp,
}).then(r => r.text());
await pc.setRemoteDescription({ type: "answer", sdp: ans });WebSocket 二进制流(PCM 16kHz)
↓
Silero VAD → 分段
↓
Whisper / Paraformer ASR(流式)
↓
LLM(接你现有 Agent)
↓
Edge-TTS / CosyVoice / ElevenLabs 流式 TTS
↓
浏览器 MediaSource 流播services/voice-pipeline/ 各段独立容器。threshold=0.5 / min_speech_duration=200ms / min_silence_duration=500ms。用户随时能打断 AI;这是 Voice UX 的生死线。
# 伪代码
async def voice_loop():
while True:
user_speech = await vad.listen()
if user_speech:
tts.cancel() # 立即停播
llm.cancel() # 取消当前生成
asr.feed(user_speech)
# ... 推进状态机input_audio_buffer.speech_started 事件。cancel 给 LLM/TTS → 抽干缓冲。必须量化:
| 指标 | 定义 | 目标(原生) | 目标(三段式) |
|---|---|---|---|
| TTFB(First Byte) | 用户停说到 TTS 出首音 | ≤ 800ms | ≤ 2s |
| ASR 延迟 | 说完到文本出 | - | ≤ 500ms |
| LLM TTFT | LLM 首 token | - | ≤ 700ms |
| TTS 首音 | 文本首 token 到音频首帧 | - | ≤ 400ms |
| 打断恢复 | 打断到 AI 停播 | ≤ 150ms | ≤ 300ms |
| 轮次延迟 | 整轮端到端 | ≤ 1.5s | ≤ 3s |
sox / libsndfile)。services/telephony-gateway/。pyannote.audio 做说话人分离。核心循环:
白板 8 分钟:"我如何把一个三段式管道优化到 1.2s 端到端":VAD 参数、ASR 流式、LLM TTFT、TTS 流式、并行 prefetch。
services/voice-pipeline/(三段式 reference)services/realtime-gateway/(WebRTC signaling + ephemeral key)services/telephony-gateway/(Twilio / SIP)libs/vad.py + libs/aec.py 配置demos/interview-coach/(面试陪练)demos/phone-support/(电话客服)dashboards/voice-latency.jsondocs/voice-latency-playbook.md| 级别 | 资源 |
|---|---|
| A | OpenAI Realtime API 指南 |
| A | Gemini Live API |
| A | WebRTC for the Curious(免费电子书) |
| A | Silero VAD |
| A | Whisper / Whisper.cpp |
| A | Twilio Media Streams |
| A | pyannote.audio(说话人分离) |
| B | CosyVoice / XTTS / ElevenLabs / Edge-TTS 文档 |
| B | LiveKit / Agora / Pion WebRTC 开源栈 |
与 multimodal-basics、ai-frontend-streaming-ux、agent-state-persistence-hitl、ai-application-security 联动。