
家用血压计加语音播报早就不是加分项而是渠道验收的硬指标。本文从血压计的实际交互流程出发讲清楚语音芯片选型要卡哪几个参数并给出 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 路线 WTN6Flash 路线 WT588FMP3 路线 WT2003Hx换音方式整片回厂重烧烧录器重烧或在线更新插电脑当 U 盘拖拽即换多语言支持每个语种一版物料需重新烧录产线拷不同语音包硬件一套音质PWM 直推够用16 位内核较好16 位高精度 DAC最优控制方式一线两线串口或按键烧写时选定接口标准 UART指令集完整休眠电流10 微安以下微安级深度休眠 5 微安以内适用机型单语种、文案永不改的低端机语音较多、偶尔更新出口机型、多语种、需要迭代文案结论很直接。只做国内单一 SKU、文案定死不改的入门机OTP 成本最低。一旦涉及出口、多语种、或者产品线要持续迭代提示语MP3 路线才是省心的选择WT2003Hx 把功放、DAC、文件系统和 UART 控制都收进一颗芯片后期维护成本几乎为零。WT2003Hx 的硬件接法血压计这类设备板子紧张接法越简单越好。典型连接只有四根线MCU 的串口发送脚接芯片 RX芯片 TX 接 MCU 接收脚BUSY 脚回读播放状态剩下就是电源地。喇叭直接挂在 PWM 两个脚上不需要任何外置功放。SOP16 封装的关键管脚如下。管脚编号说明RX6接 MCU 串口发送脚TX16接 MCU 串口接收脚BUSY15播放期间高电平空闲低电平PWM13直推喇叭正极PWM-14直推喇叭负极DAC9外接功放时走这路VCC112.6 至 5.0 伏供电VOUT10内部稳压输出必须外接电容GND12数字地AGND8模拟地用 0 欧电阻和 GND 隔离D / D-4 / 5USB 数据产线下载语音用外围物料非常少主要是这几项。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 输出外接功放或者用双通道功放一颗对一个喇叭。封装按整机结构选三款尺寸如下。型号封装尺寸 长乘宽乘高内置容量WT2003H0SOP16 或 TSSOP249.99 × 6 × 1.75 mm必须外挂 FlashWT2003H4SOP16 或 TSSOP248.65 × 6 × 1.75 mm4MbitWT2003HP8QFN324 × 4 × 0.75 mm8Mbit臂式血压计空间宽裕H4 的 SOP16 成本最优。腕式机型或者一体化模块板面紧张HP8 的 QFN32 只有 4 毫米见方、厚度 0.75 毫米底部带散热焊盘用不到的管脚悬空即可但必须接对地电容的那几个脚不能悬空。串口指令怎么发WT2003Hx 的通讯帧格式很规整起始码 7E然后是长度、命令码、参数最后是校验和与结束码 EF。长度等于参数字节数加 3校验和取长度加命令码加所有参数之和的低八位。串口默认 9600 波特率8 位数据位无校验一位停止位电平是 3.3 伏 TTL和主流 MCU 直连不用电平转换。常用指令就这么几条。命令码功能参数9D播放根目录指定索引两字节索引高位在前95播放文件包内指定索引两字节索引AB停止播放无AE设置音量一字节0 到 31B1插播见说明书对应章节B6切换输出通道一字节功放或 DACB8进入低功耗无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 千比特每秒的 MP322.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 双路输出切换