1. 为什么我要在周末折腾一个「AI 小书童」家里有小孩的都懂一个场景你累了一天孩子抱着一本绘本过来“爸爸/妈妈给我读这个”。你不是不想读是真的嗓子已经冒烟了。市面上其实有不少“AI 读绘本”的产品但多数只是静态语音输出缺少完整具身交互智能——它们只是在朗读文字不是在“陪读”。真正的陪读是什么是孩子指着书上的字问“这个念什么”是读到一半孩子问“为什么小兔子要哭”是根据孩子提问同步神态、中途切换对话不具备真人式陪伴沟通能力。我一直在想能不能用现在的大模型和数字人技术做一个真的会“陪读”的 AI 小书童不是冰冷的语音合成器而是一个有表情、有耐心、能跟孩子对话的虚拟伴读伙伴。这篇文章就来聊聊我做这个小玩意儿的过程。技术栈是 Trae AI 魔珐星云 Xmov SDK DeepSeek思路是把三个东西串起来大模型提供陪读的“脑”魔珐星云具身交互智能 SDK 补齐多模态表达、实时双向交互全套底层能力Trae AI 通过 Skill.md 大模型能力做总调度。适合谁看有 5-8 岁孩子、想自己动手搭一个亲子伴读工具的开发者或者正在做教育类 AI 应用、想找一个可落地交互范式的同学。2. 先想清楚AI 陪读到底陪什么一个 5-8 岁的孩子读书时真正需要的是什么我观察了自己孩子和几个朋友家小孩总结出四件事朗读。这是最基础的——把书上的字念出来。但跟成人不一样孩子需要的是慢节奏、有停顿、重点词加重语气的朗读方式。你得让他跟上。指读。幼儿识字阶段孩子会指着字问“这个是什么”。真人在旁边可以立刻响应完整具身交互智能支持实时插话孩子中途提问可即时切换讲解逻辑这是纯语音设备无法实现的核心体验。解释。“什么叫‘依依不舍’”“为什么大灰狼要吃小羊”孩子的问题天马行空大模型恰好擅长这个——用孩子能听懂的语言解释任何概念。鼓励。当孩子自己尝试读一段读对了需要被夸读错了需要被温和纠正。这对建立阅读信心非常关键。想清楚这四点之后我就知道这个系统要长什么样了孩子提问 → 大模型生成陪读响应 → 数字人用亲切的语气说出来同时配合表情和手势。3. TaoToken 前置把 Key 和 API 通道统一起来在动手写代码之前有一个容易被忽略但很关键的前置动作把大模型调用通道统一。我一开始是直接在代码里写 DeepSeek 的官方地址和 Key本地跑没问题但一旦要分享给朋友或者部署到公网Key 就暴露了。而且后面如果我想换模型、加限流、做用量统计每个地方都要改一遍。我的做法是走 TaoToken 统一 Key/API 通道。它做的事情很朴素给你一个统一的 API 入口和一把 Key背后可以接 DeepSeek 这类模型调用格式保持 OpenAI 兼容。这样我在代码里只需要维护一个 base_url 和一个 Key切换模型或者加新能力时不用动业务代码。具体操作分三步。第一步打开官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 注册账号。第二步进控制台 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 创建 API Key建议给这个项目单独建一把方便后面按项目看用量。第三步把 API 地址记成 https://taotoken.net/api这个地址不加 UTM 参数直接用于代码里的 base_url。注意Key 只显示一次创建后立刻复制到本地配置文件里。不要提交到 Git也不要在前端代码里硬编码。上线时一定要走服务端转发前端只跟自己的后端说话。如果你只是想先验证模型通不通可以打开模型对话页 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 直接发一句“你好帮我用 5 岁小孩能听懂的话解释月亮”看返回是否正常。这一步能帮你排除掉大部分“Key 错了/额度没了/地址写错了”的问题。4. 可复制配置config.toml 与 settings.json 骨架我习惯把配置和代码分开。项目根目录放一个 config.toml 管服务端和模型通道前端放一个 settings.json 管数字人和界面参数。下面是可以直接抄的骨架。config.toml# 服务端配置模型通道 数字人凭证 [server] host 0.0.0.0 port 8787 [llm] # TaoToken 统一通道OpenAI 兼容格式 base_url https://taotoken.net/api api_key sk-你的TaoTokenKey model deepseek-chat temperature 0.8 max_tokens 1024 timeout_seconds 30 [avatar] # 魔珐星云 Xmov 凭证从官网应用管理里拿 app_id 你的AppID app_secret 你的AppSecret gateway_server https://nebula-agent.xingyun3d.com/user/v1/ttsa/session [reading] # 陪读行为参数 max_reply_chars 80 history_rounds 6settings.json前端{ avatar: { containerId: #sdk, width: 800, height: 450, autoSpeak: true }, reading: { defaultBook: 猜猜我有多爱你, speechRate: slow, highlightWords: true }, ui: { theme: warm, showSubtitle: true, showStars: true } }这两个文件的分工要清楚config.toml 里的 api_key 和 app_secret 绝对不能进前端。前端只拿 settings.json 里的展示参数所有需要密钥的请求都发给自己的服务端由服务端去调 TaoToken 和魔珐星云。这是我在踩过一次“Key 被爬”的坑之后定下的规矩。5. SDK 初始化片段数字人 大模型两条线配置就位后开始写初始化。整个项目是三层结构Trae AISKILL.md做智能大脑层负责生成陪读回复、解释词语、回答孩子提问DeepSeek 大模型做交互表达层负责数字人朗读、表情反馈、实时交互对话魔珐星云 Xmov SDK 做具身交互层负责收语音、管理会话状态、串联各模块。Trae AI 通过 Xmov_Skill.md 配置文件来完成项目中数字人的整体调用。先看数字人这条线。拿到 App ID 和 App Secret 的方式是打开魔珐星云官网 → 应用管理 → 开始创建 → 选择我们的形象 → 接入 SDK。然后初始化代码是这样const avatar new window.XmovAvatar({ containerId: #little-scholar, appId: 你的 App ID, appSecret: 你的 App Secret, gatewayServer: https://nebula-agent.xingyun3d.com/user/v1/ttsa/session, onMessage: (msg) console.log(小墨收到消息:, msg) }); await avatar.init({ onDownloadProgress: (progress) { console.log(小墨正在赶来...${progress}%); } });加载完成后页面上就会出现一个有表情动画的 3D 少年形象。这里有个细节html/js 文件仅用于我们快速调用 SDK直接部署会有跨域或者 ApiKey 泄露问题正式上线一定要把凭证收口到服务端。再看大模型这条线。核心是把每次孩子说的话和之前的阅读上下文打包发给模型。代码层面是这样实现的async function littleScholarReply(childInput) { const messages [ { role: system, content: buildScholarPrompt() }, { role: system, content: 当前正在读《${currentBook.title}》已读到第${currentPage}页。 }, ...conversationHistory.slice(-12), { role: user, content: childInput } ]; const response await fetch(https://taotoken.net/api/v1/chat/completions, { method: POST, headers: { Content-Type: application/json, Authorization: Bearer ${serverSideKey} }, body: JSON.stringify({ model: deepseek-chat, messages, temperature: 0.8, max_tokens: 1024 }) }); const data await response.json(); return data.choices?.[0]?.message?.content; }注意一个细节把“当前读什么书、读到哪一页”也作为 system message 注入。这样小墨才知道孩子现在在什么上下文里回答才不会是“断片”的。temperature 设到 0.8 比社区陪读项目更高因为陪孩子的回复需要更活泼灵动不能太死板。6. 让数字人「说话」而不是「念稿」拿到 DeepSeek 的回复后接下来就是让小墨说出来。这里有一个容易踩的坑若直接向具身交互智能体传入完整长文本会缺失真人朗读停顿节奏依托 SDK 流式分段播报能力拆分句子逐段驱动是具身交互智能人性化交互设计关键一环。我加了一个简单的句子级播报队列const speechQueue []; let isSpeaking false; function enqueueSpeech(text) { const sentences text.split(/(?[。…\.\!\?])/g); sentences.filter(s s.trim()).forEach(s speechQueue.push(s.trim())); processQueue(); } function processQueue() { if (isSpeaking || speechQueue.length 0) return; const sentence speechQueue.shift(); isSpeaking true; const shouldAnimate conversationHistory.length 0; avatar.speak(sentence, shouldAnimate, true); } onVoiceStateChange: (state) { if (state idle || state end) { isSpeaking false; processQueue(); } }这样做的好处是小墨说完一句会自然停顿像真人在陪读一样有节奏感。孩子中间插话也不会出现“机器还在自顾自念”的尴尬——下一句还没发出孩子的声音可以随时被接收处理。7. 一次朗读问答联调从孩子指字到小墨回应假设孩子正在读绘本《猜猜我有多爱你》读到小兔子说“我爱你一直到月亮那里”这一页。孩子指着“月亮”“小墨这个字怎么念呀”系统处理流程是这样的语音识别转文字“小墨这个字怎么念呀” → 代码组装上下文当前书《猜猜我有多爱你》第 8 页孩子指着“月亮”提问→ DeepSeek 生成回复 → 小墨微笑用活泼的语气“这个字读‘月’月亮的月你看天上的月亮是不是弯弯的呀‘月亮’就是晚上挂在天上亮亮的那个东西哦”孩子“那我也会读这句我爱你一直到月亮那里——”系统识别到孩子在朗读 → 对比原文 → 发现“里”读成了“里”其实对了→ DeepSeek 给出反馈 → 小墨开心地点头“哇你全读对了发音很标准呢我们接着往下看看看小兔子还说了什么好不好”整个过程不到两秒孩子感受到的是“有人真的在听我读书”而不是“我在对着一个 App 念经”。8. 本篇常见错排查联调过程中我遇到几个典型报错列出来帮你省时间。第一个数字人初始化报 401 或鉴权失败。八成是 App ID / App Secret 填错或者复制时带了空格。去魔珐星云官网应用管理里重新核对一遍注意 Secret 只在创建时显示一次。第二个大模型返回 401 或 403。检查 TaoToken 的 Key 是否有效、base_url 是否写成了 https://taotoken.net/api不要多加斜杠或路径。如果是在浏览器里直接调还要确认没有把 Key 暴露在前端。第三个数字人加载卡在某个百分比不动。通常是网络问题或者 gatewayServer 地址写错。确认用的是 https://nebula-agent.xingyun3d.com/user/v1/ttsa/session并且本地能正常访问外网。第四个语音识别没反应。检查浏览器是否支持 SpeechRecognitionChrome 和 Edge 支持较好Safari 需要额外配置。另外麦克风权限要允许。第五个回复太长孩子听不完。在 system prompt 里明确写“每次回复不超过 80 个字”代码里再做一次截断兜底。第六个数字人说话没有表情。检查 speak 方法的第一个参数是否传了 true这个参数控制是否根据文本情感匹配表情和头部动作。9. 下一步怎么走如果你也想做教育类 AI 应用或者家里刚好有个正在学识字的小朋友不妨试试搭一个。这个 Demo 的核心代码不超过 300 行但能做的事情可能比一个 299 块的“智能故事机”多得多。需要长期做编码和 Agent 调度的可以看看 Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 它更适合把这类项目持续迭代下去。接入过程中遇到鉴权、通道、Key 管理的问题直接翻接入文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 大部分坑里面都有说明。如果你用的是 Claude Code 这类工具做开发Anthropic 兼容入口在 https://taotoken.net/claude-code-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaudecodeutm_campaignrewrite 配置方式跟本文的 OpenAI 兼容格式略有不同按文档来就行。最后说一句实在的AI 陪读的技术门槛比想象中低但体验门槛比想象中高。整套落地验证行业核心逻辑是——DeepSeek 补齐 AI 阅读理解能力魔珐星云全域具身交互智能 SDK 补齐线下可视化、实时双向交互完整底层能力搭配 Trae AI 低代码开发调度零基础即可快速搭建教育场景交互智能体一个周末就能跑通基本链路。不需要自己训练模型不需要写渲染引擎甚至不需要写后端上线时我们需要走接口代理不要暴露我们的 ApiKey。但体验层面决定孩子会不会真的愿意跟小墨读书的是完整具身交互智能带来的拟人化体验自然朗读节奏、共情表情反馈、随时插话的双向沟通。这些不是靠堆功能能解决的是靠反复调试 system prompt、调整播报节奏、观察孩子真实反应一点一点磨出来的。
