1. 从一块 ESP32 说起:接上大模型到底算不算 AI 硬件
这两年 ESP32 的价格被打到了十几块钱一片,加上各种大模型 API 的调用门槛越来越低,于是网上冒出一大堆“几十块钱手搓 AI 硬件”的帖子。流程看起来也简单得离谱:ESP32 连上 WiFi,把麦克风采集到的音频丢给云端做语音识别,再把识别结果塞给大模型,最后把返回的文本用 TTS 合成语音播出来。跑通 Demo 的那一刻确实很爽,对着一个小板子说话,它居然能回你,感觉 AI 硬件不过如此。
但我做了几个真正要交付的项目之后,越来越清楚地意识到一件事:把大模型接上 ESP32,只是整个 AI 硬件工程里最不值钱的那一步。真正让人掉头发、让项目从“能跑”变成“能用”的,是后面一连串看起来不起眼、但每一个都能让产品翻车的工程问题。这篇文章我想把这些问题一个个摊开讲清楚,从芯片选型、内存管理、音频链路、网络稳定性,一直到 OTA 升级和量产一致性,尽量把踩过的坑和验证过的方案都写出来。
先明确一下这篇文章适合谁看。如果你只是想在周末做个玩具,让 ESP32 说两句“你好我是 AI”,那其实不用往下看了,随便找个教程半小时就能搞定。但如果你打算把这个东西做成一个能连续跑几天不重启、能放进外壳里交给用户、能远程升级、能批量生产的小硬件,那这篇文章里的八个工程问题,你迟早都会撞上。我会尽量用大白话把每个问题的来龙去脉讲清楚,也会给出我实际用过的参数和方案,方便你直接抄作业。
需要提前说明的是,下面涉及的具体参数和方案,一部分来自我自己的实测记录,一部分是基于常见工程实践做的合理补充。不同批次的模组、不同的固件版本可能会有差异,你在复现的时候一定要以自己手上的实测数据为准,不要照搬数字。
2. 第一个工程问题:算力与内存的边界到底在哪里
2.1 为什么“能跑”和“能稳定跑”是两回事
很多人第一次做 ESP32 AI 硬件,选的是 ESP32-WROOM-32,也就是最经典的那块。它内部 SRAM 大概 520KB,可用堆内存通常只有 200 到 300KB 左右,PSRAM 默认没有。你写个简单的 HTTP 请求、解析一段 JSON,确实没问题。但一旦你要做音频采集,情况就完全变了。
音频采集不是“采一帧发一帧”这么简单。麦克风(比如 INMP441 这类 I2S 数字麦)会以固定采样率持续吐数据,常见的配置是 16kHz、16bit、单声道,也就是每秒 32KB 的原始数据。你要做语音识别,通常需要攒够一段话再上传,比如 2 到 3 秒,那就是 64 到 96KB。这还只是原始 PCM,如果再加上环形缓冲区、重采样、降噪处理,内存占用会迅速逼近可用堆的上限。
我实测过一个典型的翻车场景:用 WROOM-32 做 3 秒录音缓冲,代码里同时开了 WiFi 和 HTTP 客户端,结果在录音到第 2 秒左右就出现malloc failed,设备直接重启。原因就是 WiFi 协议栈本身要占用几十 KB,加上 TLS 握手时的缓冲区,剩下的堆内存根本不够放音频。所以第一个工程问题的核心就是:你必须先算清楚内存账,再决定用哪块芯片。
2.2 内存预算怎么算:一份可复用的估算表
我习惯在动手写代码之前先做一张内存预算表,把每一块占用都列出来。下面这张表是我做语音类 AI 硬件时常用的估算模板,数字是基于 ESP-IDF 环境的经验值,你可以根据自己的实际情况调整。
| 占用项 | 典型大小 | 说明 |
|---|---|---|
| WiFi 协议栈 | 40 到 60KB | 连接状态下持续占用 |
| TLS 握手缓冲 | 16 到 32KB | 用 HTTPS 时必须预留 |
| HTTP 客户端缓冲 | 8 到 16KB | 取决于请求体大小 |
| 音频环形缓冲 | 32 到 96KB | 按录音时长和采样率计算 |
| JSON 解析缓冲 | 4 到 16KB | 大模型返回内容越长越大 |
| 应用逻辑与栈 | 20 到 40KB | 任务栈、局部变量 |
| 预留安全余量 | 30KB 以上 | 防止碎片化导致分配失败 |
按这张表算下来,如果你要做 3 秒 16kHz 单声道录音,光音频缓冲就要 96KB,加上 WiFi 和 TLS,轻松超过 200KB。WROOM-32 的可用堆内存在 250KB 上下浮动,几乎没有余量。这就是为什么我后来做这类项目,基本都会直接上ESP32-S3,并且一定要带 PSRAM 的版本。
2.3 选型建议:什么时候必须上 PSRAM
ESP32-S3 相比经典款,除了双核主频更高,最关键的是支持外挂 PSRAM,常见的有 2MB 和 8MB 两种。PSRAM 虽然速度比内部 SRAM 慢,但用来放音频缓冲、图片缓冲、大块 JSON 完全够用。我的经验是:只要你的项目涉及连续音频采集或者屏幕显示,就一定要选带 PSRAM 的模组。
具体到型号,我常用的组合是 ESP32-S3-WROOM-1-N16R8,也就是 16MB Flash 加 8MB PSRAM。这个配置做语音助手、带屏交互、甚至跑一些轻量级的端侧推理都够用。如果你预算紧张,N8R2(8MB Flash 加 2MB PSRAM)也能应付大部分语音场景,但屏幕分辨率就别想太高了。
这里有个实操细节要提醒:PSRAM 默认不是自动全部可用的,你需要在menuconfig里打开SPIRAM相关选项,并且注意 PSRAM 的分配方式。ESP-IDF 里可以通过heap_caps_malloc(size, MALLOC_CAP_SPIRAM)显式把大块缓冲分配到 PSRAM,而把频繁访问的小对象留在内部 SRAM。这个区分很重要,因为如果把高频访问的数据放到 PSRAM,性能会明显下降。
提示:判断一块内存该放 SRAM 还是 PSRAM,我的标准是看访问频率。音频缓冲这种“写进去、过一会儿整体读出来”的,放 PSRAM 没问题;而中断里频繁读写的标志位、DMA 描述符,一定要放内部 SRAM。
3. 第二个工程问题:音频链路才是真正的深水区
3.1 从麦克风到云端,中间有多少坑
很多人以为音频链路就是“I2S 读数据、打包上传”,实际上从麦克风振膜到云端识别引擎,中间至少经过采样、时钟同步、缓冲、重采样、编码、封装六个环节,每个环节都可能出问题。我见过最常见的问题是采样率不匹配导致的变调。比如麦克风配置成 16kHz,但代码里按 8kHz 去读,结果上传的音频听起来像快进,识别率直接崩掉。
另一个高频问题是I2S 时钟配置错误。ESP32 的 I2S 外设需要正确配置主时钟分频,如果分频系数算错,实际采样率会偏离标称值。比如你想要 16000Hz,但因为时钟源和分频系数取整的问题,实际可能是 15980Hz 或者 16020Hz。短时间听不出来,但长时间录音会累积偏差,导致和云端引擎的预期不符。我的做法是在初始化后用示波器或者逻辑分析仪量一下 WS 时钟频率,确认误差在千分之一以内。
3.2 音频缓冲区的设计:双缓冲还是环形缓冲
缓冲区的设计直接决定了你的设备会不会丢帧。我试过三种方案,最后稳定用的是双缓冲加 DMA的组合。具体来说,I2S 外设通过 DMA 把数据搬到一块固定大小的缓冲区,当这块填满时触发中断,程序把数据复制到另一块处理缓冲区,同时 DMA 继续往第一块写。这样读写分离,不会因为处理逻辑卡顿而丢数据。
缓冲区大小怎么定?我的经验公式是:单块缓冲时长不低于 20ms,不高于 100ms。太短了中断太频繁,CPU 忙于上下文切换;太长了延迟明显,用户说话到设备响应之间会有可感知的滞后。以 16kHz、16bit 为例,20ms 对应 640 字节,100ms 对应 3200 字节。我通常取 40ms 左右,也就是 1280 字节一块,双缓冲总共 2560 字节,内存压力很小。
如果你要做本地唤醒词检测,缓冲策略还要再调整。唤醒词引擎通常需要连续的音频流,这时候环形缓冲更合适,因为它可以无缝衔接。但环形缓冲的难点在于读写指针的管理,一旦处理速度跟不上写入速度,就会覆盖未处理的数据。我的做法是给环形缓冲加一个水位线告警,当剩余空间低于 20% 时点亮一个调试 LED,方便定位问题。
3.3 编码格式的选择:PCM、Opus 还是别的
原始 PCM 数据量太大,3 秒 16kHz 单声道就是 96KB,走移动网络上传又慢又费流量。所以实际项目里基本都要压缩。常见的选择有 Opus、ADPCM、Speex 这几种。Opus 压缩率高、音质好,是云端语音识别的首选,但它在 ESP32 上编码需要一定的算力,经典款跑起来比较吃力,S3 双核就从容很多。
如果算力实在紧张,可以用 ADPCM,压缩比大概 4:1,算法简单,几乎不占 CPU。代价是音质损失明显,识别率会下降,尤其是嘈杂环境下。我做过对比测试,同样一段带背景噪声的语音,Opus 编码后识别准确率比 ADPCM 高出大概 15 个百分点。所以如果项目对识别率有要求,还是老老实实上 Opus,把算力预算留够。
这里有个容易忽略的点:编码后的数据要加上合适的封装头。云端引擎通常要求特定的容器格式,比如 WAV 头或者 Ogg 封装。如果你直接把裸 Opus 帧丢过去,引擎可能解析失败。我一般会在上传前拼一个简单的 WAV 头,把采样率、位深、声道数写清楚,这样兼容性最好。
4. 第三个工程问题:网络稳定性决定用户体验的下限
4.1 WiFi 断连不是小概率事件
实验室里 WiFi 信号满格,设备跑一整天都没事。但一旦放到真实环境,路由器在客厅、设备在卧室、中间隔两堵墙,断连就成了家常便饭。我统计过自己经手的一个项目,在真实家庭环境里,ESP32 平均每 4 到 6 小时会发生一次 WiFi 断连,每次断连到重连成功大概需要 3 到 10 秒。如果这期间用户正好在说话,体验就是“设备没反应”。
所以网络这块的第一件事,是把断连重连做成一个健壮的状态机,而不是依赖默认行为。ESP-IDF 提供了 WiFi 事件回调,你可以在WIFI_EVENT_STA_DISCONNECTED事件里主动发起重连,并且加上指数退避,避免频繁重连把路由器拖垮。我的退避策略是:第一次断连后等 1 秒重连,失败等 2 秒,再失败等 4 秒,最多退到 30 秒,重连成功后重置计数。
4.2 请求超时与重试:别让用户干等
网络请求这块,我踩过最大的坑是没有设置合理的超时。默认的 HTTP 客户端超时可能长达几十秒,用户说完话之后设备一直转圈,最后告诉你失败了,这种体验非常糟糕。我的做法是给每个阶段单独设超时:DNS 解析 3 秒,TCP 连接 5 秒,TLS 握手 5 秒,等待响应 10 秒。任何一步超时就立即放弃并给用户一个明确的反馈,比如播报“网络不太好,请再说一次”。
重试也要讲究策略。对于语音识别这种请求,重试时最好把原始音频保留着,因为重新采集用户还得再说一遍。我通常会在内存里保留最近一次录音的压缩数据,如果第一次上传失败,自动重试一次,两次都失败才提示用户。但要注意,重试会占用额外的内存和时间,所以只对关键请求做,不要所有请求都无脑重试。
4.3 弱网下的降级方案
真实环境里还有一种情况:网络能连上,但带宽很低或者延迟很高。这时候如果还坚持上传高码率音频,等待时间会非常长。我的降级方案是动态调整音频质量。具体做法是先发一个很小的探测请求测一下往返延迟,如果延迟超过 500ms,就把音频编码码率降下来,比如从 24kbps 降到 12kbps。虽然识别率会受一点影响,但至少能保证响应速度。
另外,对于非实时的请求,比如让大模型生成一段文字,可以考虑加一个本地缓存。如果网络暂时不可用,先把请求排队,等网络恢复了再发。这个方案适合对实时性要求不高的场景,比如定时提醒、内容生成之类的。
5. 第四个工程问题:大模型调用的延迟与成本控制
5.1 端到端延迟拆解:时间都花在哪了
用户感知到的延迟,是从说完话到设备开始回应的时间。这个时间可以拆成几段:录音结束检测、音频编码、网络上传、云端识别、大模型推理、TTS 合成、音频下载、本地播放。我实测过一个典型链路,各段耗时大致如下表。
| 阶段 | 典型耗时 | 可优化空间 |
|---|---|---|
| 录音结束检测 | 300 到 800ms | 用 VAD 优化 |
| 音频编码 | 50 到 200ms | 换编码器或降码率 |
| 网络上传 | 200 到 1000ms | 取决于网络 |
| 云端识别 | 300 到 800ms | 选就近节点 |
| 大模型推理 | 500 到 3000ms | 控制输出长度 |
| TTS 合成 | 200 到 600ms | 流式合成 |
| 音频下载播放 | 100 到 500ms | 边下边播 |
加起来轻松超过 2 秒,如果大模型输出很长,5 秒以上也很常见。用户对语音交互的耐心阈值大概是 1.5 到 2 秒,超过这个就会觉得“卡”。所以延迟优化的核心,是把能并行的并行,把能流式的流式。
5.2 流式处理:让用户感觉更快
最有效的优化手段是流式。具体来说,大模型返回是逐字生成的,TTS 也可以逐句合成,播放也可以边收边播。这样用户听到第一句话的时间,可能比等全部生成完再播放要快 1 到 2 秒。实现上,你需要把 HTTP 响应改成流式读取,每收到一个完整的句子就送去 TTS,合成一小段就推给 I2S 播放。
这个方案听起来简单,实际做起来有几个坑。第一是句子边界判断,不能按固定长度切,否则会把词切断,听起来很怪。我的做法是按标点符号切,遇到句号、问号、感叹号就认为一句结束。第二是播放缓冲的管理,如果 TTS 合成速度比播放速度快,缓冲会越积越多,延迟反而变大。所以需要一个背压机制,当缓冲超过一定长度时暂停请求,等播放消费掉再继续。
5.3 成本控制:别让账单失控
大模型 API 是按 token 计费的,语音识别按秒计费,TTS 按字符计费。如果设备一直在线、用户频繁交互,成本会累积得很快。我做过一个估算,一个每天交互 50 次的设备,如果每次对话平均消耗 500 个 token,一个月下来光模型调用就是一笔不小的开销。
控制成本的手段有几个。一是限制上下文长度,不要把整段历史对话都塞进去,只保留最近几轮。二是缓存常见问题的回答,比如“现在几点”“今天天气怎么样”这类高频问题,本地直接回答,不走云端。三是设置单次交互的 token 上限,防止模型输出过长。这些策略组合起来,能把成本压到原来的三分之一左右。
6. 第五个工程问题:功耗与散热,小外壳里的大麻烦
6.1 为什么你的设备烫得能煎鸡蛋
ESP32 在持续工作时的功耗并不低。WiFi 收发时峰值电流能到 200mA 以上,加上音频编解码和 CPU 满载,整机功耗轻松超过 1W。如果外壳是封闭的塑料壳,热量散不出去,芯片温度会一路升到 70 度以上。我实测过一个小音箱形态的设备,连续对话 10 分钟后,外壳表面温度到了 55 度,摸上去已经有点烫手了。
温度过高带来的问题不只是手感,还会影响稳定性。ESP32 在高温下 WiFi 性能会下降,严重时还会触发保护重启。所以做紧凑型 AI 硬件,散热设计必须从结构阶段就开始考虑,不能等做完了再说。
6.2 低功耗设计的几个实用手段
如果你的设备是电池供电,功耗就更关键了。ESP32 支持几种低功耗模式,最常用的是 light sleep 和 deep sleep。light sleep 下 WiFi 可以保持连接,电流能降到几毫安;deep sleep 电流可以降到几十微安,但唤醒后要重新连接 WiFi,延迟明显。
我的做法是分场景切换功耗模式。设备空闲时进入 light sleep,靠 GPIO 中断或者定时器唤醒;如果长时间没人用,比如 5 分钟没有交互,就进入 deep sleep,靠按键唤醒。这样一块 2000mAh 的电池,如果每天交互 20 次,能撑大概 3 到 5 天。
散热方面,我的经验是在芯片背面贴一块导热硅胶垫,把热量导到外壳或者一块小金属片上。如果外壳是金属的,效果最好,但要注意做好绝缘。塑料外壳的话,可以在内部留出空气对流通道,别把芯片闷死在一个小腔体里。
注意:做低功耗设计时,一定要把外设的漏电流算进去。麦克风、功放、屏幕这些外设即使不工作,也可能有静态电流。我见过一个项目,主控进了 deep sleep,但功放芯片没关,结果待机电流一直下不来。
7. 第六个工程问题:OTA 升级,量产设备的生命线
7.1 为什么 OTA 是必须的
产品一旦卖出去,你就没法再插 USB 线了。如果发现 bug 或者想加功能,只能靠 OTA。所以从第一版固件开始,就要把 OTA 通道设计好。ESP-IDF 自带 OTA 功能,支持双分区备份,升级失败可以回滚,这个基础能力一定要用上。
OTA 的流程大致是:设备定期检查服务器上的版本号,发现新版本就下载固件到备用分区,校验通过后切换启动分区,重启生效。听起来简单,但实际做的时候有几个关键点。第一是固件校验,下载完必须校验 SHA256 或者签名,防止下载到损坏或者被篡改的固件。第二是断电保护,下载过程中如果断电,重启后要能恢复到旧版本,不能变砖。
7.2 差分升级与断点续传
完整固件动辄 1 到 2MB,走移动网络下载很慢,也费流量。所以量产设备通常会做差分升级,只下载新旧版本的差异部分,体积能缩小到原来的十分之一。差分升级需要在服务器端生成差分包,设备端做合并,实现起来复杂一些,但对用户体验提升明显。
断点续传也很重要。如果下载到一半网络断了,下次能接着下,而不是从头再来。实现上可以用 HTTP 的 Range 请求,记录已下载的字节数,下次从断点继续。这个功能在弱网环境下特别有用,我做过对比,加了断点续传之后,OTA 成功率从 70% 提升到了 95% 以上。
7.3 灰度发布与回滚策略
新固件不要一次性推给所有设备,万一有严重 bug,全部设备一起挂。我的做法是灰度发布:先推给 5% 的设备,观察 24 小时,如果没有异常再扩大到 20%,然后 50%,最后全量。观察指标包括重启次数、崩溃日志、关键功能成功率。
回滚策略也要提前设计。如果新版本上线后发现问题,要能快速把设备切回旧版本。ESP-IDF 的双分区机制天然支持这个,只要旧分区没被覆盖,就可以通过服务器下发指令切回去。但要注意,回滚后旧版本可能不兼容新的服务器接口,所以接口设计要保持向后兼容。
8. 第七个工程问题:量产一致性,从一块板到一万块板
8.1 为什么实验室能跑,量产就翻车
实验室里你用的是同一块板子、同一个电源、同一个路由器,所有变量都是可控的。但量产之后,每一块板子的元器件都有公差,电源质量参差不齐,用户环境千差万别。我见过太多项目,样机阶段一切正常,量产之后返修率高达 10% 以上。
常见的一致性问题包括:麦克风灵敏度差异导致识别率波动、晶振频偏导致 WiFi 连接不稳定、Flash 批次不同导致读写速度差异、电源纹波导致音频底噪。这些问题在单块板子上很难发现,必须通过批量测试才能暴露。
8.2 出厂测试怎么做才靠谱
我的做法是设计一套自动化出厂测试流程,每块板子下线都要过一遍。测试项包括:WiFi 连接成功率、音频回环测试、按键和 LED 功能、Flash 读写校验、固件版本确认。测试结果自动上传到服务器,和板子的序列号绑定,方便后续追溯。
音频测试特别重要,因为它是 AI 硬件的核心功能。我的测试方法是让设备播放一段标准音频,同时用麦克风录回来,对比频谱和音量,判断麦克风和功放是否正常。这个测试能筛掉大部分音频相关的硬件问题。
8.3 元器件选型与供应链的坑
量产阶段最怕的是元器件缺货或者批次不一致。我踩过的坑包括:某款麦克风突然停产,被迫换型号,结果驱动要重写;某批 Flash 的擦写寿命不达标,用了半年开始出现坏块。所以选型的时候,关键元器件一定要有至少两个可替代的型号,并且提前做好驱动适配。
供应链方面,我的建议是关键物料保持安全库存,不要等用完了再采购。同时和供应商确认好批次一致性,必要时要求提供批次检测报告。这些工作看起来琐碎,但能避免量产阶段的大麻烦。
9. 第八个工程问题:安全与隐私,不能等出事再补
9.1 设备端的安全底线
AI 硬件通常要联网、要采集音频,安全和隐私问题绕不开。最基本的要求是所有网络通信必须加密,用 HTTPS 或者 MQTT over TLS,绝对不能明文传输。设备端要校验服务器证书,防止中间人攻击。密钥和证书不能硬编码在固件里,最好放在加密的存储区,或者用安全芯片管理。
固件本身也要保护。开启 Flash 加密和安全启动,防止别人读出你的固件或者刷入恶意固件。ESP32 系列支持这些功能,但开启之后就不能随便回退了,所以要在量产前就规划好。
9.2 用户数据的处理原则
音频数据是最敏感的。我的原则是能本地处理的绝不上传,必须上传的用完即删。比如唤醒词检测完全可以在本地做,只有确认唤醒之后的音频才上传。上传的音频在云端识别完之后,立即删除,不做长期存储。如果业务需要保留,也要做匿名化处理,并且明确告知用户。
用户隐私政策要写清楚,采集什么数据、用来做什么、保留多久、怎么删除。这些不是走形式,而是合规的基本要求。我见过一些项目因为隐私政策不清晰,被应用商店下架,损失很大。
9.3 常见的安全漏洞与防范
ESP32 项目里常见的安全问题包括:默认密码没改、调试接口没关、OTA 服务器没有鉴权、日志里打印了敏感信息。这些看起来是小问题,但每一个都可能被利用。我的做法是在固件里加一个安全检查清单,每次发布前过一遍,确认所有项都通过。
另外,OTA 服务器的鉴权一定要做好。设备请求升级时要带上有效的令牌,服务器验证通过才下发固件。否则攻击者可以伪造升级请求,把恶意固件推给设备。这个令牌要有有效期,并且能远程吊销。
10. 一些实操心得与常见问题速查
10.1 调试工具与手段
做 ESP32 AI 硬件,光靠串口打印是不够的。我常用的工具组合是:逻辑分析仪看 I2S 和 SPI 时序,示波器看电源纹波,Wireshark 抓网络包,还有 ESP-IDF 自带的 heap tracing 看内存分配。这些工具能帮你快速定位问题,比盲猜高效得多。
内存问题特别推荐用 heap tracing,它能记录每次内存分配的调用栈,找出是谁把内存吃光了。我靠这个工具定位过好几个内存泄漏,都是因为某个任务忘了释放缓冲。
10.2 常见问题速查表
| 现象 | 可能原因 | 排查方向 |
|---|---|---|
| 设备频繁重启 | 内存不足或看门狗超时 | 查 heap 使用和任务阻塞 |
| 录音有杂音 | 电源纹波或地线干扰 | 查电源和 PCB 布局 |
| WiFi 频繁断连 | 信号弱或电源不稳 | 查 RSSI 和供电电流 |
| 识别率低 | 采样率错误或编码问题 | 查 I2S 配置和音频格式 |
| OTA 失败 | 网络不稳或校验不过 | 查下载日志和固件签名 |
| 设备发热严重 | 功耗高或散热差 | 查工作电流和外壳结构 |
10.3 我踩过的几个典型坑
第一个坑是电源设计偷懒。早期项目直接用 USB 供电,觉得 5V 很稳。结果音频功放一工作,电流突变导致电压跌落,ESP32 直接重启。后来加了足够的滤波电容和独立的 LDO,问题才解决。
第二个坑是任务优先级设置不当。音频采集任务优先级设低了,被 WiFi 任务抢占,导致丢帧。后来把音频任务优先级提到最高,并且用 DMA 减少 CPU 占用,才稳定下来。
第三个坑是忽略了中国移动网络环境。有些地区的移动网络对长连接不友好,会定期断开。后来加了心跳保活和快速重连,才适应了这种环境。
10.4 给新手的几条建议
如果你刚开始做 ESP32 AI 硬件,我的建议是:先用开发板把链路跑通,别急着画 PCB;内存预算一定要提前算,别等出问题了再改;网络和音频这两块要留足调试时间,它们是最容易出问题的地方;OTA 从第一版就要做,别想着以后再加。
最后分享一个小技巧:在固件里加一个隐藏的调试模式,通过特定的按键组合或者串口命令进入,可以查看内存、网络状态、音频电平这些信息。量产之后如果用户反馈问题,可以引导他们进入调试模式,把日志导出来,比远程猜问题高效得多。
这个领域变化很快,新的模组、新的模型、新的方案层出不穷。但底层那些工程问题,内存、音频、网络、功耗、量产、安全,本质上不会变。把这些问题一个个啃下来,你做的才不只是一个 Demo,而是一个真正能用的产品。