炒菜时两手都是油,再去按油烟机面板的按键,十分别扭。给油烟机加一套语音控制,说一句打开油烟机就启动,是顺手的事。本文用唯创知音 WTK6900HC 这颗离线语音识别芯片,从硬件接线到命令词配置,把整套做法走一遍。
先说清楚做完能得到什么,需要什么,哪里最容易卡。
做完以后,油烟机可以用唤醒词加命令词控制开关、风量大小、照明和延时关机,全程不连网,没有云端延迟,也不怕断网。需要准备 WTK6900HC 模块(SOP16 封装最省事)、一支驻极体麦克风、一只喇叭、24M 无源晶振、几颗电容,以及一块做逻辑控制的主控 MCU。纯播报可以不要 MCU,本文按带 MCU 的实战来讲。最容易卡住的地方有两处,麦克风走线离电机太近被干扰导致误唤醒,还有 UART 数据帧的校验和算错让 MCU 收不到命令。
先认识这颗芯片
WTK6900HC 是一颗本地语音触发识别芯片,识别在芯片内部完成,不需要网络。它用 32 位内核,主频 240MHz,带硬件浮点。语音识别用的是离线神经网络算法,规格书写明 5 米远场可以可靠识别,还有语音降噪,对稳态噪声和动态噪声都有抑制,炒菜的抽风声、锅铲声下也能识别。
电源是它好用的地方。VCC 支持 2.8V 到 5.2V 宽压,油烟机里现成的 5V 或者 3.3V 电源都能直接喂。芯片内置可选 1MB、2MB、4MB 的 SPI FLASH,用来放识别模型和提示音,型号末尾的数字对应容量,比如 WTK6900HC8 是 1MB,HC6 是 2MB,HC3 是 4MB。
它还有蓝牙 5.1,本方案不靠蓝牙,重点放在离线识别上,但如果你后面想接手机做配置,这颗芯片自带射频,不用另加模块。
SOP16 硬件接线
油烟机这种家电,选 SOP16 封装最合适,引脚少,外围简单。下面按引脚顺序把接线讲清楚。
引脚3 VCC 接 3.3V 或 5V 电源,引脚15 GND 接电源负极。
引脚4 VOUT 是给外挂 SPI FLASH 的供电口,规格书明确要求必须接一个 105 电容到地,这颗电容不能省,省了 FLASH 供电会不稳。引脚16 VMID 是内部参考电压脚,同样接 105 电容到地。
引脚13 MICLDO 是麦克风供电端,引脚14 MIC+ 是麦克风输入,这两脚接驻极体麦克风。规格书推荐的麦克风型号是 JMO-627BA283R-10TC38。麦克风走线尽量短,远离电机和电源。
引脚1 DACL 是音频输出,DAC 支持直推,但直推功率小,接喇叭前最好加一级功放,或者用小功率喇叭做提示音播报。
引脚7 OSCI 和引脚8 OSCO 接 24M 无源晶振的两端,这是芯片的主时钟。
引脚6 ANT 接天线,可以用 PCB 板载天线或者弹簧天线。离线识别不靠天线传数据,但芯片带蓝牙,要蓝牙功能天线就得接好。
引脚9 RX 和引脚10 TX 是 UART 异步串口,接主控 MCU。注意交叉接,芯片的 TX 接 MCU 的 RX,芯片的 RX 接 MCU 的 TX。这是 3.3V TTL 电平,数据格式是 1 位起始位、8 位数据位、无奇偶校验、1 位停止位。
引脚2 P21/BUSY 是 BUSY 脚,芯片在播报提示音时这个脚状态会变化,MCU 可以读它判断播报有没有结束。
引脚11 ICEDAT/D- 和引脚12 ICECLK/D+ 是烧录口,量产时用离线下载器从这里烧录固件,正常接线用不到。
UART 数据帧怎么读
命令词被识别以后,芯片通过串口主动发出一帧数据,MCU 解析这帧数据就知道用户说了哪条命令。帧结构如下。
| 字段 | 值 | 说明 |
| 起始码 | 7E | 一帧的开始 |
| 长度 | 06 | 从长度自己到校验和的字节数 |
| 扩展码 | FF 06 | 固定前缀 |
| 命令码 | 01 | 表示识别结果上报 |
| 词条ID | 由平台分配 | 哪条命令词被识别 |
| 校验和 | 累加低字节 | 见下方算法 |
| 结束码 | EF | 一帧的结束 |
校验和这样算,把长度、扩展码两个字节、命令码、词条ID 这几个数加在一起,只取结果的低 8 位。拿规格书里的例子验证,打开灯光对应的帧是 7E 06 FF 06 01 02 0E EF。词条ID 是 02,加总 06 加 FF 加 06 加 01 加 02 等于 270,270 对 256 取余是 14,也就是 0E,和帧里的校验和一致。
MCU 收到一帧,先找 7E 开头、EF 结尾,按上面结构取出词条ID,再算一遍校验和比对,一致就执行对应动作。
除了识别结果上报,芯片还支持几条控制指令。音量用 A1 指令,1 到 5 级可调,带掉电记忆。A7 指令发 00 唤醒、发 FF 退出唤醒。02 指令进低功耗,任意再发一帧就能退出。A0 是被动播报应答,MCU 发码让芯片播某条提示音,芯片回 A0 表示执行成功。C0 指令查软件版本,用来追溯固件版本。
命令词怎么配
识别哪几句话、每句话对应哪个词条ID,不在代码里写死,而是在唯创知音在线语音平台做好工程再下载进芯片。平台地址是 https://wt588f.waytronic.com:8443 。
进平台新建一个工程,选 WTK6900HC 系列,先设唤醒词,再添加命令词。油烟机常用的命令词可以这样列。
| 命令词 | 建议播报 | 动作 |
| 打开油烟机 | 油烟机已打开 | 继电器吸合,风机启动 |
| 关闭油烟机 | 油烟机已关闭 | 继电器断开 |
| 风量加大 | 风量加大 | 提高风机档位 |
| 风量减小 | 风量减小 | 降低风机档位 |
| 打开照明 | 照明已打开 | 照明灯继电器吸合 |
| 关闭照明 | 照明已关闭 | 照明灯断开 |
| 延时关机 | 五分钟后关闭 | 启动定时 |
词条ID 由平台按添加顺序分配,工程编译下载以后,芯片识别到某条命令词,就会发出对应 ID 的 UART 帧。上面表里用了 01、02 这样的占位,实际 ID 以平台工程为准。
工程做好后,用离线语音识别下载器把固件烧进芯片。烧录走的是引脚11、12 的烧录口,或者用平台的下载工具。麦克风记得用规格书推荐的驻极体型号,灵敏度匹配好了识别率才稳。
MCU 怎么处理
MCU 侧的逻辑不复杂。串口中断收到数据先缓存,等收到完整的 7E 开头、EF 结尾一帧,按结构取出词条ID,比对校验和,然后查一张动作表。
词条ID 是打开油烟机的编号,就控制风机继电器吸合,同时可以等 BUSY 脚回来确认提示音播完。风量加大减小,对应调 PWM 输出的占空比改变风机转速。延时关机,开一个定时器,时间到再断开继电器。
给一段处理思路,不写死具体 ID。
收到 7E 开头 EF 结尾的完整帧。
取第五字节作为词条ID。
校验和比对,不对就丢弃。
按 ID 查动作表。
打开油烟机,风机继电器吸合。
关闭油烟机,风机继电器断开。
风量加大,PWM 占空比上调。
风量减小,PWM 占空比下调。
BUSY 脚在播报时状态变化,如果你的提示音比较长,可以等 BUSY 回到空闲再发下一条指令,避免播报被打断。
几个实战坑
麦克风是整套里最容易出问题的一环。油烟机电机一转就是强干扰源,麦克风走线要远离开关电源和电机绕组,最好加屏蔽,走线短而直。误唤醒多了,可以在平台换更特异的唤醒词,或者调低识别灵敏度。
电源要干净。VOUT 那颗 105 电容和 VMID 的 105 电容别省,它们是 FLASH 和参考电压稳定的关键。
想省电,空闲时用 02 指令让芯片进低功耗,任意发一帧码就能唤醒,适合用电池供电的便携式场景,油烟机一般是常电,这步可省。
照上面接好线、配好词,说一句打开油烟机,继电器吸合,风机转起来,这套语音控制就跑通了。
659
