小智自建后端 xiaozhi-server:用 Docker 把服务端跑在自己机器上
本文讲解原理与流程、引用关键片段并注明出处,版权归原作者,遵循其开源协议;一切以上游仓库最新版本为准。
上一节对话链路(dialog)里,你第一次让盒子答上了话。但那句回答是从哪儿冒出来的?大概率是官方或某个公共服务器帮你算的——你的语音上传到别人那里,识别、思考、合成全在那边完成,你的设备只是个"收发口"。这一节我们把这颗大脑搬回来:在你自己的机器上用 Docker 起一整套服务端,让小智只跟你说话。
这是设备端固件(78/xiaozhi-esp32)之外的另一半拼图。前面几节拆的都是设备这端——刷固件、录音、联网、对话;服务端这一格,靠的是另一个开源项目:xinnan-tech/xiaozhi-esp32-server。两个仓库,一个跑在你手里的板子上,一个跑在你的服务器上,合起来才是完整的小智。
这是开源学习解读,不是搬运。 本篇涉及两个上游仓库:设备端 78/xiaozhi-esp32 与服务端 xinnan-tech/xiaozhi-esp32-server,均遵循 MIT 协议开放,版权归各自作者与社区贡献者。这里只讲服务端是什么、为什么自建、部署的概念流程;具体镜像名、命令、配置项一律以仓库 README 最新版为准,本文不搬运整套配置、也不编造命令。两个仓库地址见本页底部开源引用块。动手前先读免责声明。
为什么要自建:不依赖公共服务器的三个理由
自建后端不是入门必修,是当你开始在意下面这几件事时才该走的一步。这几笔账 L4 自建后端那节算得更细,这里只挑和"聚焦服务端"最相关的三条快讲。
成本自己拼。 用公共服务,每次对话的账单结构和单价都是别人定的。自建之后,服务器规格你自己选,模型档位你自己挑——简单问题走便宜甚至本地模型,复杂的才上贵的。一个被频繁唤醒的设备,长期下来这笔差价不小。自建不等于免费(服务器、电、云模型 token 都要花钱),但"花在哪、花多少"的决定权回到了你手里。
隐私链路你管。 用公共服务,你说的每句话都要先到第三方转一圈。自建之后,这条链路的中枢在你自己的机器上——数据先到你这儿,哪些再转给云模型、哪些留在本地,由你定。如果识别和合成都用本地方案,理论上整段对话可以不出你的网络。
整条链路可控。 设备直连公共服务器是个黑盒:慢了、错了、断了你只能干等。后端在自己手里,日志你看得到、配置你改得动、要加功能你接得上。从"用户"变成"运维者",是从玩通一个 demo 到掌握一套系统的分界。
xiaozhi-esp32-server 是什么
xinnan-tech/xiaozhi-esp32-server 是小智配套的开源服务端,MIT 协议,主要用 Python 等实现,支持 Docker 部署。它干的正是数据流里"服务端"那一格:接住设备流上来的语音,做识别(ASR)、喂给大模型(LLM)、把回答合成语音(TTS)流回设备。
它最值钱的设计是三段全可插拔——ASR、LLM、TTS 都不绑死某一家,按需选配(本地方案如 FunASR、FishSpeech,云端方案如各家识别/大模型/合成接口)。除主链路外它还带声纹、记忆、意图识别/MCP、RAG 知识库,以及控制台和认证,不是裸脚本,而是一套带管理界面的后端。
上面这些能力和支持列表,是写这篇时对仓库的理解。开源项目迭代快——支持哪些 ASR/LLM/TTS、各自怎么配,请以仓库 README 当前版本为准。把本文当地图,把 README 当实时路况。
用 Docker 部署:一张概念流程图
下面是"自建后端长什么样"的概念级流程,帮你建立心理预期。每一步的具体镜像名、命令、配置项,全部以仓库 README 为准,这里不写死也不编。
拉镜像、起服务。 服务端支持 Docker 部署,常见做法是照 README 拉取官方镜像、用容器(或 compose 编排)把后端跑起来。Docker 的好处正在这儿:它把 Python 环境、依赖、各种运行时全打进镜像,你不用在自己机器上一个个装、一个个对版本——"能在我这跑"变成"照 README 拉起来就能跑",这也是新手自建最该走 Docker 而非源码直装的原因。跑起来后,一条链路的"中枢"就此在你机器上常驻。
改配置:挑你的 ASR / LLM / TTS。 服务端起来后,去它的配置文件里挑要用的识别、模型、合成方案,填上对应接入信息——用云端方案要填各家的 Key,用本地方案要把模型准备好。这一步就是在拼装你那条专属链路。有些版本还带 Web 控制台,可以在界面上配、不必手改文件;以 README 为准。
把设备指向你的服务器。 让小智设备(
78/xiaozhi-esp32那端固件)不再连默认的公共服务,而是连到你这套后端的地址——通常是改设备端的服务器配置(OTA/WebSocket 地址)。设备这端只改"往哪连",链路的重活全在服务端。
跑通之后,你喊小智说的话就走你自己的后端:你配的 ASR 转文字、你选的 LLM 思考、你定的 TTS 念出来——同一台设备,大脑已经换成你的了。
别想着一口气把声纹、记忆、RAG 全配齐。先用最简配置把"对话能通"这条主路跑起来——最朴素的一套 ASR/LLM/TTS 接通、设备能连上、能一问一答,就是巨大的里程碑。进阶能力等主路稳了再逐个加,一次只动一格,出问题才知道是谁的锅。
可插拔模型:换一家,通常只是改个配置
"三段可插拔"听着像个参数选项,实际是自建后端最大的自由度,值得单独讲透。
本地 vs 云端,是一道随时能调的滑块。 用本地识别/合成方案,数据不出你的网络、不按次付费,代价是吃你机器的算力;用云端方案,省本地算力、效果通常更稳,代价是数据上云、按量计费。哪一段更在意隐私就走本地,哪一段更在意效果就走云——这道滑块握在你手里。
换更便宜或更准的模型,基本只是改配置。 大模型这边支持多家接口。哪家更便宜、哪家在你的场景下答得更准、哪家最近降价了,你换过去往往只需动服务端的配置,不必重写、重刷设备固件——设备始终只连你这一个地址,后面换成谁的模型它并不关心。不被任何一家锁死,这是自己掌控后端相比用公共服务最实在的赢面。
小结 · 下一步
- 为什么自建:成本自己拼、隐私链路你管、整条链路可控——核心是不再依赖公共服务器。
- xiaozhi-esp32-server 是什么:小智配套的 MIT 开源服务端,支持 Docker 部署,ASR/LLM/TTS 三段全可插拔,还带声纹/记忆/MCP/RAG。
- Docker 部署三步:拉镜像起服务 → 改配置挑模型 → 把设备指向你的地址;细节一律以 README 为准。
- 可插拔的价值:本地与云随你换、换模型只改配置不动固件,不被任何一家锁死。
把服务端搬回自己手里,你手里就同时握住了两个仓库:设备端 78/xiaozhi-esp32 和服务端 xinnan-tech/xiaozhi-esp32-server——完整的小智,从此都归你调。想把这套账算得更细、看清什么时候该自建、什么时候先用现成,回 L4 自建后端那节补透。
下一步:后端在手,只是"能对话"。真正让小智从"会说话的音箱"跨到"能干活的助手",靠的是把硬件动作暴露给大模型——去下一节 MCP 控硬件(mcp),让对话真正驱动你的设备。