尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

我用声网对话式 AI 跑通第一个语音智能体:先用模板,再做一个冰雪公主故事机

我用声网对话式 AI 跑通第一个语音智能体:先用模板,再做一个冰雪公主故事机 我之前以为做语音智能体得分别处理语音识别、聊天模型、语音合成和音频传输。真正动手后才发现第一次验证想法没必要先把三套服务拼起来。声网对话式AI把这些能力放进了一个配置页我先用默认资源跑通对话再把它改成一个给闺女讲故事的冰雪公主伙伴。这篇不准备讲一套很大的架构也不打算把它包装成“几分钟上线产品”。我只是把自己的顺序记下来先确认语音链路是否通再改角色和提示词最后把控制台里的智能体放到一个独立网页里。这个顺序对第一次接触语音智能体的人比较友好因为每一步都有可以验证的结果出了问题也知道该回到哪里排查。先说明边界在声网对话式AI 的预览阶段我没有单独配置三方模型的 API Key接入自己的 Web 页面时仍然需要在服务端保存 App Certificate用它生成短期 Token。图1 声网对话式AI 内置的 LLM、TTS 和 ASR 资源第一步创建项目并开通服务首先需要先注册声网然后在 Console 控制台完成实名认证后创建了一个名为 FirstDemo 的项目再到“对话式 AI 引擎”中开通服务。项目是后续配置、发布和调用智能体的必备条件。刚进入控制台时我先创建的是通用项目并选择了 1v1 语音场景。这里不用把项目名想得太复杂后面创建的智能体都可以关联到同一个项目。服务开通后控制台会出现对话式 AI 引擎的入口用户可以通过其中的声网对话式AI引擎用无代码的形式快速构建自己的语音智能体。如果没有先选中项目后面的创建和发布步骤很容易找不到归属。图2 创建项目第二步先从官方模板理解配置进入声网对话式 AI 后我没有从空白开始而是选择了“宝宝故事机-卡皮卡”模板。编辑页分为基础设置、模型与语音、通话调优和高级配置。基础设置里能填写开场白和提示词模型与语音页则能选择 ASR、LLM 和 TTS 资源。图3 进入 声网对话式 AI 引擎图4 选择官方故事机模板图5 智能体编辑页我先沿用默认的语音识别、通义千问 Plus 和豆包语音合成资源。第一次体验时先确认整条链路能对话比一开始就在模型和音色间反复切换更重要。这个模板对我最大的帮助不是直接拿来当产品而是把一份可运行配置摊在眼前ASR 负责把说话内容变成文字LLM 决定回复什么TTS 负责把回复读出来。控制台把这几块都列出来了我至少能知道一次语音对话里有哪些环节。后面如果想换模型、音色或识别服务也不会只知道“效果不对”却不知道应该从哪里改。第三步在控制台预览先确认它真的能说话允许浏览器使用麦克风后预览区显示已连接。我说完话卡皮卡能继续回答并播放语音。这里我重点观察两件事它会不会抢话以及停顿会不会让人等得不耐烦。我的体感是对话节奏自然适合继续往下做。预览页让我先把“配置是否生效”和“应用怎么接入”分开了。前者在声网对话式 AI 引擎里就能验证开场白有没有按设定说、模型是否正常回复、麦克风权限是否可用。只有这里的对话已经顺了再做网页接入才有意义。否则网页里听不到声音时很难判断是前端音频、Token还是智能体配置出了问题。图6 控制台内的语音预览第四步做一个冰雪公主故事伙伴模板跑通后我从“创建智能体”里选择“从空白开始”关联同一个 FirstDemo 项目。这样卡皮卡模板还在新的故事伙伴可以单独调试和发布。我把内部角色设为“艾莎公主故事机”。在结构化提示词里写了前言、基本设定、主要功能、互动指南和示例回应用适合儿童理解的短句说话围绕冰雪冒险、动物朋友、友谊和睡前故事展开讲故事时留一个选择孩子要求换主题、暂停或重讲时直接配合。提示词里也明确不询问姓名、住址、学校等隐私信息遇到不适合儿童的话题就引导孩子找爸爸妈妈。我没有把提示词写成一大段角色设定而是拆成几个小区块。前言负责告诉它这次扮演谁基本设定限定语气和词汇主要功能只保留讲故事、一起编故事和回答简单问题互动指南约束它别连续追问也别把故事讲成说教。这样调试时改一项就够了。比如故事太长我会改“默认 2 到 4 分钟”如果它总是替孩子做决定就把“关键处给出两个选择”写得更明确。我还给了一个开场白“你好呀我是艾莎。今天想听一个冰雪王国的故事还是想和我一起编一个新的冒险你可以告诉我主角、地点或者直接说‘你来决定’。”这句话不追求像电影台词重点是孩子一打开页面就知道该怎么开始说。图7 冰雪公主故事机的配置为了让声音更贴近角色气质我换了一个偏甜美的豆包音色zh_female_tianmeixiaoyuan_moon_bigtts。音色只是第一步真正影响体验的还是开场白、故事长度和能否接住孩子临时改变的剧情。图8 冰雪公主故事机预览第五步发布智能体但它不会自动变成公开网页我一开始以为“发布”会生成一个可分享的智能体链接。实际操作后才明白它更像把当前配置发布为项目内可管理的版本系统会检查服务状态并记录版本发布结果会给出 Pipeline ID。这个区别一开始很容易忽略。声网对话式 AI 引擎里的预览是在编辑器里直接试当前草稿发布后得到的 Pipeline ID才是一份可以被应用调用的稳定配置。以后我改了提示词或音色仍然要重新发布应用下一次启动会话时才会用到新版配置。它不是公开智能体广场也不会自动生成一个给孩子直接点开的聊天链接。图9 发布智能体Pipeline ID 指向已发布的提示词、模型和语音配置。Code Example 则是服务端启动一次运行中智能体的示例让它加入 RTC 频道并返回本次会话的agent_id。它不是现成的网页聊天页面。我后来把这几个 ID 的角色理顺了App ID 标识声网项目Pipeline ID 指向发布后的智能体配置agent_id则只对应某一次正在运行的会话。理解这一点后Code Example 里为什么既有频道又有 Token 和智能体 UID就不那么绕了它是在为一场具体的实时语音会话准备运行环境。图10 发布后的 Pipeline ID。截图中的 App ID、Pipeline ID 等字段应打码。第六步一个最小 Web Demo我用 Node 写了一个只有“开始故事、静音、结束对话”和实时字幕区的页面。点击“开始故事”后服务端读取AGORA_APP_ID、AGORA_APP_CERTIFICATE和AGORA_PIPELINE_ID前两个用于生成短期 RTC RTM Token最后一个用于指定本次会话采用哪套已发布的智能体配置。这里我特意没有把 App Certificate 或任何 Token 写进浏览器代码。浏览器只从自己的服务端获取短期 Token再加入 RTC 频道签名和启动智能体的请求都留在 Node 服务端。开发时把这些变量放进.env.local提交代码前确认这个文件没有进仓库。这一步看起来和故事内容无关却是把控制台 Demo 变成真实应用时最容易踩的坑。随后服务端调用创建智能体接口把pipeline_id、频道和用户 UID 传进去前端加入同一 RTC 频道发布浏览器麦克风音频订阅并播放智能体的远端音频。为了接收字幕我开启了advanced_features.enable_rtm与parameters.data_channel: rtm并用客户端组件监听转写事件。它每次返回完整对话列表页面按最新列表重新渲染即可。网页第一次只播放出了声音字幕区一直空着。我回头看文档发现字幕不只是放一个空白区域还需要接收 RTM 事件并订阅消息。补上登录和订阅逻辑后页面才有机会接到用户转写和智能体回复。这个排查过程也提醒我能听到声音说明 RTC 音频通了看不到文字不等于智能体没回答更可能是字幕事件链路还没有接上。图11 本地 Web Demo艾莎公主故事时间已连接并显示智能体开场白字幕。我主要参考了声网的《使用 RESTful API 实现对话式 AI 引擎》和《实时字幕》。前者说明如何用pipeline_id启动会话后者说明字幕组件与 RTC、RTM 的关系。小结这次实践里声网对话式 AI 负责配置、调试和发布智能体Web 页面负责把它带到用户面前。对我来说模板的价值不在于替代所有开发而是让我先把一条能说、能听、能回应的链路跑通再决定哪些地方值得自己接管。现在故事机已经能离开声网对话式AI的预览面板运行。接下来我会让闺女多试几轮根据她是否愿意继续听、会不会频繁打断、是否能接住临时改剧情继续调整开场白和故事节奏。
返回列表