把小智调成你自己的:音色、表情、多语言与自定义唤醒词
本文讲解原理与流程、引用关键片段并注明出处,版权归原作者,遵循其开源协议;一切以上游仓库最新版本为准。
上一节用 MCP 让它控硬件之后,你手里这台小智已经会听、会答、还能顺手开个灯了。功能上它是完整的——但它还是"别人的"小智:一样的音色、一样叫"小智"、一样那套表情。这一节不加新功能,只做一件事:把它调成你自己的那一台。 换个嗓子、换张脸、换句你顺口的名字叫醒它——技术含量不高,却是最有"玩起来"感觉的一段。
先把底色说清楚:这些个性化项,绝大多数不在设备固件里写死,而是配置项、或在服务端一侧决定。 所以"怎么改"的答案往往不是改 C 代码重新烧录,而是改个配置、或去自建后端那侧换个模型、调个参数。哪些改设备、哪些改服务端,这一节一项项帮你分清。
换音色:小智的嗓子是在哪定的
你听到的回答是一段被合成出来的语音——这一步叫 TTS(Text-to-Speech,文字转语音),L4 的 asr-tts 那节把原理讲透过。合成用哪个"嗓子",取决于 TTS 服务提供了哪些音色(voice)。
关键认知是:音色不是设备决定的,是 TTS 那侧决定的。 设备只负责把合成好的音频流放出来,至于是男声、女声、温柔还是活泼,全看服务端调用 TTS 时选了哪个 voice 参数。所以想换音色,要动的不是烧进板子的固件,而是服务端配置里那个音色字段——这正是小智把"大脑"和"耳嘴"拆开的好处:换嗓子这类事本就该在云侧一改就生效,不该让你重新编译烧板。
具体怎么选:不同 TTS 服务商给的音色清单不一样,voice 取值各家一套命名——有的按编号,有的给中文名("温柔女声""沉稳男声")。你能选哪些、字段叫什么、取值怎么填,一律以你用的那家 TTS 服务文档和小智服务端配置说明为准——这块各家差异大,我不替任何一家给具体值,免得你照着一个对不上的编号填半天不生效。走自建后端这条路时,服务端通常把音色留成一个可配字段,你在那儿改、重启服务,下一句回答就换嗓子,设备端一行代码不用动。
换音色最容易踩的坑,是语言和音色对不上。一个只训练了中文的音色,让它念英文常出怪腔怪调甚至念不出。选音色时先看它标注支持哪些语言,别拿中文音色硬读英文——这也牵出下面多语言要注意的事。
表情:emoji 与屏幕上那张脸
如果你的板子带屏,小智会在屏上显示一张"脸"——高兴、思考、说话时嘴动,这些表情让它从冷冰冰的音箱变得有点人味。表情这块分两层,改法不一样,得分开说。
一层是回答里的 emoji。大模型生成回答文本时可以带上 emoji,小智把它识别出来、映射成屏上对应的表情脸。也就是说,它"做什么表情"很大程度是被回答内容驱动的——模型说句开心话、带个笑脸 emoji,屏上就笑。想让它整体更活泼或更含蓄,往往是从提示词(prompt)那侧引导模型的说话风格,而不是改设备。这层同样落在服务端。
另一层是屏上那张脸的样子本身——长什么样、用哪套图。这是固件里的显示资源和映射逻辑:哪个 emoji 对应哪张脸、脸用什么图案,在设备侧定义。想换成你自己画的一套表情,就得动这层的资源与映射——这属于要改固件、重新编译烧录的改动,比换音色重。这层的资源格式、映射表在代码哪个位置、怎么替换,请以上游仓库当前实现为准,各版本组织方式可能调整;我这里只帮你建立"表情分内容驱动和资源两层"这个认知,不照搬某一版的文件路径,免得你按过时位置去找扑空。
分清这两层很有用:只是嫌它表情不够生动,先从调提示词、让模型多带情绪入手,这是零改代码的软调整;只有想彻底换一套自己设计的脸时,才需要下到固件那层动资源。先软后硬,能不烧板就不烧板。
多语言:让它听懂、也答得出别的语言
小智能不能处理中文以外的语言,卡在链路上三个环节,缺一不可:
- ASR(语音识别) 得能识别你说的那门语言——用英文提问,识别侧得配成支持英文,否则它把你的英文当噪音或识别成一堆错字。
- LLM(大模型) 得能理解并用那门语言回答——这个门槛通常最低,主流大模型多数天然多语言。
- TTS(语音合成) 得有对应语言的音色——回到上面那条坑,音色不支持这门语言,前两步都对也念不出来。
看出来了吗?多语言不是一个开关,是这三段各自都得配好,缺一段整条链就断。 所以在服务端改多语言,本质是把 ASR 的识别语言、LLM 的能力、TTS 的音色三处对齐到同一门语言——怎么配、字段叫什么,一律以各家服务文档和小智服务端配置说明为准。它们全在云侧,同样不碰固件。
这里有个实在的排查心法:多语言不生效时,别笼统说"它不支持",按 ASR → LLM → TTS 逐段定位。 它压根没听懂,问题在 ASR;听懂了、内容也对但念出来乱码或哑火,问题在 TTS 音色。一分段,问题立刻具体了——这就是对话链路那节强调的分段定位法,在这儿一样好使。
自定义唤醒词:换个名字叫醒它
最后这个最好玩,也最容易被误解:你能不能不叫它"小智",改成叫"小赋""贾维斯"或随便一个顺口的名字?
先说原理。项目一开头讲过,唤醒是离线在芯片上完成的——你不喊,它不联网、不上传,就地判断"有没有人在叫我"。能就地识别一个特定的词,靠的是设备上跑着一个唤醒词模型(乐鑫这套通常是 ESP-SR 里的唤醒引擎)。这模型能识别哪些词,是模型本身决定的,不是你在配置里随便填个字符串就能变的。
这就是最大的误解点:唤醒词不是想改成什么就改成什么。 它不像换音色那样填个字段就行——芯片上那个离线模型只"认识"它被训练过的词。所以现实里换唤醒词分两种情况:
- 在官方已提供的唤醒词里选:如果上游/ESP-SR 已放出了多个现成唤醒词模型,你能做的是换用其中一个——这属于选,改个配置指定用哪个模型即可,相对轻。
- 要一个全新的、清单里没有的词:这就得有对应的自定义唤醒词模型。训练/获取一个新唤醒词模型是另一套工程(涉及乐鑫的唤醒词模型工具链),不是改配置能解决。
所以务实的建议是:先去上游仓库和乐鑫 ESP-SR 文档看清当前提供了哪些现成唤醒词,能挑一个你接受的就最省事;只有非要一个独一无二、清单里没有的名字,才去啃自定义唤醒词模型那套流程。具体支持哪些词、怎么切换、自定义模型怎么做,一律以上游和 ESP-SR 官方文档当前版本为准——唤醒词模型和芯片、SDK 版本强绑定,各版本能力有差异,我这里只把"它依赖离线模型、不能随便填"这个边界说清楚,不给你一个可能对不上手里版本的清单。
别一上来就奔着"训练自己的唤醒词"去——这是这节里最重的一块,投入产出很可能不划算。先在现成清单里挑,多数人的"想换个名字"其实在现成词里就能满足个七七八八。真到非自定义不可,那也是一个独立、值得单独花时间的小工程,不该塞在个性化这节里草草带过。
小结 · 下一步
把"改在哪一侧"收成一张清单,你就不会再对着代码乱找了:
- 音色:改服务端 TTS 的音色字段,不碰固件;注意音色与语言要匹配。
- 表情:内容驱动那层从提示词软调;想换整套脸的样子才下到固件改资源。
- 多语言:在服务端把 ASR / LLM / TTS 三段对齐到同一语言,缺一段就断。
- 唤醒词:依赖设备上的离线唤醒词模型,先在现成清单里选,全新词要自定义模型,以上游与 ESP-SR 文档为准。
一句话记住:能在服务端改的就别烧板;能选现成的就别自己训。 个性化的乐趣是用最小的改动换一个完全不同的"它",而不是为换个嗓子把整块板子重编译一遍。
其中音色、模型这些"大脑侧"的东西都归自建后端那节管,想动它们,那节是你的主战场。下一步:把这台调成自己的小智,往产品化那节走,看看怎么给它配个像样的外壳、稳定供电,从"桌上一块能跑的板子"变成能放出去用的东西。想补语音与合成的底子,随时翻 L4 的 asr-tts。