[开源] 检查报告语音播报系统:面向门诊与体检中心的医患沟通提效工具,扫码即听、自动脱敏、术语通俗化、异常词高亮提醒

本项目是一个专为基层医疗机构、体检中心和门诊检查科室设计的轻量级语音转化系统,解决「患者看不懂纸质/电子检查报告」这一高频现实堵点。我们不做报告生成,也不改写诊断结论,而是把已有结构化报告文本,经脱敏、术语简化、分段优化后,转成可扫码收听的标准语音流。核心能力全部围绕「听懂」展开:对姓名身份证等隐私字段自动过滤;将“左室射血分数降低(LVEF 45%)”转成“心脏泵血能力偏弱”;在“恶性肿瘤”“重度贫血”等词出现时插入提示音;支持医生批量导入报告ID、患者现场扫码即播。交付形态包含命令行批量处理(CLI)、本地Web服务(Express)、标准REST API三套接口,技术栈基于Node.js + TypeScript构建,语音合成层直接调用微软Edge-TTS(zh-CN-YunxiNeural等中文神经音色),不依赖私有云或GPU集群。
定位与能力范围
我们明确不覆盖影像原始数据解析、PDF OCR识别、AI辅助诊断或HIS系统对接。本系统只处理已结构化、已清洗、已落库的检查报告文本,比如LIS返回的JSON、体检平台导出的纯文本段落、或人工粘贴的标准化描述。输入是文字,输出是音频流,中间所有环节都服务于「让患者无门槛听清关键信息」。边界非常清晰:
- ✅ 处理文本中的医疗术语映射(当前内置50+条,如“窦性心动过缓”→“心跳比正常慢”)
- ✅ 自动识别并替换/屏蔽手机号、身份证号、姓名(正则+上下文双校验)
- ✅ 按语义粒度切分长句(避免整段连读导致理解困难)
- ✅ 在TTS生成阶段插入预警提示音(非简单加文字标注)
- ❌ 不解析DICOM、不转换PDF扫描件、不接入医院统一身份认证(OIDC/SAML)
- ❌ 不存储患者原始报告全文(音频文件按24小时自动过期)
这个边界决定了它能快速部署在社区卫生服务中心的旧笔记本上,也能嵌入三甲医院体检科的自助终端网页中,无需协调信息科排期。
核心功能
系统五大主干能力全部围绕“听清、听准、听安心”展开,每项都对应一个真实操作动作:
|
功能模块 |
用户动作 |
实现效果 |
说明文档依据 |
|---|---|---|---|
|
文本预处理引擎 |
输入任意报告文本 |
自动删除/掩码手机号、身份证、姓名;保留“肝功能异常”等医学判断原文 |
src/text-preprocessor.ts
中正则规则与上下文跳过逻辑 |
|
医疗术语简化 |
无需额外配置 |
“CK-MB升高”转为“心肌酶指标偏高”,“eGFR 42 mL/min/1.73m²”转为“肾功能轻度下降” |
src/medical-terms.ts
内置映射表,支持热更新 |
|
TTS语音合成 |
指定音色与语速参数 |
支持zh-CN-YunxiNeural(青年男声)、zh-CN-XiaoyiNeural(女声)等6种音色;语速调节范围±30%(默认100%) |
Edge-TTS官方中文音色列表,通过 |
|
异常词预警 |
无需标记 |
在“癌”“转移”“危急值”“重度”等23类词首次出现前插入0.8秒提示音(叮~),非文字加粗或变色 |
预警词库固化于 |
|
Web扫码界面 |
患者微信扫码 |
跳转至 |
public/index.html
与 |
所有功能均不依赖外部账号体系,患者扫码即用,医生批量处理时也只需提供报告ID或JSON文件路径。
使用与配置
上手极简,两类角色各走一条路径:
- 医生/技师
:用CLI批量处理报告,全程在终端完成
- 患者/家属
:用微信扫二维码,打开网页直接听
CLI常用命令(复制即用)
# 处理单份报告(ID为R001)
npm start -- --report-id R001
# 批量处理data目录下的示例报告
npm start -- --file data/sample-reports.json
# 指定音色与语速(语速20%即慢速清晰版)
npm start -- --report-id R001 --voice zh-CN-YunxiNeural --rate 20%
# 查看当前可用中文音色列表
npm start -- --list-voices
Web服务启动方式
开发调试:
npm run dev
访问 http://localhost:3000,手动输入报告ID即可试听。
生产部署:
npm run build
npm start
服务默认监听3000端口,可通过.env文件调整:
|
配置项 |
默认值 |
说明 |
|---|---|---|
PORT |
3000 |
HTTP服务端口 |
TTS_TIMEOUT |
30000 |
单次语音合成超时(毫秒) |
AUDIO_EXPIRE_HOURS |
24 |
生成音频缓存有效期(小时) |
所有配置项均在.env.example中有完整注释,无需修改代码。
工程结构
项目采用分层清晰的TypeScript组织方式,每个模块职责单一,便于本地调试与二次开发:
|
目录/文件 |
主要职责 |
是否可独立复用 |
|---|---|---|
src/text-preprocessor.ts |
隐私字段识别与脱敏(含姓名模糊化策略) |
✅ 可单独引入其他Node项目 |
src/medical-terms.ts |
术语映射字典(JSON格式,支持增删) |
✅ 字典文件可导出为CSV供质控科审核 |
src/tts-engine.ts |
封装Edge-TTS调用、异常词插音、语速控制 |
✅ 不耦合Express,可作微服务SDK |
src/server.ts |
Express路由定义与中间件挂载 |
⚠️ 依赖整体结构,建议整包迁移 |
public/index.html |
响应式扫码页(适配手机横竖屏) |
✅ 静态资源,可嵌入任何HIS内网门户 |
bin/cli.js为命令行唯一入口,src/report-model.ts定义了报告数据契约(含id、text、timestamp三字段),所有模块均不直接操作数据库,符合医疗软件“只读文本、不碰源系统”的安全基线。
环境与运行
最小运行环境仅需Node.js 18+,无Python、Java或Docker强制依赖。Windows、macOS、Linux均可原生运行,实测在树莓派4B(4GB内存)上稳定生成单条音频(平均耗时3.2秒)。语音合成完全走微软公开API,国内用户需确保网络可访问https://speech.platform.bing.com(部分医院内网需开通白名单)。
不推荐在无外网环境部署,这不是缺陷,而是设计选择:我们放弃自建TTS模型,换来零训练成本、零显卡依赖、开箱即用的合规语音输出。若机构有严格离线要求,说明文档中已注明可替换为本地gRPC版PaddleSpeech(需自行编译与适配接口)。
数据与扩展
系统不设数据库,所有状态均靠文件与内存维持。报告文本来源完全开放:
- 可从data/sample-reports.json加载示例
- 可通过/api/report/:id接口由外部系统推送(如LIS回调)
- CLI支持--file读取任意路径JSON,格式为数组,每项含id与text字段
术语映射表(src/medical-terms.ts)按临床科室分组注释,例如:
// 【检验科】
'ALT > 100 U/L': '肝功能指标明显升高',
// 【放射科】
'磨玻璃影': '肺部有模糊云雾状阴影',
新增术语只需在此文件追加键值对,重新运行即可生效,无需重启服务。
音频文件以<report-id>.mp3命名,存于./audio/目录,按.env中AUDIO_EXPIRE_HOURS定时清理,保障存储可控。
限制与说明
本系统不是通用TTS工具,而是医疗场景专用管道:
- 不支持中英混读(如“EGFR exon 19 del”仍读作中文“EGFR第19号外显子缺失”)
- 不提供报告原文纠错(错别字、标点混乱会原样转语音)
- Web界面不记录访问日志(logger.ts仅输出错误堆栈,无用户行为埋点)
- CLI批量模式下,单次最多处理500份报告(防内存溢出,可调config.ts中MAX_BATCH_SIZE)
所有限制均在README中明示,不包装、不暗示“后续升级支持”。我们相信:清楚划出能力边界,比模糊承诺更尊重使用者的专业判断。
项目地址:
https://github.com/nexorin9/report-tts-reader
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)