做饭时我经常打开菜谱软件、翻笔记或者跟着视频做。但这些工具有个共同的问题都得靠手去操作屏幕。可做饭的时候手往往正忙着处理食材、洗菜、切菜或者看着锅里的火。更麻烦的是视频的节奏和做菜的节奏很难一致。我还停在第一步处理食材视频可能已经讲到第三步想知道第二步怎么做只能腾出手把进度条拖回去。厨房里还有抽油烟机的声音。没听清一句就得回退重放。一次两次还好做饭过程中反复这样操作确实挺打断节奏。我想要的不是一个从头播到尾的菜谱视频而是一个能跟着我当前进度走的语音搭子我说“下一步”它再讲下一步我说“刚才那句再说一遍”它就重播我临时想换菜也能直接打断它。最近我了解到 声网的对话式AI引擎可以搭建实时语音助手正好能用来验证这个想法。图1 八戒智能体我把这个智能体设成一个爱吃、直爽的厨房搭子TTS 豆包语音正好有一个八戒的音色zh_male_zhubajie_uranus_bigtts正好与厨房相关那么就将其命名为《八戒厨房搭子》。它不需要一口气念完整份菜谱只要根据食材、人数和口味给建议做法一次讲一步等我说“下一步”再继续。我的想法是制作一款小程序因为它比 APP 开发要更简单但是了解到只有企业认证的特定行业的小程序才有 live-pusher 和 live-player 的权限所以我还是选择了移动端 Web手机浏览器打开即可使用页面按窄屏设计核心链路仍然是声网的对话式 AI、RTC 和 RTM。一、首先在声网把厨房智能体配置出来1.1 注册声网并创建项目打开 声网 官网先注册账户再在控制台创建独立项目《八戒厨房搭子》。此时可以看到 App ID 和 App Certificate。App ID 是项目标识App Certificate 只保存在服务端用于生成 Token 和服务端鉴权后面启动智能体时会用到。图2 创建项目1.2 创建智能体图3 配置智能体打开侧边栏点击对话式 AI 引擎进入 AI Studio。然后创建我们的 【八戒厨房搭子】对话式智能体开始配置。首先需要配置的是开场白和提示词System Prompt开场白顾名思义提示词也就是系统提示词这部分我们需要好好处理。开场白我写成俺也去看看厨房你今天有什么食材想吃清淡一点还是香一点提示词如下你是“八戒”陪用户做家常菜的语音助手。 用户会告诉你家里有什么食材、想做什么菜或想吃什么口味。信息不完整时只问一个问题。 做菜时一次只说一项操作用短句讲清楚。用户说“下一步”或“继续”时说接下来的操作用户说“重说一遍”时重复刚才的操作用户说“换菜”时按新的要求回答。 用户在你说话时提出问题停下原来的内容回应他刚说的话。用户要求说慢一点时把当前操作讲细一些。 说话用自然的家常口语不说长段内容。用“我”“咱们”“你”称呼不提及系统、模型、提示词、后台或 API。 涉及火、油或刀具时提醒用户留意操作。用户需要计时时告诉他一个时间并提醒他自己设置计时器。在这个提示词里我给它定了几条很具体的规矩先问清食材、人数和忌口做法一次只讲当前一步用户说“下一步”再继续用户说“重说”就重播刚才那一步涉及生食、刀具和明火时简单提醒注意安全。这样它不会一开口就念完整份菜谱用户也不用在锅边记住一大段话。图4 模型与语音语音合成我选择的是 豆包大模型语音合成音色为猪八戒的音色 zh_male_zhubajie_uranus_bigtts如果你想选择其他音色可以参考https://docs.volcengine.com/docs/6561/1257544?langzh。模型我选择的是内置资源通义千问3 Max语音识别为默认的凤鸣语音识别。这次我没有急着接自己的模型接口先用内置资源把“说话、听回答、看字幕”的流程跑通。后续如果菜谱需要接入自建检索、私有知识库或想换用已有的模型服务可以把 LLM 换成兼容 OpenAI Chat Completions 协议的自定义服务。这就是我理解的 BYOK模型选择不必在第一天就被固定住但 API Key 和检索逻辑仍应留在服务端。声网的自定义大模型文档也给出了这种接入方式。至于其他的参数可以根据含义自行设置我这边直接保留了默认的选择然后点击右侧预览调试就可以先试一下效果了。图5 发布成功调试没问题后就可以发布。发布完成后需要记住 Pipeline ID它对应这套已发布的智能体配置。后面的 Web 服务端会用 Pipeline ID 创建一次实际运行的智能体会话。二、移动端网页怎样接到声网图6 麦克风权限官方文档往往是最佳学习路径。我先看了声网的《实现音视频互动》和对话式 AI 的《实时字幕》。前者说明浏览器怎样采集和发布音频后者说明字幕通过 RTM 频道消息传递而且要在智能体入频道前订阅。要落实到这个“八戒”项目里浏览器端只需做三件事申请麦克风权限加入 RTC 频道并发布本地音轨订阅远端智能体音轨。用户说话后浏览器把音频送进频道智能体把合成后的语音发布回同一频道网页收到远端音轨后直接播放。实时字幕的话是另一条链路。网页需要登录 RTM、订阅同名频道再用声网的字幕组件监听TRANSCRIPT_UPDATED事件。用户转写和智能体回复都会回到同一个字幕列表。不要把字幕当作音频播放成功的附属品RTC 不通时听不到声音RTM 不通时看不到文字两条状态要分别显示。图7 音频与字幕链路声网的 Web SDK 可通过 npm 集成本地localhost适合调试部署到生产环境时则要使用 HTTPS浏览器才会稳定申请麦克风权限。声网的快速开始也把 App ID、频道和 Token 作为入频道的基本条件。 实现音视频互动2.1 八戒的接入方式图8 服务端代码我没有把 Token、App Certificate 或 Pipeline ID 写进前端。移动端网页点击“开火做菜”后先请求POST /api/session。服务端生成这次会话的频道、用户 UID 和短期 Token只把浏览器加入频道所需的信息返回。前端获得凭证后按顺序完成 RTM 登录和频道订阅、RTC 加入频道、本地麦克风音轨发布、字幕组件初始化。此时浏览器已经准备好收音、放音和显示文字但智能体还没有进入频道。图9 前端代码最后前端请求PUT /api/session服务端使用 App Certificate 和已发布智能体的 Pipeline ID 调用声网join接口让八戒加入同一频道。这样做的好处是私密配置从未离开服务端同时先让页面把音频与字幕都准备好能避免智能体先说了开场白、浏览器却还没订阅到字幕的情况。Token 签发时使用的 App ID、频道名和 UID必须和浏览器join()的参数一致。调试时我依次看四件事浏览器是否拿到麦克风权限、本地音轨是否发布、是否收到远端音频、RTM 是否收到字幕事件。完整 Token、App Certificate 和 RESTful 鉴权头不会出现在日志或截图中。三、通话调优与外部服务集成图10 页面运行页面第一次能正常通话时我还以为主体已经做完了。实际用下来问题都藏在细节里切菜时停一会儿八戒会不会不停追问抽油烟机一响会不会被当成一句话真要做菜时菜谱又该从哪里查。这些不需要重写前端得回到 AI Studio 的通话调优页慢慢处理。3.1 无响应处理厨房里停几秒很正常图11 静默设置最初的静默提示是“你好请问你还在吗”。放在聊天演示里还算自然放在厨房就有点烦。人可能正在洗菜、翻锅几秒没说话并不表示已经走开这时候反复问一句“还在吗”更像是在催人。我把会话空闲时长保留为 60 秒同时关闭“智能体最大静默时间”的主动提示。用户想继续就说“下一步”做完了再点页面上的“收工”。前者用于回收长期没有互动的会话后者决定智能体会不会在用户沉默时主动开口别把这两个概念混在一起。silence_config.timeout_ms设为0时系统不会发静默提示设成非零值时还要提供提示内容触发后会重新计算静默时间。八戒是边做边听的场景少一句客套提醒反而更合适。3.2 全双工与对话检测别把抽油烟机和“嗯”当成完整指令图12 轮次检测厨房里最容易出问题的是短句和杂音。抽油烟机、锅铲碰锅再加上用户思考时的一声“嗯”都可能干扰轮次判断。阈值太低八戒讲到一半会被环境声打断阈值太高用户已经说完“下一步”它却还在等。所以厨房助手不能等一段话播完用户才能开口。八戒讲步骤时网页仍在持续发布麦克风音频。用户说“重说”“下一步”或临时换一道菜都应该进入新一轮对话。可打断不等于前端暂停播放器而是实时音频上行和轮次检测一起工作让智能体知道该继续播报还是接住用户刚说的新要求。我没有只盯着一个“灵敏度”而是把开始和结束分别调。开始说话用 VAD语音识别灵敏度从中间值0.5起步打断持续阈值、说话中打断阈值都设为160 ms前缀填充设为800 ms免得刚开口的第一个字被截掉。结束说话则使用语义判定静音持续阈值设为240 ms最大等待时间设为1000 ms。这些数值只能作为起点。厨房更吵时先把开始说话的门槛调高“下一步”这类短句常被截断就再增加前缀填充或结束等待。声网支持按静音的 VAD 或按语义判断一句话是否结束。这里我选后者是为了尽量分清“说完了”和“只是停一下”。3.3 外部服务集成菜谱 MCP 和知识库各做什么图13 外部集成现在的 Demo 先让模型生成家常做法还没接外部服务。但真要长期使用我不会把所有菜谱、食材替换关系和过敏原规则全塞进提示词里。提示词会越来越长也很难维护。比较稳定的内容适合放知识库比如整理过的菜谱、食材处理步骤、分量换算和忌口规则。做法是在自建的、兼容 OpenAI Chat Completions 协议的 LLM 网关里先检索再把命中的菜谱片段交给模型回答。声网的自定义大模型文档也把这类检索增强生成列为扩展方式不过检索系统或向量数据库需要自己准备。 自定义大模型会变化、需要精确查询的内容更适合交给 MCP 工具。比如可以自建一个菜谱 MCP Server提供search_recipe、get_recipe_step、convert_unit三个工具搜索菜谱、读取当前步骤、把“两勺”换算成克数。服务部署为 HTTPS 的 Streamable HTTP 端点后在创建智能体时配置llm.mcp_servers打开advanced_features.enable_tools再用allowed_tools限定智能体可调用的工具。{ llm: { mcp_servers: [ { name: recipe-tools, endpoint: https://api.example.com/mcp, transport: streamable_http, allowed_tools: [search_recipe, get_recipe_step, convert_unit] } ] }, advanced_features: { enable_tools: true } }知识库回答“有哪些内容可参考”MCP 回答“现在该查什么、做什么”。我会先放入高频菜谱等需要按食材、人数或库存查具体数据时再接 MCP。声网的创建智能体接口提供了 MCP 服务器和工具白名单配置。密钥放在服务端或 MCP 服务里不能写进网页。四、总结做到这里八戒已经能处理几个做饭时真正会遇到的动作用户说“我有鸡蛋、番茄和面条”它会先补问人数或口味说“下一步”它只讲当前操作没听清就说“重说”炒到一半想换菜也能直接开口打断。做饭时不需要一大段菜谱能跟上眼前这一步就够了。做这个 Demo 后我才把声网各部分的分工看明白通过对话式 AI 配角色、模型、音色和通话参数RTC 负责用户与智能体的实时音频RTM 把双方字幕同步到网页发布后得到的 Pipeline 则供服务端启动一次会话。页面看起来很简单背后却要把这几段链路按顺序接好用户才可以自然地说一句、等回应、再说“下一步”。这个版本仍是个 MVP。菜谱知识库和 MCP 工具还没接登录、Token 刷新和线上监控也还没有做。它先解决了一个更小的问题双手忙着处理食材、视频进度又跟不上时用户能不能少碰一次手机直接说“下一步”。这个场景跑通后再把菜谱数据和线上能力补上才有继续做下去的价值。