
把空调内机改成语音控制最先要回答的问题其实不是“怎么识别语音”而是“到底用哪颗芯片”。我在这个项目里折腾了一圈最后锁定的是 CI-03T 这颗带红外码库的离线语音方案。它最吸引我的点有两个一是内置的红外码库覆盖了大量空调品牌不用自己一个个去抓码二是整颗芯片专为红外遥控场景设计语音识别、红外发射、电源管理都集成在一起外围电路很简洁。但真正开始画板、接线之后才发现这玩意儿不是“通电就能跑”这么简单——5V 供电和 3.3V 串口电平之间的坑、麦克风开孔和声学结构对唤醒率的影响才是项目里最花时间的部分。这篇文章就把我从选型到实装的全过程拆开讲清楚适合正在做空调/家电语音改造、或者打算把离线语音模块塞进内机的朋友参考。1. 项目背景与方案选型空调内机语音控制为什么绕不开 CI-03T1.1 空调语音控制的三种常规路线空调的语音控制听起来不难但真落到“改造内机”这个具体场景路线选择会直接决定项目成败。我列一下常见的三种方案智能音箱 红外网关比如小爱音箱加一个万能红外遥控器语音识别在云端通过音箱把红外码发给空调。优点是设备现成、开发量几乎为零缺点是必须有网络而且音箱和空调要在同一个空间响应链路长本地断网直接瘫痪。WiFi 模块 APP 云控制在空调内机里塞一个 ESP8266/ESP32 模块接入米家/HomeAssistant 这类平台。这部分如果空调本身有协议支持还好没有的话就得自己逆向遥控器或者抓主板串口协议风险和工程量都不小改动原主板还会带来售后和安全性问题。离线语音芯片 红外直发用 CI-03T 这类带语音识别和红外发射的芯片识别、解码、发射全部本地完成不依赖网络不改动空调主板只需要用红外对着内机的接收窗发指令就行。我最后选了第三条路线。原因很直接空调内机的主板最好别去动一旦动了原厂保修、用电安全、故障排查都会变得复杂。红外方案相当于给空调配了一个“永远不需要电池的遥控器”物理上隔离了电控部分安全性最高开发周期也最短。1.2 CI-03T 这颗芯片解决了什么痛点CI-03T 是启英泰伦 Ci 系列里一颗很典型的离线语音控制芯片。它把语音前端、识别引擎、红外码库、红外发射驱动都做进了同一个方案里开发者要做的就是接好麦克风、喇叭、电源和红外发射管然后配置命令词和码库索引。在选型的时候我仔细对比过它和通用语音芯片 单独红外模块的组合方案。通用方案虽然灵活但带来两个额外问题第一红外码的采集和存储要自己做需要一个红外接收头、一个学习流程、外加一套码型管理逻辑第二语音模块和红外模块之间的串口/GPIO 通信协议需要自己定排错成本高。而 CI-03T 把码库固化在方案里通过命令直接按品牌、型号发码开发量少了一大截。当然选它之前也要想清楚自己的需求边界。如果你需要的是带屏交互、需要接入智能家居平台做场景联动那 CI-03T 并不是合适的选择这类芯片的核心场景是“本地、离线、单点控制”。而如果只是想让空调、电视、风扇这些红外家电听懂人话它就是把成本、开发难度和稳定性平衡得比较好的一颗。2. 红外码库优势解析从“学习型遥控器”到“离线码库”2.1 码库方案 VS 学习型方案的差别我在早期原型里用过一段时间的“学习型遥控器”方案也就是用红外接收头把原装遥控器的码采下来存到 Flash 里再按需发射。这样做的缺点非常明显每个遥控器都要单独采集一遍不同空调品牌、不同型号的码型各不相同后期维护很痛苦。红外码型有时候会长达几百毫秒解析和存储需要考虑时序精度MCU 稍微忙一点就可能丢码。采集环境的光线、反射都会影响收到的波形经常出现“采下来当时能用、第二天就失灵”的诡异问题。CI-03T 内置的红外码库方案完全绕开了这些麻烦。它把市面上常见品牌格力、美的、海尔、奥克斯、TCL、长虹、海信、志高这些主流牌子基本都有的空调码型直接固化在库里面使用时只需要指定“品牌 命令”芯片就会自动调出对应的码型发射出去。不需要学习、不需要外挂存储发射成功率也稳定得多。2.2 码库覆盖面与适配逻辑码库方案虽然方便但有一个前提条件你的空调品牌和型号必须落在码库覆盖范围内。所以在实际项目里我不是拿到芯片就急着焊而是先花半天时间把家里几台空调的铭牌信息整理出来品牌、型号、遥控器型号、是冷暖机还是单冷机、变频还是定频逐条记录然后对着厂家提供的码库清单查覆盖情况。第一次测试的时候最好用“强制代码”的方式逐个索引试发听空调的蜂鸣声和风叶动作来判断是否命中。这里有个小技巧测试温度调节比测试开关机更容易判断因为开机命令往往是多个码型共用的但温度加减和模式切换的差异化更明显一旦温度能成功调整基本可以确认码型是对的。提示码库覆盖不等于 100% 兼容。尤其是 2020 年之后新出的机型如果用的是新码型码库里可能还没有。遇到这种情况我的处理方式是“码库为主、学习为辅”——CI-03T 如果后续支持外接学习模块就把学习到的码也存进去兜底不支持的话至少要保留一个原装遥控器作为备用手段。2.3 码库方案里的隐藏坑码库方案看起来很简单实际踩过之后我才发现有几个容易忽略的点。第一个坑是“同品牌不同分区”。同一个格力遥控器可能分冷暖、单冷、变频、定频好几套码型。码库索引里如果有多个配置必须一个一个试不能想当然认为“选第一个就行”。第二个坑是功能覆盖不完整。有些码库虽然能开关机和调温度但风速、扫风、定时这类辅助功能可能没有对应指令。入手前要仔细看码库功能说明把空调上你确实需要的高频功能列个清单挨个勾选确认。第三个坑是“伪成功”。有的码型发出去之后空调会响一声或者指示灯闪一下看起来像是收到了但实际上并没有执行命令。这种情况我遇到过好几次常见原因是码型的“前导码数据位”能对上部分协议但关键的函数位或校验位不对。所以测试的时候不要只看蜂鸣器一定要观察风叶和温度显示的实际变化。3. 供电与串口电平5V 不等于 3.3V别让通信“假死”3.1 为什么 5V 供电不等于 5V 串口这是我在这个项目里最大的一个坑也是标题里“5V 供电≠3.3V 串口”这句话的由来。CI-03T 的 VCC 可以接 5V板上一般会做降压处理但它的 UART 串口电平是 3.3V CMOS 电平。也就是说你用 5V 给它供电不代表你可以把另一块 5V 单片机的 TX 直接接到它的 RX 上。如果直接把 5V 电平灌进 3.3V 的 RX 引脚芯片内部的 IO 保护电路可能扛不住长期使用极易损坏就算短时间没事也会因为电平阈值不匹配导致误码。反向更危险——如果把 CI-03T 的 3.3V TX 接回到 5V 单片机的 RX3.3V 高电平可能达不到 5V 器件的“高电平阈值”单片机收到的是不确定状态通信就会时好时坏。这和很多人理解的“TTL 电平都一样”完全不同。5V MCU 和 3.3V 外设之间不转换电平就直连属于典型的电气规范错误。3.2 用三极管做 1.8V→3.3V 串口电平转换参数怎么算标题里既然提到了“三极管 1.8V 转 3.3V 串口”我就重点讲一下这个需求。为什么会出现 1.8V 转 3.3V因为有些空调内机主板上的主控 SoCIO 电平是 1.8V低压高性能芯片很常见。如果你想在不改动主板的前提下偷偷从主板的 UART 接口抓数据或者做同步控制就会遇到 1.8V 电平对接 CI-03T 的 3.3V 串口问题。用 NPN 三极管做单向转换是最便宜的做法。典型接法三极管基极B通过 Rb 接 1.8V 的 TX 信号发射极E接地集电极C通过上拉电阻 Rc 接到 3.3V从集电极取信号给 CI-03T 的 RX。这个电路的本质是“低电压控制高电压开关”当 1.8V TX 输出高电平时三极管导通集电极被拉到接近 0V当 TX 输出低电平时三极管截止集电极被上拉到 3.3V。看到这里你应该发现问题了——它的输出和输入是反相的。而 UART 信号在空闲状态下保持高电平如果直接这样接CI-03T 的 RX 在空闲时会被拉到低电平串口会一直判为“忙”或直接报错。解决反相问题有两个思路软件取反如果 CI-03T 的 UART 支持极性反转配置可以把 RX 极性改成低电平有效但这依赖芯片固件是否开放这个配置实际用起来并不方便。两级三极管反相第一级反相之后第二级再反相一次输出就回到同相了。电路上用两个 NPN 管级间用电容耦合或者直接用直流耦合都可以但要注意每一级的静态工作点。参数计算以最常见的 S9013/S8050 三极管为例。假设 1.8V 高电平基极需要电流 Ib ≈ 0.5~1mA取 Ic 2mA这样上拉电阻上的压降足够明显三极管放大倍数 hFE 按 100 算那么基极电流只需要 20μA 足够但我们一般取 0.5mA 来确保饱和导通。Rb (1.8V - 0.7V) / 0.5mA ≈ 2.2kΩ取标准值 2.2kΩ。Rc 的取值决定输出高电平的上拉强度和翻转速度Rc (3.3V - 0.2V) / 2mA ≈ 1.5kΩ考虑低功耗可以取 4.7kΩ但上拉电阻太大分布电容会影响高速波形9600 波特率下问题不大如果跑 115200 就建议取 1kΩ 到 2.2kΩ。更省心的替代方案是直接用 MOS 管电平转换电路典型接法是一颗 2N7002 加一个上拉电阻或者买现成的 TXB0104 电平转换模块几块钱一片双向转换不用管反相问题。给空调内机这种一劳永逸的改造场景花这几块钱比在三极管反相问题上调试半天划算得多。3.3 电平转换实操接线与验证方法实操接线时我总结了一套固定顺序能避免大部分低级错误先接电源和地CI-03T 的 GND、空调主板 MCU 的 GND、电平转换模块的 GND 必须共地这是通信的前提。再接串口TX 接 RX、RX 接 TX注意交叉不要接成 TX 对 TX。最后接电平转换模块的电源先给 CI-03T 上电再给转换模块上电尽量避免热插拔。接完之后不要急着跑业务逻辑先用串口工具做回环测试。一个简单有效的验证方法把 CI-03T 的 TX 接到转换模块的输入转换输出接到 USB-TTL 的 RX然后在电脑串口助手里发送 0x55 或 0xAA看收到的数据是否一致。0x55 的二进制是 010101010xAA 是 10101010这两个数据的边沿变化密集很容易从波形或字节上判断电平转换电路是否正常。如果发现数据全 FF 或者全 00优先检查共地和接线交叉如果数据乱码就要用示波器或逻辑分析仪看波形。重点观察高电平幅值是否达到 3.3V、低电平是否接近 0V、波特率是否一致。我调试的时候抓到过一次“波形成功但相位反了”的情况就是三极管电路反相问题最后换成 MOS 管模块解决的。注意千万别用“先接上去看看会不会坏”这种心态来调试电平转换。3.3V 器件被 5V 电平打死通常不会当场冒烟而是“用几天之后莫名其妙不工作”排查起来非常痛苦。4. 空调内机声学结构规范麦克风不是随便焊上去就能用4.1 开孔与拾音方向语音芯片装进空调内机最难的不是电路而是声学结构。我在第一批样机上就吃过亏麦克风焊在板子上直接塞进内机结果唤醒率只有不到 30%站在空调下面喊破嗓子都没反应。问题的根源在于麦克风开孔和拾音方向。麦克风的开孔不能随便打。孔径大小直接影响高频响应和信噪比一般建议开 4~6mm 的圆孔。孔径太小声音进不来中高频衰减严重孔径太大灰尘和异物容易进入也容易产生风噪。开孔位置要尽量靠近麦克风的拾音孔并且保证麦克风的拾音孔正对开孔方向两者之间的距离控制在 1~2mm 以内。空调内机的前面板是弧形的麦克风开孔位置选在正面上方、靠近显示面板的区域比较合适。这个位置离人最近、不在风机直吹的风道上而且从外观上看也比较隐蔽。4.2 硅胶套、避震与防尘声学结构规范里最容易被忽略的是避震。空调内机里有风机、有压缩机回传的振动这些机械振动会通过 PCB 和外壳传导到麦克风上形成结构噪声。和空气传播的风噪不同结构噪声频谱复杂光靠算法很难消除。解决办法是在麦克风外面套一个硅胶套硅胶套卡在面板开孔周围把麦克风与 PCB、外壳之间的刚性接触全部隔开。这样一来麦克风是“悬浮”在腔体里的只有空气声能通过开孔进入机械振动被硅胶本身吸收掉了。防尘也很关键。空调内机常年积灰麦克风进灰之后灵敏度会快速下降。开孔内侧最好贴一层透声防尘网选密度高、透气量大的无纺布或者声学网布。有些项目怕防尘网影响灵敏度直接用普通海绵这是不对的——海绵的阻尼特性会消耗高频能量语音识别会变差。此外还要注意前后腔的隔离。麦克风前腔是开孔到振膜之间的空间后腔是振膜背面的密封空间。两个腔体如果漏气低频响应和信噪比都会受影响。所以打孔的时候只打通面板一层别把整个外壳都钻穿麦克风周围用硅胶套密封保证前腔只通过开孔与外界连通。4.3 双麦阵列布局与风噪处理CI-03T 系列有单麦和双麦版本。如果你的项目是在空调这种强噪声环境里我强烈建议直接上双麦版本。双麦阵列带来的是波束成形能力可以定向拾取人声方向同时抑制其他方向的环境噪声。但阵列效果好不好和两个麦克风的间距、位置强相关。参考消费级麦克风阵列的设计经验双麦间距建议在 5~8cm 之间两个麦克风要对称布置在设备中轴线上不能一个高一个低、一个偏左一个偏右。空调内机的面板宽度足够5cm 间距很容易实现。风噪方面双麦算法本身能抑制一部分但结构上也要配合。麦克风开孔绝对不能直接对着出风口方向。我测试过开孔如果正对风叶空调送风时的风噪会让唤醒率从 90% 急跌到 40% 甚至更低。调整开孔位置让它背对风道、朝向前方偏上的方向风机高速运转时的唤醒率也能保持在可接受的水平。开机状态下的实测数据我顺手记了一组测试场景单麦唤醒率双麦唤醒率空调关机静音环境90% 以上95% 以上空调送风低速风70% 左右90% 左右空调送风高速风40% 左右80% 左右这组数据充分说明在空调内机这种噪声源附近双麦加合理的声学结构不是锦上添花而是能不能用的关键。5. 完整实操流程从接线到命令调试5.1 物料清单与接线方案这个项目用到的物料不算多我列一个参考清单CI-03T 语音模块含底板一块麦克风单麦或双麦按版本喇叭8Ω 1W 左右即可红外发射管940nm配合限流电阻电平转换模块TXB0104 或 MOS 管电路5V 稳压电路如果从内机主板取电建议加一个 DC-DC 降压到 5V防尘网、硅胶套、结构件接线原则上先供电、后信号、最后红外。CI-03T 的 VCC 接 5VGND 接电源负极UART 对接电平转换模块再从转换模块接到调试串口麦克风和喇叭按模块标识接入。红外发射管的位置要单独说。空调内机的红外接收窗一般在显示面板附近发射管要尽量靠近接收窗并且发射角度要覆盖它。如果模块离面板太远可以考虑用杜邦线把红外发射管引到面板内侧固定引线尽量短避免信号衰减。5.2 固件配置与命令词调试CI-03T 的开发流程基本是用官方配置工具建立工程、配置唤醒词和命令词、把命令词绑定到对应的红外码库索引、编译固件后通过串口烧录。这里有一个值得注意的点唤醒词和命令词不要选太长太复杂的。语音识别是本地跑词太长会增加计算量也容易误识别。我在项目里把唤醒词设成两个字命令词控制在三到四个字以内比如“打开空调”“制冷模式”“温度二十六”实测识别速度和准确率都比较理想。命令词和红外码库的绑定逻辑说穿了就是一张映射表。你要在工具里把“打开空调”这条命令对应到某个品牌、某个索引的具体红外码上。建议每个房间的空调单独建一个配置文件避免多个场景共用一个配置导致发错码。5.3 整机测试与参数记录装好之后我按下面的测试矩阵逐项验证唤醒距离分别测试 1 米、3 米、5 米距离的唤醒率要求 3 米内达到 90% 以上。噪声环境空调关机、低风、中风、高风四种状态下分别测唤醒率和误唤醒率。红外控制每一条命令词对应的红外码重复测试 10 次统计成功率。测试结果建议做表记录方便定位问题。比如有一轮测试发现“温度”“温度-”的成功率明显低于开关机查下来是码库索引里绑错了码型换成正确索引后恢复正常。6. 常见问题与排查技巧实录6.1 语音唤不醒先查物理链路唤醒率低的原因通常不在算法而在物理结构。排查顺序是先开孔、再供电、最后换位置。用示波器看麦克风输出端的语音波形如果说话时波形幅度明显低于正常值大概率是开孔堵了、麦克风方向反了、或者硅胶套没有对准开孔。如果麦克风波形正常但芯片没有响应就要查电源纹波CI-03T 这类芯片对供电稳定性敏感电源上并一个 100μF 电解电容加 0.1μF 瓷片电容能解决不少“莫名唤醒失败”的问题。6.2 红外一发就“假成功”“假成功”是我在码库测试时最常遇到的现象CI-03T 回复“好的”但空调纹丝不动。排查步骤是先确认码型索引是否对应你的空调品牌再用手机摄像头对着红外发射管看有没有紫色光点手机摄像头能看到红外光最后确认发射管是否对准空调接收窗有没有被金属结构件挡住。很多人在这一步忽略了一个细节红外发射管的角度非常窄稍微偏 10 度信号强度就会大幅下降。固定发射管的时候要留出调整余量实测角度确认后再打胶固定。6.3 串口乱码/通信不稳串口乱码的排查优先级是共地 → 电平 → 波特率 → 相位。共地问题最容易犯也最难一眼看出来表现为时好时坏、用手摸一下线就正常一下。电平问题在接了转换电路后基本能避免。波特率确认两边的配置完全一致。相位问题就是前面提到的三极管反相如果你用了简易三极管电路要重点怀疑这一条。6.4 供电异常导致模块反复重启空调内机里最恶劣的用电环境是继电器动作瞬间。压缩机或风机的继电器吸合时母线电压会瞬间跌落如果 CI-03T 直接从这个电源取电模块就会掉电重启。解决方法是隔离供电用一颗 DC-DC 降压模块从内机母线取电输出端加大电容或者在电源输入端串一个防反接二极管并在模块侧并联大容量电解电容抗住电压跌落。把 CI-03T 这类离线语音方案塞进空调内机做下来最大的体会是语音识别本身反而不是最耗精力的部分真正的功夫都在电路匹配和结构细节上。码型要一条条试电平要一个个对声学结构要反复调这三样做扎实了剩下的自然就顺了。最后再分享一个小经验——别嫌麻烦把每一台空调的测试结果记下来哪怕只是写在手机备忘录里。这个项目你可能只做一台但下次帮朋友改的时候这些记录能帮你省掉大把重复排查的时间。