三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

医疗器械语音播报芯片选型:WT2003Hx在血压计中的应用

医疗器械语音播报芯片选型:WT2003Hx在血压计中的应用

家用血压计加语音播报,早就不是加分项,而是渠道验收的硬指标。本文从血压计的实际交互流程出发,讲清楚语音芯片选型要卡哪几个参数,并给出 WT2003Hx 的完整落地方案,包括语音文件怎么规划、测量数值怎么拼读播出来、串口指令怎么发、低功耗怎么压、产线怎么做多语言。文中所有参数取自唯创知音 WT2003Hx 系列 V2.02 说明书与 WT2003HX 答疑集 V1.00。

家用血压计为什么绕不开语音播报

家用血压计、血氧仪、体温枪这类设备,真正的使用者是中老年群体。屏幕上那几个数字,对老花眼来说本身就吃力,夜里测量还不想开灯。测完看不清,得喊人过来念一遍,这个体验直接决定了产品在电商评论区的口碑。语音播报把结果念出来,等于把设备的可用人群往上扩了一大截。

除此之外,还有合规和渠道的推力。血压异常需要明确提示,光靠屏幕上一个小图标不够醒目;出口机型要按目的地市场切换语种;医院和药店渠道对操作引导的要求更高,从系袖带到保持安静,每一步都要有语音提示。这些需求叠加起来,语音方案就从可选变成了必选。

麻烦出在选型环节。用 OTP 语音芯片,提示词一次固化,后面换语言、改文案就得整片回厂重烧,做出口机型等于给自己埋雷。自己拿 MCU 搭解码,BOM 一大堆,还要处理功放、DAC、文件系统,功耗也压不下来,认证阶段多一个器件就多一份风险。医疗器械对语音芯片的诉求其实很集中:电池供电要省电,提示音要清晰,文案要能随市场更新,电路要尽量简单,出厂后内容还要可控。把这五条摆在一起,WT2003Hx 这颗 MP3 语音芯片正好对得上。

血压计要播的到底是哪些话

选型之前,先把播报清单拉出来,容量和文件规划都由它决定。一台典型的家用臂式血压计,语音节点大致是这些。

交互节点

播报内容

触发条件

开机

欢迎使用,请系好袖带

上电或按键开机

测量准备

测量开始,请保持安静

加压启动

测量中

一般静音,仅保留加压提示

泵工作期间

结果播报

收缩压 X 毫米汞柱,舒张压 Y 毫米汞柱,脉搏 Z 次每分

测量完成

异常提醒

血压偏高,建议复测或就医

数值超阈值

操作错误

袖带未系好,请重新测量

加压失败或运动干扰

记忆回放

第 N 组记录

查询历史

低电提示

电量不足,请更换电池

电压检测触发

关机

测量结束,感谢使用

自动或手动关机

固定语句好办,一句一个文件。真正的难点是结果播报,收缩压可能是 0 到 299 之间任意一个数,不可能每个数录一段。工程上有两种做法。

算账之前先把容量口径分清楚,这三个数经常被混着用。WT2003H4 内置物理容量 4Mbit 也就是 512K 字节,WT2003HP8 是 8Mbit 也就是 1024K 字节。扣掉芯片内部程序占用后,PC 模式下真正能放语音的空间,H4 是 180K 字节,HP8 是 701K 字节。如果不走 PC 模式而是烧 bin 文件的语音工程,可用空间分别是约 300K 与约 800K 字节。本文方案要用 USB 拖拽换音,属于 PC 模式,按 180K 与 701K 算。

第一种是整数全录,0 到 299 各一段。播报最自然,但容量吃不消。按 16 千比特每秒的码率算,一秒钟音频约占 2K 字节,说明书给的对照是 H4 在这个码率下能存 90 秒,HP8 能存 350.5 秒。一句三位数读音约 1.5 秒,300 段就是 450 秒 900K 字节,H4 的 90 秒装不下,HP8 的 350.5 秒同样装不下,这条路必须外挂 Flash,单芯片方案直接出局。

