作者在 VoiceForBharat 挑战中构建了支持英语/印地语切换的实时语音导师,采用 Murf Falcon TTS + LiveKit Agents + Deepgram Nova-3,通过工程手段将延迟压至 100ms 以下。
10 Days of Voice AI Challenge — VoiceForBharat Edition 作者:Jay | 赛道:学习与素养(EdTech) 开源仓库:github.com/jaysid97/Ten-day-of-voice-challenges-bharat-edition
当你构建一个传统的文字聊天机器人时,1.5 秒的 API 延迟感觉完全正常。但在对话式语音 AI 中,1.5 秒的延迟会让人感觉像漫长的煎熬。
现在想象一下,为印度各地的学生构建一个语音导师——学习者会在一句话中自然地在英语、印地语和当地方言之间切换("Bhaiya, is quadratic equation ko solve karne ka simple trick kya hai?")。突然之间,延迟不仅仅是一个性能指标,延迟就是整个用户体验。
在过去的 10 天里,作为 #VoiceForBharat AI Challenge 的一部分,我构建了 Shiksha AI(शिक्षा AI)——一个具有同理心的多语言语音导师,由 Murf Falcon TTS、LiveKit Agents、Deepgram Nova-3 和 Google Gemini 驱动。
在本文中,我想详细解析我是如何构建它的、亚 100ms 语音响应的架构决策、我遇到的最困难的 bug,以及你如何在两分钟内自己运行整个开源设置。
🎯 核心问题:为什么 Bharat 需要语音 AI?
在印度,优质的 1 对 1 家教价格昂贵、地域不平等,而且往往令人生畏。生活在二线、三线和农村城镇的学生面临四大障碍:
成本壁垒:私人家庭教师每月费用数千卢比,使低收入家庭无法获得个性化指导。
语言与语码混合壁垒:大多数教育应用强制学生使用正式英语,而印度孩子的思考和说话方式是 Hinglish(印地语和英语的混合体)。
"害怕被嘲笑":学生经常因为担心被同龄人或老师嘲笑而在拥挤的教室里犹豫是否要问"傻问题"。
键盘摩擦:试着在小小的手机屏幕上输入 2x² + 5x + 3 = 0 或询问光合作用——这既别扭又缓慢。
语音改变了一切。通过为学生提供一个耐心的、不带评判的语音导师——说他们的语言、理解他们的口音、即时响应——我们可以将个性化学习民主化。
🏗️ 系统架构:音频如何实时传输
实时语音代理是一个持续的双向管道。音频从学生的麦克风流出,被转录成文本,通过 LLM 进行推理和工具执行,然后以高质量语音流式传回。
flowchart TD
User[🎙️ Learner / Voice Caller / Outbound SIP] -->|Audio Stream via WebRTC or SIP| STT[Deepgram STT Nova-3 Multi]
STT -->|Text Transcript| LLM[Google Gemini LLM]
subgraph Agent & Multi-Agent Domain Layer
LLM <-->|Active Session Agent| MainAgent[Shiksha AI Main Tutor]
LLM <-->|Handoff via session.update_agent| Specialist[MathsPracticeSpecialist Agent]
end
subgraph Memory, Tools & Safety Layer
MainAgent <-->|Learner Facts & Consent| SQLiteMemory[(SQLite: agent_memory.db)]
MainAgent <-->|Live Syllabus / Concepts| WikiAPI[Wikipedia Educational REST API]
MainAgent <-->|Dictionary & Phonetics| DictAPI[Free Dictionary REST API]
MainAgent <-->|PII Scrub & Webhook| Escalation[Human Support Engine / Discord]
Specialist <-->|Step-by-Step Math Solver| MathTool[solve_math_step_by_step Tool]
end
subgraph Telephony & Analytics Layer
MainAgent <-->|2-Sentence Opening & Retry Rules| Outbound[src/outbound_call.py]
MainAgent -->|Teardown Metrics| Analytics[SQLite call_analytics Table]
end
LLM -->|Spoken Response Text| TTS[Murf Falcon Streaming TTS]
TTS -->|High-Quality Audio (55ms)| Transport[LiveKit Agent Transport]
Transport -->|Audio Output| Speaker[🔊 Learner Hears Shiksha AI]
style User fill:#1E293B,stroke:#38BDF8,color:#fff
style STT fill:#064E3B,stroke:#10B981,color:#fff
style LLM fill:#1E1B4B,stroke:#818CF8,color:#fff
style MainAgent fill:#431407,stroke:#F97316,color:#fff
style Specialist fill:#365314,stroke:#84CC16,color:#fff
style SQLiteMemory fill:#78350F,stroke:#F59E0B,color:#fff
style Outbound fill:#831843,stroke:#F43F5E,color:#fff
style WikiAPI fill:#0284C7,stroke:#38BDF8,color:#fff
style DictAPI fill:#4C1D95,stroke:#C084FC,color:#fff
style Escalation fill:#701A75,stroke:#F43F5E,color:#fff
style Analytics fill:#1E3A8A,stroke:#60A5FA,color:#fff
style TTS fill:#065F46,stroke:#34D399,color:#fff
style Transport fill:#1E293B,stroke:#F59E0B,color:#fff
style Speaker fill:#1E293B,stroke:#10B981,color:#fff
TTS(Text-to-Speech,文本转语音):Murf Falcon TTS——以超低 55ms 流式延迟提供真实的印度语音合成,印地语和英语术语发音完美。
STT(Speech-to-Text,语音转文本):Deepgram Nova-3 多语言——处理英语、印地语(天城文脚本)和 Hinglish 的实时语音识别。
LLM 引擎:Google Gemini 1.5 Flash——提供同理心推理、安全护栏合规和零样本函数执行。
实时传输:LiveKit Agents——协调 WebRTC 音频流、VAD(语音活动检测)和 SIP 电话通信。
数据库:SQLite(agent_memory.db)——存储学习者记忆、通话日志、人工升级工单和分析数据。
💡 Shiksha AI 的四大工程突破
传统 TTS 引擎会等待 LLM 生成整段文字后再合成音频。这引入了 1.5 到 2.5 秒的延迟——扼杀了对话的自然流畅。
使用 Murf Falcon 的流式 API,一旦 Gemini 输出最初几个 token,Murf Falcon 立即合成并通过 WebRTC 流式传输原始 PCM 音频帧。从学生停止说话到听到第一个口语单词的总时间降至 100ms 以下。
Shiksha AI 会记住回访学生("欢迎回来 Ramesh!上次我们复习了 Class 10 Biology 光合作用……")。但未经明确同意存储语音对话数据是一个重大的隐私侵犯。
我建立了一个硬同意规则:LLM 被严格指示在调用 save_caller_facts 之前先口头询问("我是否可以记住你的年级和薄弱科目以便下次使用?")。如果学生说"否",则不会向 SQLite 保存任何记录。
并非印度每个学生都有高速笔记本电脑或台式机。为了触达功能手机上的学生,我集成了 LiveKit SIP 和 Twilio(src/outbound_call.py)来触发自动出站复习电话。
每个出站电话都严格执行 2 句合规开场:
身份与目的:"Namaste Ramesh ji!我是 Shiksha AI,打电话来是为了你的每日 5 分钟 NCERT 科学练习。"
退订提示:"如果你想停止接收这些电话,只需说'stop'或'opt out'。"
重试逻辑:自动将通话结果分类(ANSWERED、BUSY、NO_ANSWER、VOICEMAIL、OPT_OUT)并重新安排未接来电。
提示单个 LLM 代理处理通用科目、语言、测验、安全护栏和逐步微积分会导致提示污染并降低推理质量。
相反,我构建了一个多代理转接架构:
主导师(Shiksha AI):处理通用查询、历史、生物和语言课程。
当学生请求复杂的数学帮助时("帮我解 2x² + 5x + 3 = 0"),Shiksha AI 调用 hand_off_to_math_specialist 工具。
会话通过 session.update_agent(math_specialist) 动态更新,同时保留完整的 session.history 数组。
Maths Practice Specialist AI 无缝接手,向学生打招呼,并使用 solve_math_step_by_step 工具,而无需学生重新解释问题!
🛠️ 我必须解决的最困难的 Bug
Bug #1:Hinglish 语码切换延迟陷阱
问题:标准 STT 经常误听印地语中混合的英语技术术语(例如将"quadratic equation"转录为随机天城文噪声)。如果 STT 输出是垃圾内容,LLM 会花费额外时间来试图理解它,将延迟推高至 1.5 秒以上。
修复:将 Deepgram Nova-3 的多语言模型与 Murf Falcon TTS 配对。Deepgram 正确捕获混合的天城文和拉丁文脚本文本,Murf Falcon 在 55ms 内流式传输输出音频,保持对话即时流畅。
Bug #2:代理转接期间的上下文擦除
问题:在 session.update_agent() 的第一次迭代中,新激活的 MathsPracticeSpecialist 代理擦除了对话缓冲区,在主代理已经承诺解决二次方程后,立即用通用的"你好,有什么可以帮助你的?"来响应。
修复:将活跃的 session.history 数组传递到专家代理的初始化参数中。专家代理立即扫描现有对话上下文,直接进入逐步解决方案。
Bug #3:人工升级时的语音 PII 清理
问题:当学生在一个概念上反复卡住或有考试争议时,Shiksha AI 通过 Discord Webhook 和 SQLite 工单将问题升级给人类教师。然而,学生在语音通话中偶尔会脱口而出电话号码、OTP 或 Aadhaar 号码。
修复:实现了一个后端正则表达式清理器(src/db.py 中的 sanitize_summary),在创建数据库记录或发送 Discord 警报卡之前,从转录摘要中清除密码、6 位 OTP 和 12 位 Aadhaar 模式。
💻 代码解析:核心实现片段
from livekit.plugins import murf, deepgram, google
from livekit.agents import AgentSession
# Setup Murf Falcon Streaming TTS (55ms latency with authentic Indian accent)
tts_engine = murf.TTS(
api_key=os.getenv("MURF_API_KEY"),
voice="en-IN-falcon-female",
style="conversational",
)
session = AgentSession(
stt=deepgram.STT(model="nova-3-multi"),
llm=google.LLM(model="gemini-1.5-flash"),
tts=tts_engine,
)
@llm.function_tool
async def create_escalation(
caller_name: str,
phone_number: str,
issue_category: str,
summary: str,
user_consent_given: bool
) -> str:
"""Escalates complex issues to human teachers after explicit consent."""
if not user_consent_given:
return "ERROR: Consent was not provided by caller. Ticket creation aborted."
# Redact sensitive PII before storing
clean_summary = sanitize_summary(summary)
ticket_id = save_human_escalation_ticket(
caller_name=caller_name,
phone_number=phone_number,
category=issue_category,
summary=clean_summary
)
# Trigger Discord Webhook Notification asynchronously
await send_discord_escalation_alert(ticket_id, caller_name, clean_summary)
return f"SUCCESS: Escalation logged (Ref ID: {ticket_id}). Teacher will call back in 2-4 hours."
@llm.function_tool
async def hand_off_to_math_specialist(session: AgentSession) -> str:
"""Transfers the live voice session to the Maths Practice Specialist AI."""
# Spoken announcement to the learner
await session.say("I am transferring you to our Maths Practice Specialist AI now!")
# Update session agent while preserving session.history context
math_specialist = MathsPracticeSpecialist()
await session.update_agent(math_specialist)
return "SUCCESS: Handed off conversation to MathsPracticeSpecialist."
🧪 测试与验证
为了验证所有 10 天的功能保持稳定,我编写了自动化 Pytest 测试套件,覆盖安全护栏合规、工具调用、出站电话状态处理、人工升级工单创建、分析日志记录和转接转换:
cd backend
python -m pytest tests/
============================= 32 passed in 55.35s =============================
tests/test_agent.py ... (3/3 passed)
tests/test_day2_guardrails.py .... (4/4 passed)
tests/test_day5_tools.py ...... (6/6 passed)
tests/test_day6_outbound.py ..... (5/5 passed)
tests/test_day7_escalation.py ...... (6/6 passed)
tests/test_day8_analytics.py .... (4/4 passed)
tests/test_day9_handoff.py .... (4/4 passed)
🚀 快速启动:在 2 分钟内运行 Shiksha AI
想自己测试或检查代码库?按照以下简单步骤操作:
git clone https://github.com/jaysid97/Ten-day-of-voice-challenges-bharat-edition.git
cd Ten-day-of-voice-challenges-bharat-edition
将 .env.example 复制到 murf-livekit-starter/backend/.env.local:
LIVEKIT_URL=wss://your-livekit-project.livekit.cloud
LIVEKIT_API_KEY=your_livekit_api_key
LIVEKIT_API_SECRET=your_livekit_api_secret
MURF_API_KEY=your_murf_api_key
DEEPGRAM_API_KEY=your_deepgram_api_key
GOOGLE_API_KEY=your_google_gemini_api_key
Windows(PowerShell):
.\start_app.ps1
macOS / Linux(Bash):
chmod +x start_app.sh
./start_app.sh
在浏览器中打开 http://localhost:3000,点击"开始对话",授予麦克风权限,然后开始与 Shiksha AI 交谈!
🔮 Shiksha AI 的下一步计划
离线语音缓存:在移动设备上直接缓存常见的 NCERT 定义,以支持网络连接差的农村地区学习者。
南印度语言扩展:将原生语音模型扩展到泰米尔语、泰卢固语、卡纳达语和马拉雅拉姆语。
多模态交互式白板:在 Murf Falcon 语音解释的同时,渲染实时数学图表和几何形状。
🔗 项目链接与致谢
💻 开源代码库:github.com/jaysid97/Ten-day-of-voice-challenges-bharat-edition
🎙️ TTS 提供商:Murf Falcon TTS(55ms 延迟)
📦 传输引擎:LiveKit Agents
💼 LinkedIn 分享模板(#VoiceForBharat)
🎉 10 天语音代理挑战第 10 天:分享我的语音 AI 之旅!🎙️🇮🇳 #VoiceForBharat
在过去的 10 天里,我构建了 Shiksha AI(शिक्षा AI)——一个为 Bharat 各地学习者设计的人类型 AI 语音导师(EdTech 赛道)!
最初只是一个简单的实时语音管道,最终演变成一个企业级语音代理,具有以下特性:
✨ 由 Murf Falcon TTS 驱动的超快速 55ms 印度语音合成
🧠 持久学习者记忆与硬同意规则(SQLite 数据库)
🛠️ 实时领域工具(NCERT Wikipedia REST API 和词典集成)
📞 出站电话与强制性 2 句开场话术(LiveKit SIP 和 Twilio)
🚨 带 PII 清理和 Discord Webhook 的人工升级引擎
📊 实时通话分析仪表板(/analytics)
🧮 多代理专家转接(MathsPracticeSpecialist AI)
这次旅程的亮点是使用 Murf Falcon TTS 构建——对于印度口音和多语言语音来说,这是迄今为止最快、最自然的 Text-to-Speech API!
📖 阅读我完整的逐步指南和架构解析:
[在此处插入你发布的博客 URL]
💻 在 GitHub 上检查开源代码:
https://github.com/jaysid97/Ten-day-of-voice-challenges-bharat-edition
非常感谢 @Murf AI 组织 10 天语音代理挑战——VoiceForBharat 版!🚀
#VoiceForBharat #MurfAI #VoiceAI #EdTech #ArtificialIntelligence #LiveKit #Python #NextJS #WebRTC #BuildInPublic #BharatAI
感谢阅读!如果你正在构建实时语音应用或试验 LiveKit 和 Murf AI,请留言或联系我——我很乐意交流经验!