图片

本项目是一个专为基层医疗机构、体检中心和门诊检查科室设计的轻量级语音转化系统,解决「患者看不懂纸质/电子检查报告」这一高频现实堵点。我们不做报告生成,也不改写诊断结论,而是把已有结构化报告文本,经脱敏、术语简化、分段优化后,转成可扫码收听的标准语音流。核心能力全部围绕「听懂」展开:对姓名身份证等隐私字段自动过滤;将“左室射血分数降低(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官方中文音色列表,通过--voice--rate传参控制

异常词预警

无需标记

在“癌”“转移”“危急值”“重度”等23类词首次出现前插入0.8秒提示音(叮~),非文字加粗或变色

预警词库固化于tts-engine.ts,可扩展但不开放动态配置

Web扫码界面

患者微信扫码

跳转至/report/R001页面,自动播放音频,底部显示“已脱敏”标识与语速滑块

public/index.html

public/app.js实现前端闭环

所有功能均不依赖外部账号体系,患者扫码即用,医生批量处理时也只需提供报告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定义了报告数据契约(含idtexttimestamp三字段),所有模块均不直接操作数据库,符合医疗软件“只读文本、不碰源系统”的安全基线。

环境与运行

最小运行环境仅需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,格式为数组,每项含idtext字段

术语映射表(src/medical-terms.ts)按临床科室分组注释,例如:

// 【检验科】
'ALT > 100 U/L': '肝功能指标明显升高',
// 【放射科】
'磨玻璃影': '肺部有模糊云雾状阴影',

新增术语只需在此文件追加键值对,重新运行即可生效,无需重启服务。

音频文件以<report-id>.mp3命名,存于./audio/目录,按.envAUDIO_EXPIRE_HOURS定时清理,保障存储可控。

限制与说明

本系统不是通用TTS工具,而是医疗场景专用管道:
- 不支持中英混读(如“EGFR exon 19 del”仍读作中文“EGFR第19号外显子缺失”)
- 不提供报告原文纠错(错别字、标点混乱会原样转语音)
- Web界面不记录访问日志(logger.ts仅输出错误堆栈,无用户行为埋点)
- CLI批量模式下,单次最多处理500份报告(防内存溢出,可调config.tsMAX_BATCH_SIZE

所有限制均在README中明示,不包装、不暗示“后续升级支持”。我们相信:清楚划出能力边界,比模糊承诺更尊重使用者的专业判断。

项目地址:
https://github.com/nexorin9/report-tts-reader

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