第二种是按位拼读,只录 12 段基础语料,零到九共十段,加上十和百两段,剩下的交给 MCU 按中文读法拼。128 拼成一百二十八,105 拼成一百零五,76 拼成七十六。12 段基础语料每段约半秒,合计 6 秒;9 条固定语句平均 2.5 秒,合计约 22.5 秒。整套语音包不到 30 秒,H4 的 90 秒额度绰绰有余,一颗芯片解决,不用外挂任何存储器件。家用血压计出货量大,这一步省下来的成本相当可观。

三条技术路线放到医疗场景里比一比

对比维度

OTP 路线 WTN6

Flash 路线 WT588F

MP3 路线 WT2003Hx

换音方式

整片回厂重烧

烧录器重烧或在线更新

插电脑当 U 盘,拖拽即换

多语言支持

每个语种一版物料

需重新烧录

产线拷不同语音包,硬件一套

音质

PWM 直推,够用

16 位内核,较好

16 位高精度 DAC,最优

控制方式

一线两线串口或按键

烧写时选定接口

标准 UART,指令集完整

休眠电流

10 微安以下

微安级

深度休眠 5 微安以内

适用机型

单语种、文案永不改的低端机

语音较多、偶尔更新

出口机型、多语种、需要迭代文案

结论很直接。只做国内单一 SKU、文案定死不改的入门机,OTP 成本最低。一旦涉及出口、多语种、或者产品线要持续迭代提示语,MP3 路线才是省心的选择,WT2003Hx 把功放、DAC、文件系统和 UART 控制都收进一颗芯片,后期维护成本几乎为零。

WT2003Hx 的硬件接法

血压计这类设备板子紧张,接法越简单越好。典型连接只有四根线:MCU 的串口发送脚接芯片 RX,芯片 TX 接 MCU 接收脚,BUSY 脚回读播放状态,剩下就是电源地。喇叭直接挂在 PWM 两个脚上,不需要任何外置功放。

SOP16 封装的关键管脚如下。

管脚

编号

说明

RX

6

接 MCU 串口发送脚

TX

16

接 MCU 串口接收脚

BUSY

15

播放期间高电平,空闲低电平

PWM+

13

直推喇叭正极

PWM-

14

直推喇叭负极

DAC

9

外接功放时走这路

VCC

11

2.6 至 5.0 伏供电

VOUT

10

内部稳压输出,必须外接电容

GND

12

数字地

AGND

8

模拟地,用 0 欧电阻和 GND 隔离

D+ / D-

4 / 5

USB 数据,产线下载语音用

外围物料非常少,主要是这几项。VCC 到地和 VOUT 到地各接一颗 106 电容也就是 10 微法,位置必须控制在管脚 1 厘米以内,回路不要绕远,这两颗少了或者放远了都会出现播放中断。电源纹波大、输出有底噪时,可以在 106 的基础上再并一颗 104 或 103。USB 那两根数据线上加 5 伏单向 TVS 做静电防护,结电容选 10 皮法左右,触发电压 7 伏以内,别选大结电容的型号,会影响 USB 通讯。

还有一个容易漏掉的器件:MCU 的 TX 与芯片 RX 之间要反接一颗二极管,负极那端靠近 MCU 的 TX,作用是防止串口电平把芯片的复位过程带偏。如果 MCU 是 5 伏电平系统,这一颗更不能省,5 伏直接怼进 3.3 伏的通讯脚会形成压差并电流倒灌,轻则待机功耗异常,长时间工作有损坏芯片的风险。

喇叭这块有一条硬边界。芯片内置的是 0.5 瓦 8 欧 D 类功放,PWM 两脚直推 8 欧 0.5 瓦喇叭。不要为了声音更大去换 4 欧喇叭,也不要在 PWM 脚上并联两个 8 欧喇叭,负载电阻变小会把电流抽大,触发芯片的闩锁效应,届时必须断电才能恢复,严重时直接烧片。反过来用 8 欧 0.25 瓦替代 0.5 瓦,喇叭本身会被推坏。确实需要更大音量,正确做法是走 DAC 输出外接功放,或者用双通道功放一颗对一个喇叭。

封装按整机结构选,三款尺寸如下。

型号

封装

尺寸 长乘宽乘高

内置容量

WT2003H0

SOP16 或 TSSOP24

9.99 × 6 × 1.75 mm

