在印度一个半城市化小镇的初级卫生中心(PHC),时钟指向晚上11点。一位患者的体温骤然升高,最近医生的门诊早已关闭数小时,而人们手中唯一的电话号码,是从一张褪色宣传单上抄下来的——甚至可能已经停机。这样的场景,在印度数千个服务农村和半城市化地区的初级卫生中心里反复上演。人们需要在任何时刻,用自己的语言,获得即时可靠的医疗信息,这是一个非常真实、非常人性化的基础设施缺口。 这正是我开发 AshaAssist(आशाअसिस्ट)所要解决的问题——一个实时的、双语(印地语/英语)AI语音助手。它通过自然语音对话,完成医疗分级分诊、提供紧急初级卫生中心联系方式、查询门诊(OPD)预约名额。这篇文章将带你了解它的架构、功能、我在开发中战胜的Bug,以及一步步的运行指南——你完全可以克隆仓库,在本地运行起来。 仓库地址:github.com/pvsatvika/murf-livekit-starter ## 问题与目标用户 印度农村和半城市化地区的医疗可及性,受几个反复出现的痛点制约: - **初级卫生中心排队漫长**:很多基础分诊和预约查询,其实不需要亲自跑一趟,却不得不面对面排队。 - **语言障碍**:大多数医疗科技工具默认只支持英语界面,把大量更习惯用印地语交流的人群排除在外。 - **没有24/7信息层**:初级卫生中心的工作人员不会全天候在岗,但“最近的急救电话号码是什么”“明天门诊几点开门”这类问题,不会等到上班时间才出现。 - **文字应用的数字化素养低**:对于许多首次使用智能手机的人而言,语音是比表单或聊天机器人界面摩擦低得多的交互方式。 目标用户包括: - 农村和半城市化地区的患者(以及他们的家人),需要快速的分诊指导或紧急联系方式。 - 护理人员,需要预约或查询门诊(OPD)名额。 ## 解决方案:AshaAssist 的整体设计 AshaAssist 是一个语音优先(Voice-First)的代理系统,核心思路是让用户用最自然的说话方式,完成原本需要到场或拨打电话才能完成的医疗信息查询。它采用实时语音管道,支持两种语言无缝混说,用户说印地语或英语,系统都能正确理解并回应。 系统架构分为四层: 1. **语音识别(STT)**:使用流式语音识别,实时将用户说的话转成文本。为了适应印度口音,选择了对多语种支持较好的识别引擎,并做了针对印地语-英语混合语的优化。 2. **意图理解与业务逻辑**:基于大语言模型(LLM)驱动的对话管理,识别用户的意图——是“分诊咨询”“找紧急电话”还是“查预约名额”。每个意图对应一套明确的业务流程,避免模型自由发挥导致错误医疗建议。涉及分诊问题时,系统会询问症状、持续时间、严重程度,然后根据内置的医学规则给出建议。 3. **信息查询与集成层**:通过与初级卫生中心的数据接口对接,实时获取门诊预约名额和联系方式。对于无法在线获取的数据,系统会通过配置好的知识库进行回答。 4. **语音合成(TTS)**:响应文本生成后,使用高自然度的神经语音合成,以印地语或英语朗读出来。这里用到了 Murf TTS,让语音听起来更温暖、更贴近人声。 这种分层设计,达到了两个关键目标:低延迟(从用户说完到听到回答,控制在2秒内)和强可控性(医疗相关内容不允许模型自由发挥,必须走预定义的规则和审核流程)。 ## 功能特性 - **智能分诊**:用户描述症状后,系统会评估紧急程度,给出“在家观察”“尽快去诊所”或“立即拨打急救电话”等分层建议。它不会替代医生,但能帮助用户做出更明智的初步决策。 - **紧急联系信息查询**:只需问一句“最近的急救电话是什么”,系统就会根据用户所在位置,返回对应的初级卫生中心电话,并自动调用 TTS 读出来。 - **门诊(OPD)预约查询**:用户可以询问“明天门诊还有名额吗”,系统直接查询当前诊所的预约系统,用语音回复剩余名额和预约方式。 - **全双语支持**:中英文混合也不怕。例如“明天 ke liye slot hai?”(明天有号吗?)这样的句子,也能被正确解析。 - **全天候在线**:基于云端部署,没有下班时间。夜里11点的尖叫,凌晨3点的低烧,它都在。 ## 开发中遇到并战胜的Bug 分享两个印象最深的故障: 第一个是 **混合语言的幻觉问题**。最初用单一语言模型处理印地语-英语混说,结果模型经常“幻觉”出一些不存在的药名。排查后发现,是语言模型在印地语提示词中丢失了上下文。解决方案是引入语言标识符,在输入给LLM之前,先将句子按语言片段标记,再把双语提示词模板拆成两套,分别处理后再合并回应。这避免了跨语言的语义混乱。 第二个是 **TTS 打断问题**。当用户急忙插话时,系统会停止当前的语音,但偶尔会残留尾音,造成“鬼影”效应。原因是流式语音合成和暂停逻辑在 WebSocket 层没有同步好。修复方法是引入独立的音频轨道状态机,在检测到语音激活(VAD)时,强制清空合成缓存,并重置时间戳。 这些Bug虽然让人抓狂,但每一个都让系统的稳定性跨上一个台阶。 ## 一步步运行指南 你可以通过以下步骤在本地运行 AshaAssist: 1. 克隆仓库: ``` git clone https://github.com/pvsatvika/murf-livekit-starter ``` 2. 安装依赖: ``` npm install ``` 3. 配置环境变量。你需要一个 **LiveKit** 实例(用于实时语音传输)、**OpenAI API Key**(用于对话理解)以及 **Murf API Key**(用于语音合成)。在 `.env` 文件中填写: ``` LIVEKIT_URL=wss://your-livekit-server LIVEKIT_API_KEY=... LIVEKIT_API_SECRET=... OPENAI_API_KEY=... MURF_API_KEY=... ``` 4. 启动服务: ``` npm run dev ``` 5. 打开前端页面,允许麦克风权限,点击开始对话。此时你和系统之间就建立了一条实时语音通道。 注意:由于涉及医疗建议,请务必在生产环境中接入真实诊所的数据,并让专业医务人员审核对话逻辑。本仓库仅用于技术演示,不构成医疗建议。 ## 未来展望 AshaAssist 目前已在演示环境中稳定运行。下一步,我计划增加更多印度地方语言(如泰米尔语、泰卢固语),并接入电子健康档案(EHR)系统,让它在分诊时能结合用户历史数据。同时,我们希望降低部署成本,让每一个初级卫生中心都能负担得起。 晚上11点的印度乡村,不再只有沉寂的电话线和褪色的宣传单。有了AshaAssist,一个语音、一个句子,就能接通医疗信息。这是我在 #10DaysOfVoiceAgents 活动中的第10天作品,也是为 #VoiceForBharat 献上的一份小小礼物。 如果你也在做类似的事情,欢迎在仓库中提Issue或PR。让我们一起,把声音变成守护更多人健康的工具。
![]()
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.