小智AI自定义唤醒词:把「你好小智」改成任意中文词(MultiNet7本地实测)

小智AI(开源 ESP32-S3 AI 语音助手)默认唤醒词是「你好小智」。想换成自己的词,很多人第一反应是去乐鑫云训练模型、或者找官方支持——其实仓库里就有一条 MultiNet 路线,本地改一个 JSON 就能落地。这篇文章用一块 ESP32-S3-DevKitC-1 把「小麦小麦」完整跑通:新增配置文件、构建、烧录、验证、代价实测、4 条避坑,全程不碰上游源码。适合想把小智AI唤醒词改成自己品牌词/家庭昵称的玩家,和做 AI 语音相关毕设的嵌入式开发者。

一、为什么默认唤醒词不好换:先搞清楚 WakeNet 和 MultiNet
小智AI 出厂默认用「你好小智」唤醒,背后是乐鑫的 WakeNet 预训练模型(wn9_nihaoxiaozhi_tts)。WakeNet 是"固定词表"路线——官方训了哪些词,你只能用哪些词,想换词就得走乐鑫的训练链路,对普通玩家来说门槛很高。
而仓库里其实还挂了一条 MultiNet 路线:这是一个本地可用的多命令识别模型(中文 MultiNet7 量化版 mn7_cn),支持自定义唤醒词/命令词,不用上云训练,模型已经打进构建产物里,本地配置就能启用。
两条路线的本质区别:
| 维度 | WakeNet(默认) | MultiNet(自定义路线) |
|---|---|---|
| 词表 | 固定(官方预训练) | 自定义(可配任意中文词) |
| 训练 | 需要乐鑫云/官方链路 | 不需要,本地配置即可 |
| 换词方式 | 改词表重训 | 改 JSON 配置 |
| 生效模型 | wn9_nihaoxiaozhi_tts | mn7_cn(MultiNet7 量化版) |
二、准备工作:环境清单(和上次 MCP 实战完全一致)
本文实测硬件与软件版本如下,和 05/06 系列文章同一套环境:
| 项 | 型号/版本 |
|---|---|
| 开发板 | ESP32-S3-DevKitC-1 N16R8(16MB Flash + 8MB Octal PSRAM) |
| 屏幕 | SSD1306 128x32 OLED |
| 麦克风 | INMP441 单麦(NoAudioCodecSimplex) |
| SDK | ESP-IDF v6.1 |
| 固件工程 | xiaozhi-esp32 v2.5.1,commit 0d576d3 |
| 板型变体 | bread-compact-wifi |
唯一要新增的东西:一个配置文件。全程 git status 只有 1 个 untracked 文件,上游文件零修改。
三、实操:新增一个 JSON,把唤醒词改成「小麦小麦」
第 1 步:新建配置文件
在板型目录下新建 main/boards/bread-compact-wifi/config.custom-wake.json,内容只有 5 行配置追加:
{
"sdkconfig_append": [
"CONFIG_USE_CUSTOM_WAKE_WORD=y",
"CONFIG_SR_MN_CN_MULTINET7_QUANT=y",
"CONFIG_CUSTOM_WAKE_WORD=\"xiao mai xiao mai\"",
"CONFIG_CUSTOM_WAKE_WORD_DISPLAY=\"小麦小麦\"",
"CONFIG_CUSTOM_WAKE_WORD_THRESHOLD=20"
]
}
四行配置各管什么:
| 配置项 | 作用 | 取值说明 |
|---|---|---|
CONFIG_USE_CUSTOM_WAKE_WORD | 启用自定义唤醒词 | y |
CONFIG_SR_MN_CN_MULTINET7_QUANT | 启用中文 MultiNet7 量化模型 | y |
CONFIG_CUSTOM_WAKE_WORD | 唤醒词拼音 | "xiao mai xiao mai"(空格分隔) |
CONFIG_CUSTOM_WAKE_WORD_DISPLAY | 屏幕显示的中文串 | "小麦小麦" |
CONFIG_CUSTOM_WAKE_WORD_THRESHOLD | 唤醒门限 | 20(设备端是 0.2,见避坑 4) |
第 2 步:构建
python scripts/build.py bread-compact-wifi -c config.custom-wake.json
构建产物里能看到 MultiNet 模型被打进 assets 分区(MODEL_LOADER: Successfully load srmodels),不需要单独刷 srmodels.bin。
第 3 步:烧录
python -m esptool --chip esp32s3 -p COM15 -b 460800 --before default-reset --after hard-reset write-flash @build/flash_args
烧录后串口抓日志(cap_boot.py COM15 45),看三段关键证据。
四、验证:怎么确认设备真的在用「小麦小麦」唤醒
日志是唯一的真相来源,下面每条都对应真实日志行号:
| # | 日志关键行 | 证明了什么 |
|---|---|---|
| 1 | AfeAudioEngine: Model 0: fst / Model 1: mn7_cn | 生效模型确实是 MultiNet7 量化版 |
| 2 | CustomWakeWord: Command: xiao mai xiao mai, Text: 小麦小麦, Action: wake | 中文显示串在设备端解析正确,动作注册为 wake(等价原唤醒词) |
| 3 | set det threshold to 0.200000 / 1 active speech commands | 门限生效(20÷100=0.2),命令表只有 1 条 |
| 4 | Custom wake word detected: prob=0.270145 → Wake word detected: 小麦小麦 | 喊「小麦小麦」命中并进入唤醒流程 |
| 5 | >> 小麦小麦 → << 哎,我在呢! / << 有什么事吗? | 对话闭环成立,服务端 ASR 听写一致,唤醒音频包正常上行 |
一个值得注意的细节:实测命中概率 prob=0.27,距门限 0.2 只有 0.07 的余量——说明自定义词的灵敏度余量不大,口音、距离、环境噪声都会影响,这正是下一阶段要量化测试的点。
另外日志里 wakenet model not found 是警告不是错误——它表示 WakeNet 已经下线,配套现象是「你好小智」不再响应(本次实测为附带确认项,专项复测排期跟进)。
五、代价实测:换唤醒词到底多占资源
这部分是本文最值钱的地方。官方文档只说"自定义词很占资源",到底占多少?实测如下(基线 = 「你好小智」WakeNet9):
| 指标 | 你好小智(基线) | 小麦小麦(MultiNet7) | 差异 |
|---|---|---|---|
generated_assets.bin | 561,011 B | 2,951,622 B | +2.39 MB(5.3×) |
| assets 分区占用 | 8MB 分区,占用极低 | map 2944 KB / 8192 KB | 仍有余量,但 4MB Flash 板不可行 |
xiaozhi.bin | 2,577,152 B | 2,577,232 B | +80 B,可忽略 |
minimal sram(内部 RAM 最低水位) | 50,268 B | 33,468 B | −16,800 B(−33%) |
free sram 稳态 | 155,647 B | 154,567 B | −1,080 B |
两个关键结论:
- Flash 是主要代价:模型包体积涨了 5.3 倍(+2.39 MB)。16MB Flash 板没问题,4MB Flash 的板子基本不可行,选板型前先看 Flash 容量。
- 内部 RAM 裕度是硬约束:
minimal sram从 50KB 掉到 33KB(−33%)。后续再叠加功能(更多 MCP 工具、更长命令表、屏幕/视觉),这条必须重新评估——这是比官方含糊说明具体得多的实测数据。
六、4 条避坑(都是这次踩过的真实坑)
- 首开机 assert,别慌:烧录后第一次开机可能看到
assert failed: esp_netif_create_default_wifi_sta ... duplicate key然后自动重启。这是"先起配网 AP、立刻切 station"的竞态路径问题,与唤醒词改动无关——同一固件第二遍开机直接连上 WiFi 跑完全流程。判断方法:看第二次开机是否正常。 - Git Bash 里跑环境脚本会失败:继承的
MSYSTEM变量会让 ESP-IDF 检查报MSys/Mingw is not supported。解法:进 PowerShell 后先Remove-Item Env:MSYSTEM,Env:MINGW_PREFIX,Env:MSYSCON,再前置idf6.1_py3.13_env\Scripts到 PATH。 - 构建失败会被管道吞掉:
... | tail -60会把退出码变成 0,看着成功其实没成。改成日志重定向 + 末尾Write-Host "BUILD_EXIT=$LASTEXITCODE"。 - 门限单位是"除以 100":
CONFIG_CUSTOM_WAKE_WORD_THRESHOLD=20会被构建脚本除以 100 → 设备端实际是 0.2(日志set det threshold to 0.200000)。数值越小越灵敏,调灵敏度前先想清楚这个换算。
七、写在最后
这条 MultiNet 路线的价值在于:自定义唤醒词不需要上乐鑫云训练,本地一个 JSON 就能落地。代价也清楚:Flash 涨 5.3×、内部 RAM 裕度 −33%,选板型时先看 Flash 容量,后续加功能先看内存水位。
下一步我准备做三件事:冷启动连续 10 次唤醒成功率统计、说话/放音乐时打断测试、以及门限 8/20 两档的"灵敏 vs 误触"对比量化——做完会继续更新。
你改唤醒词是想用品牌词、家人昵称,还是纯好奇?你踩过哪个坑?评论区聊聊。
系列回顾:05 环境搭建与烧录实操(ESP-IDF v6.1)|06 小智AI二次开发(MCP控制GPIO)|07 蓝牙音箱底噪破音排查|08 从CC2530到Zephyr(两个时代的蓝牙开发工作流)
更多推荐




所有评论(0)