必须外挂 Flash

WT2003H4

SOP16 或 TSSOP24

8.65 × 6 × 1.75 mm

4Mbit

WT2003HP8

QFN32

4 × 4 × 0.75 mm

8Mbit

臂式血压计空间宽裕,H4 的 SOP16 成本最优。腕式机型或者一体化模块板面紧张,HP8 的 QFN32 只有 4 毫米见方、厚度 0.75 毫米,底部带散热焊盘,用不到的管脚悬空即可,但必须接对地电容的那几个脚不能悬空。

串口指令怎么发

WT2003Hx 的通讯帧格式很规整,起始码 7E,然后是长度、命令码、参数,最后是校验和与结束码 EF。长度等于参数字节数加 3,校验和取长度加命令码加所有参数之和的低八位。串口默认 9600 波特率,8 位数据位,无校验,一位停止位,电平是 3.3 伏 TTL,和主流 MCU 直连不用电平转换。

常用指令就这么几条。

命令码

功能

参数

9D

播放根目录指定索引

两字节索引,高位在前

95

播放文件包内指定索引

两字节索引

AB

停止播放

AE

设置音量

一字节,0 到 31

B1

插播

见说明书对应章节

B6

切换输出通道

一字节,功放或 DAC

B8

进入低功耗

9C

屏蔽或打开虚拟盘符

一字节

C2

查询播放状态

发送代码封装一层就够用,下面这段在 STM32 HAL 环境下验证过。

/* WT2003Hx 通讯帧封装,起始 7E,结束 EF */

static void wt_send(uint8_t cmd, const uint8_t *par, uint8_t parlen)

{

uint8_t buf[16];

uint8_t len = parlen + 3; /* 长度等于参数长度加三 */

uint8_t sum = len + cmd; /* 校验和从长度和命令码开始累加 */

uint8_t i, n = 0;

buf[n++] = 0x7E;

buf[n++] = len;

buf[n++] = cmd;

for (i = 0; i < parlen; i++) {

buf[n++] = par[i];

sum += par[i];

}

buf[n++] = (uint8_t)(sum & 0xFF); /* 只取低八位 */

buf[n++] = 0xEF;

HAL_UART_Transmit(&huart2, buf, n, 100);

}

/* 播放根目录第 idx 段语音 */

static void wt_play(uint16_t idx)

{

uint8_t par[2];

par[0] = (uint8_t)(idx >> 8);

par[1] = (uint8_t)(idx & 0xFF);

wt_send(0x9D, par, 2);

}

/* 音量设置,取值 0 到 31 */

static void wt_volume(uint8_t vol)

{

if (vol > 31) vol = 31;

wt_send(0xAE, &vol, 1);

}

static void wt_stop(void) { wt_send(0xAB, NULL, 0); }

static void wt_sleep(void) { wt_send(0xB8, NULL, 0); }

拿播放根目录第一段验证一下手算结果,长度是 5,命令码 9D,参数 00 01,校验和等于 05 加 9D 加 00 加 01 等于 A3,完整帧就是 7E 05 9D 00 01 A3 EF。音量设到 30,帧是 7E 04 AE 1E D0 EF。停止是 7E 03 AB AE EF,进休眠是 7E 03 B8 BB EF。调试阶段拿串口助手把这几帧直接甩过去,能出声就说明硬件没问题,可以放心往上写业务逻辑。

芯片对每条指令都有返回码,医疗产品建议把它接进自检流程,比盲发可靠得多。

返回码

含义

常见成因

00

命令执行成功

正常

01

命令出错不执行

校验和算错、指令编辑错误、串口电平异常

02

无此文件

索引号超出实际文件数,或盘符不是 FAT 与 FAT32 格式

05

设备不在线

索引到未挂载的存储介质,或存储电路异常

调试阶段最常见的一个坑不在代码里。芯片的 USB 还插在电脑上时,电脑会持续读盘,此时芯片会关掉串口,怎么发码都没反应。拷完音频一定要先拔 USB 线再发码。另外串口工具要用 3.3 伏供电且不要接在扩展坞上,有些扩展坞驱动能力不足,发出去的电平芯片认不出来。

数字结果怎么拼出来

先把语音文件按顺序放进根目录,索引就是排序号。这里有个反直觉的地方必须提前讲清楚:索引顺序是按文件拷进盘符的先后排列的,不是按文件名的序号从小到大排。也就是说文件名前面编了 01 到 22,如果拷贝时是一个一个拖进去的,实际索引就是拖拽的顺序。正确做法是在电脑上先把音频按顺序排好,鼠标选中第一个文件,再全选,然后整批拷贝或者右键发送到目标盘符。这一步在产线上错一次,整机播报就全乱套,而且现象很迷惑,发 01 却播出第 3 首。

索引

内容

索引

内容

1 至 10

零 一 二 三 四 五 六 七 八 九

13

收缩压

11

14

舒张压

12

15

脉搏

16

毫米汞柱

18

血压偏高,建议复测

17

次每分

19

袖带未系好

拼读逻辑按中文习惯处理三位数,注意两个细节:十几要读成十几而不是一十几,中间有零要补一个零字。

#define IDX_DIGIT(d) ((uint16_t)((d) + 1)) /* 数字 0 到 9 对应索引 1 到 10 */

#define IDX_SHI 11

#define IDX_BAI 12

#define Q_SIZE 32 /* 一次完整结果最多约 22 段,留足余量 */

static uint16_t q_buf[Q_SIZE];

static uint8_t q_head, q_tail;

static void q_push(uint16_t idx)

{

if (((q_tail + 1) % Q_SIZE) != q_head) {

q_buf[q_tail] = idx;

q_tail = (q_tail + 1) % Q_SIZE;

}

}

/* 把 0 到 299 的整数拆成语音索引压进队列 */

static void q_push_number(uint16_t n)

{

uint8_t h = n / 100;

uint8_t t = (n / 10) % 10;

uint8_t o = n % 10;

if (h > 0) {

q_push(IDX_DIGIT(h));

q_push(IDX_BAI);

if (t == 0 && o != 0) q_push(IDX_DIGIT(0)); /* 一百零五 */

}

if (t > 0) {

if (!(h == 0 && t == 1)) q_push(IDX_DIGIT(t));/* 十六不读一十六 */

q_push(IDX_SHI);

}

if (o > 0) q_push(IDX_DIGIT(o));

if (n == 0) q_push(IDX_DIGIT(0));

}

/* 播报一次完整测量结果 */

void speak_result(uint16_t sys, uint16_t dia, uint16_t pulse)

{

q_push(13); q_push_number(sys); q_push(16);

q_push(14); q_push_number(dia); q_push(16);

q_push(15); q_push_number(pulse); q_push(17);

if (sys >= 140 || dia >= 90) q_push(18);

}

这里要解释一下为什么不用芯片自带的连码播放功能。UART 通信最大支持 20 组连码,走定制工程可以做到 100 组,但标准品就是 20 组。一次完整的血压结果播报,三个三位数最坏情况下拆出 15 段数字,加上收缩压、舒张压、脉搏、单位、次每分和异常提醒,总共能到 22 段,已经超出标准品的连码上限。所以老老实实用队列逐条发,反而更稳,也更容易插播和打断。

队列在主循环里出队,靠 BUSY 脚判断上一段有没有播完。BUSY 在播放期间是高电平,回落到低电平表示这一段结束。说明书里明确要求连续命令之间留 200 到 300 毫秒间隔,这一条一定要遵守,发太快芯片会丢帧。答疑集给了一个更聪明的做法:UART 通信可以判断芯片的返回码,收到 00 执行成功后再发下一条,比死等固定延时响应更快。

void wt_queue_poll(void)

{

static uint32_t last_tick = 0;

if (q_head == q_tail) return; /* 队列空 */

if (HAL_GPIO_ReadPin(BUSY_PORT, BUSY_PIN) == GPIO_PIN_SET) return; /* 还在播 */

if (HAL_GetTick() - last_tick < 300) return; /* 间隔不足 300 毫秒 */

wt_play(q_buf[q_head]);

q_head = (q_head + 1) % Q_SIZE;

last_tick = HAL_GetTick();

}

还有一点要留意,芯片上电后需要 500 毫秒到 1 秒的初始化时间,这期间发码无效。这个数值是 PC 模式特有的,因为要挂载文件系统;不带盘符的普通语音工程只要 300 毫秒左右。血压计一般是按键开机,MCU 自检那段时间正好覆盖过去,把首次发码放在自检之后就不会有问题。异常提醒这类需要抢先播的内容,也可以不走队列,直接用 B1 插播指令处理,不打断主流程。

拼读方案的两个隐藏成本

按位拼读省容量,但代价藏在时间和听感里,这两笔账在别的场景可以忽略,放到 22 段连播上就会被放大。

第一笔是响应延时。同一段音频,MP3 格式从发码到芯片真正出声要 150 毫秒,其中 100 毫秒是发码到 BUSY 拉高,另外 50 毫秒是 MP3 文件前后自带的静音;换成 WAV 格式,发码到出声只要 45 毫秒,BUSY 拉高到出声仅 1 毫秒。差值是 105 毫秒,单看没什么,乘以 22 段就是 2.3 秒。一句血压结果硬生生慢两秒多,而且每个字之间都能听出停顿,体验立刻打折。

结论是数字语料用 WAV,固定长句仍用 MP3,两种格式芯片都支持,可以混放在同一个盘符里。这样做容量还得再算一遍。WAV 不压缩,8K 采样 16 位单声道每秒约 16K 字节,12 段数字每段半秒,合计约 96K 字节;9 条固定语句仍走 16 千比特每秒的 MP3,22.5 秒约 45K 字节。总计约 141K 字节,落在 WT2003H4 那 180K 的额度内,单芯片方案依然成立。如果语音节点还要往上加,直接换 HP8 的 701K 就行,硬件不用改。

第二笔是衔接杂音。上一段结束时波形从高回落,下一段开始又从低拉起,这种高低高的幅值跳变加上解码处理,连播时很容易在接缝处听到嗒声,接了功放放大之后更明显。三种处理办法可以叠加使用:音频文件首尾各留一小段静音,把开头结尾的音量坡度做平缓,程序侧再配合淡入淡出。数字语料本身很短,做完这三步再听一遍完整拼读,接缝基本就听不出来了。

低功耗怎么压

血压计多数是干电池供电,待机电流是核心指标。WT2003Hx 提供两级休眠,发一条 B8 指令进深度休眠,电流在 5 微安以内;原地休眠约 30 微安,唤醒更快。放在整机功耗账里看,MCU 待机通常就是几十微安起步,语音芯片这一路 5 微安基本可以忽略不计,不会成为待机时间的瓶颈。

这里必须强调一点,UART 工程不会自己进休眠。一线两线工程上电 5 秒不播放会自动进深度休眠,UART 则要主动发指令才进去,而且唤醒一次之后就不会再自动回去,必须再发一次休眠指令。忘了这一步,芯片会一直待在未休眠状态,单芯片待机功耗在 4 到 5 毫安,比休眠状态高了三个数量级,干电池机型几天就没电。这是最容易被漏掉的一条,量产前务必用电流表实测确认。

判断有没有真的进休眠有个不用拆板的办法:量 VOUT 脚电压。正常工作时在 3.1 到 3.2 伏之间,进入深度休眠后会下降 80 毫伏左右。顺带一提,如果测到 VOUT 低于 3.0 伏或者高于 3.3 伏,说明芯片状态不对,前者多半是供电不足或空片,后者通常是外部电平串进来了,产测时可以把这一项做成判据。

实际设计的节奏是这样:开机播完提示语进原地休眠,测量过程中随时准备播报,测量结束播完结果延时几秒发 B8 进深度休眠,整机关机时电源直接断掉。工作电压范围 2.6 到 5.0 伏,两节五号电池从满电到欠压这段区间全覆盖,中间不用加升压电路,又省一组器件。

多语言与产线锁定

出口机型这块是 MP3 路线最能打的地方。芯片通过 USB 接电脑会枚举成一个虚拟 U 盘,把 MP3 或 WAV 文件按顺序拷进去就完成换音,不需要烧录器,不需要改硬件。产线上一台电脑接治具,中文版拷中文包,英文版拷英文包,西语版拷西语包,物料编码只有一个,库存压力大幅下降。后期客户要改一句提示语,发个新语音包过去,产线换文件就行,不涉及任何回厂动作。

产线上要守三条规矩。盘符格式只认 FAT 与 FAT32,格式化成 NTFS 会一直返回 02 无此文件,这个报错很容易被误判成指令写错。拷贝要整批选中一次拖进去,保证索引顺序正确。拷完必须拔掉 USB 线,插着电脑时芯片的串口是关闭的。节拍方面,拷贝速率大概每秒 32K 字节,141K 字节的语音包五秒左右就写完了,不会成为产线瓶颈。如果嫌每台都要格式化太费时,可以把格式化好并拷入音频的 Flash 内容整体读成 bin,出货前直接烧进去。

内容锁定用 9C 指令。出厂标定完成后发一条 9C 屏蔽虚拟盘符,之后设备接电脑不再弹出磁盘,终端用户和维修环节都改不了语音文件,避免误删或误替换导致播报错乱。需要维护时再用同一条指令打开,操作可逆但不对外暴露。

上机前要检查的几件事

106 电容有没有接在 VCC 和 VOUT 到地,位置是否控制在管脚 1 厘米以内,回路有没有绕远。这是排查播放异常和播放中断的第一站,实际案例里绝大多数发不出声、播一半断掉,根子都在这里。

MCU 的 TX 到芯片 RX 之间那颗反接二极管有没有画上,负极是不是靠近 MCU 一侧。MCU 是 5 伏电平系统的话,这一颗是必须项。

喇叭规格是不是 8 欧 0.5 瓦,有没有人为了音量偷偷换成 4 欧或者并了两个,这是会烧片的红线。

上电后是否等够 500 毫秒到 1 秒再发第一条指令,连续指令之间是否留够 200 到 300 毫秒。切到 DAC 输出的指令建议放在最前面,发完等 200 毫秒再发播放指令。

UART 工程有没有在流程末尾主动发休眠指令,实测待机电流是不是在微安级而不是毫安级。

外接功放的方案,AGND 是否用 0 欧电阻和 GND 单点隔离,这一条直接影响底噪表现。功放使能如果用 BUSY 驱动,注意 BUSY 是空闲低播放高,别和功放的使能极性接反了。

USB 数据线上的 TVS 结电容是否选到 10 皮法量级,选大了会拖累枚举成功率。

需要外挂 Flash 扩容的机型,建议用唯创原厂料,杂牌颗粒容易出现杂音爆音,医疗器械上出这种问题很难交代。芯片和外挂 Flash 的距离控制在 1 到 2 厘米以内,走线别绕。

WT2003Hx 医疗设备适用特性

32 位处理器主频最高 120 兆赫,单声道,支持 MP3 和 WAV 双格式,采样率 8K 至 44.1K,码率 8 至 320 千比特每秒,位深 16 位

内置 16 位高精度 DAC,配 0.5 瓦 8 欧 D 类功放,PWM 两脚直推 8 欧 0.5 瓦喇叭,无需外置功放

深度休眠电流小于 5 微安,原地休眠约 30 微安,电池设备友好

工作电压 2.6 至 5.0 伏,两节干电池全区间覆盖,免升压电路

UART 默认 9600 波特率 3.3 伏 TTL 电平,指令集完整,带执行结果返回码,几行代码接入

BUSY 状态脚硬件反馈播放进度,空闲低电平播放高电平,多段拼读时序好控制

WAV 格式发码到出声仅 45 毫秒,长句拼读连贯不拖沓

USB 虚拟 U 盘拖拽换音,只需 FAT 或 FAT32 格式,多语言产线一套硬件搞定

9C 指令屏蔽虚拟盘符,出厂后语音内容不可随意改写

三款封装可选,H4 的 SOP16 为 8.65 乘 6 乘 1.75 毫米,HP8 的 QFN32 仅 4 乘 4 乘 0.75 毫米并带散热焊盘

片内语音容量 H4 为 180K 字节、HP8 为 701K 字节,最大可外挂 128Mbit Flash 或 32G 的 TF 卡与 U 盘

音量 0 到 31 级软件可调,支持功放与 DAC 双路输出切换

← 返回列表