Appearance
本文以家庭智能设备中的个性化交互和控制智能家居为例,介绍如何在 WebSocket 或 RTC 通话中集成声纹识别能力,包括每轮对话实时声纹识别、首轮对话声纹识别、特定声纹唤醒三种场景。 场景描述 在家庭智能设备中,你可以通过以下三种方案实现声纹识别,以满足不同的个性化服务与安全控制需求: 每轮对话实时声纹识别(家庭智能设备个性化交互场景) 在家庭智能设备的 WebSocket 或 RTC 通话中,通过每轮对话实时进行声纹识别,精准区分家庭成员身份,例如妈妈和宝宝,扣子会根据识别结果为不同用户提供专属服务和个性化内容,例如为妈妈推送生活闲聊服务,为宝宝提供趣味问答互动,以此提升家庭智能设备的交互体验。此场景适用于对安全性要求较高的交互,需注意每次识别会产生相应费用。 首轮对话声纹识别(家庭智能设备个性化交互场景) 在家庭智能设备的 WebSocket 或 RTC 通话中,仅在首轮对话进行声纹识别以确定家庭成员身份,例如妈妈和宝宝,后续对话直接沿用该身份信息,从而减少声纹识别消耗的 Token。同时,仍能基于身份信息提供专属服务,例如为妈妈推送生活闲聊服务,为宝宝提供趣味问答互动,提升家庭智能设备的交互体验。该场景适合对资源消耗较敏感的个性化交互需求。 特定声纹唤醒智能体(智能家居控制场景) 在智能手机、智能家居等终端设备中,你可以设置仅特定的声纹,例如仅妈妈和宝宝的声纹能唤醒智能体,确保设备操作的安全性和准确性。此方案适用于需要严格控制设备访问权限的场景,例如防止儿童误操作或保护隐私。 前期准备:创建声纹组和声纹 你可以通过扣子 Web 页面或 Open API 创建声纹组和声纹。为匹配家庭智能设备场景中区分家庭成员的需求,在本场景中声纹组中需包含妈妈的声纹和宝宝的声纹。 方式一:通过扣子页面 在扣子页面创建声纹组,用于统一管理家庭成员声纹将。在声纹组中分别创建名称为“妈妈”和“宝宝”的声纹,并上传各自的声纹数据。具体操作请参见声纹识别。
方式二:通过扣子 Open API 1. 调用创建声纹组 API 创建声纹组(用于统一管理家庭成员声纹)。 2. 调用创建声纹API,分别创建“妈妈”和“宝宝”的声纹,并上传各自的声纹数据,并将两者绑定至同一声纹组中。 场景一:每轮对话实时声纹识别 在本场景中,利用系统变量 sys_voiceprint_name 的值区分成员身份,并根据不同的身份信息设计分支逻辑。在 WebSocket 或 RTC 通话的上行事件中绑定声纹组,语音通话时扣子自动匹配声纹组中的声纹,并将声纹信息通过系统变量 sys_voiceprint_name 传给对话流,实现个性化服务,例如为妈妈提供生活闲聊,为宝宝提供趣味问答等,后续对话沿用该身份信息。 1 为智能体开启声纹识别 1. 创建一个单 Agent(对话流模式)的智能体。 2. 在智能体的编排页面,在对话体验 > 语音区域开启语音通话和声纹识别。 开启声纹识别后,扣子会自动添加声纹识别的系统变量 sys_voiceprint_name 和 sys_voiceprint_info,后续在智能体对话流中需要引用该声纹变量,实现为不同用户身份提供专属服务和个性化内容。 本场景中主要使用 sys_voiceprint_name 变量,用于标识识别的对话人的身份(如 “妈妈” 或 “宝宝”)。例如,当 sys_voiceprint_name 的值为“妈妈”时,智能体将触发与妈妈相关的闲聊服务。当值为“宝宝”时,则触发与宝宝相关的趣味问答服务。
2 搭建对话流 本文以家庭智能设备为例,对话流通过声纹变量sys_voiceprint_name区分成员身份,并根据不同的身份信息设计分支逻辑,实现 "妈妈闲聊" 和 "宝宝闲聊" 的个性化交互。对话流的编排详情如下图所示。
各节点的详细配置如下。
节点
说明
示例
开始节点
保持默认输入参数即可。
选择器节点
智能体根据系统变量 sys_voiceprint_name 的值是“妈妈”或者“宝宝”,来决定进入与妈妈闲聊节点还是与宝宝闲聊节点。 说明 变量的值需要和创建的声纹名称保持一致,例如本示例中的值是“妈妈”和“宝宝”。
与妈妈闲聊(大模型节点)
输入参数:增加 user_input 和 voice_name 参数。 user_input 参数的值引用开始节点的 USER_INPUT。 voice_name 参数的值引用系统变量 sys_voiceprint_name。本文的系统提示词请参见附录-提示词。 系统提示词:根据妈妈这个身份,设闲聊的回复逻辑和风格,例如亲切、生活化。 用户提示词:引用输入参数中的 user_input。
与宝宝闲聊(大模型节点)
输入参数:增加 user_input 和 voice_name 参数。 user_input 参数的值引用开始节点的 USER_INPUT。 voice_name 参数的值引用系统变量 sys_voiceprint_name。 系统提示词:根据宝宝这个身份,设闲聊的回复逻辑和风格,如童趣、简单。本文的系统提示词请参见附录-提示词。 用户提示词:引用输入参数中的 user_input。
结束节点
添加两个输出变量,变量的值分别引用与妈妈闲聊和与宝宝闲聊大模型的输出结果。
3 测试并发布智能体 1. 试运行并发布对话流后,在智能体中添加对话流,在智能体右侧的调试页面单击通话图标,选择对应的声纹组,发起语音通话,验证声纹识别的效果是否符合预期。
发布智能体至 API 渠道。 4 语音通话时进行声纹识别 若需在音视频通话场景中实现个性化服务,需在通过 WebSocket 或 RTC 接入音视频时集成声纹识别能力。实现后,智能体可识别发言者的声纹特征并精准判断其身份(如家庭成员中的妈妈或宝宝),基于身份信息触发差异化交互逻辑,提供针对性的个性化问答服务。 方式一:WebSocket 语音通话 1. 建立 WebSocket 连接时,在 URL 路径的 Query 参数中设置 bot_id。 2. 建立 WebSocket 连接后,发送 chat.update 上行事件,在 data.voice_print_config 参数中绑定对应的声纹组,事件的详细说明请参见双向流式对话事件。
{ "id": "event_id", "event_type": "chat.update", "data": { "voice_print_config": { "group_id": "750564519176***", //group_id为你创建的声纹组的ID,可通过扣子页面的声纹组详情或创建声纹组API的返回结果获取 "score": 40, "reuse_voice_info": false } }
通过 WebSocket 与扣子智能体进行实时语音交互时,通过 input_audio_buffer.append 上行事件,流式上传音频数据,事件的详细说明请参见流式上传音频片段。 方式二: RTC 音视频通话 1. 调用创建房间 API 创建扣子房间。 2. 发送 session.update 上行事件绑定对应的声纹组,具体的事件说明可参考更新房间配置。
{ "id": "event_id", "event_type": "session.update", "data": { "voice_print_config": { "group_id": "750564519176***", //group_id为你创建的声纹组的ID,可通过扣子页面的声纹组详情或创建声纹组API的返回结果获取 "score": 40, "reuse_voice_info": false } } }
场景二:首轮对话声纹识别 本场景中,你需要在对话流中添加自定义变量 voice_print,并根据其值是“妈妈”或“宝宝”设计分支逻辑。在建立 Websocket 连接前调用 API 完成声纹比对,将结果存入自定义变量 voice_print,根据不同身份提供个性化服务,例如为妈妈提供生活闲聊,为宝宝提供趣味问答等,后续对话沿用该身份信息。 1 搭建对话流 本文以家庭智能设备为例,对话流通过自定义的声纹变量区分成员身份,并根据其值是“妈妈”或“宝宝”设计分支逻辑,实现 "妈妈闲聊" 和 "宝宝闲聊" 的个性化交互。对话流的编排详情如下图所示。
各节点的详细配置如下。
节点
说明
示例
开始节点
在开始节点的输入参数中创建自定义参数,例如 voice_print。
选择器节点
智能体根据开始节点中变量 voice_print 的值是“妈妈”或者“宝宝”,来决定进入与妈妈闲聊节点还是与宝宝闲聊节点。 说明 变量的值需要和创建的声纹名称保持一致,例如本示例中的值是“妈妈”和“宝宝”。
与妈妈闲聊(大模型节点)
输入参数:增加 user_input 和 voice_name 参数。 user_input 参数的值引用开始节点的 USER_INPUT。 voice_print 参数的值引用开始节点的输入参数 voice_print。 系统提示词:根据妈妈这个身份,设闲聊的回复逻辑和风格,例如亲切、生活化。本文的系统提示词请参见附录-提示词。 用户提示词:引用输入参数中的 user_input参数。
与宝宝闲聊(大模型节点)
输入参数:增加 user_input 和 voice_name 参数。 user_input 参数的值引用开始节点的 USER_INPUT。 voice_print 参数的值引用开始节点的输入参数 voice_print。 系统提示词:根据宝宝这个身份,设闲聊的回复逻辑和风格,如童趣、简单。本文的系统提示词请参见附录-提示词。 用户提示词:引用输入参数中的 user_input 参数。
结束节点
添加两个输出变量,变量的值分别引用与妈妈闲聊和与宝宝闲聊大模型的输出结果。
2 测试并发布智能体 1. 试运行并发布对话流. 2. 创建一个单 Agent(对话流模式)的智能体,在智能体中添加对话流,在智能体右侧的调试页面单击通话图标,选择对应的声纹组,发起语音通话,验证声纹识别的效果是否符合预期。
发布智能体至 API 渠道。 3 语音通话时进行声纹识别 本文以 WebSocket 为例,RTC 的实现方式类似。 1. 建立 WebSocket 连接前进行声纹比对。 调用声纹特征比对 API,传入声纹组 ID。当用户说话时,扣子会将用户输入的音频与声纹组中的声纹进行比对,并返回声纹组中得分最高的声纹信息,作为本轮对话的说话人身份(标记为 )。 2. 更新对话配置。 建立 WebSocket 连接后,发送 chat.update 事件,在 chat.update 事件的 chat_config.parameters 参数中,将声纹信息通过 parameters 参数传递到 WebSocket 的接口中,WebSocket 会将该自定义参数的值传给对话流。parameters 中的参数名称为对话流开始节点中设置的自定义参数(voice_print),参数的值为说话人的身份信息 。
{ "id": "event_id", "event_type": "chat.update", "data": { "chat_config": { "parameters": { "voice_print": "" // 这里的参数类型以你自己定义的自定义参数类型为准,支持字符串和数字 }
} }
场景三:特定声纹唤醒智能体 在本场景中,你可以设置仅特定的声纹(例如仅妈妈和宝宝的声纹)能唤醒智能体,实现流程如下:
调用声纹特征比对 API,传入声纹组 ID。当用户说话时,扣子会将用户输入的音频与声纹组中的声纹进行比对,并返回声纹列表。 2. 开发者根据返回的声纹列表信息进行业务逻辑中的身份比对,仅当声纹匹配成功后,建立 WebSocket 连接或创建 RTC 房间。 附录-提示词 本文中用到的提示词如下,仅供参考: 与妈妈闲聊
角色
你是一位贴心的生活陪伴小助手,尤其擅长与妈妈们进行交流,能给予温暖且实用的回应。
技能
技能 1: 闲聊陪伴
- 积极与妈妈互动,认真倾听她的心声,围绕烹饪、小孩成长、美妆、衣服搭配等妈妈关心的话题展开交流,回复 100 字左右。
- 结合历史消息和妈妈当前输入,根据她开启的话题深入探讨,分享有趣的观点和经验,让她感受到贴心陪伴。
技能 2: 烹饪交流
- 当妈妈提及烹饪相关话题时,分享不同菜系的特色菜谱。
- 针对妈妈在烹饪过程中遇到的问题,如食材处理、烹饪技巧等,给出专业且实用的建议。
技能 3: 小孩成长探讨
- 若妈妈聊到小孩成长,提供不同年龄段孩子的教育方法和注意事项。
- 分享培养孩子兴趣爱好、性格塑造方面的经验和案例。
技能 4: 美妆分享
- 当妈妈谈到美妆话题,介绍适合妈妈年龄段的护肤品牌和产品。
- 分享日常妆容打造技巧,以及不同场合的妆容搭配建议。
技能 5: 衣服搭配建议
- 妈妈提及衣服搭配时,根据不同季节、场合给出服装搭配方案。
- 推荐适合妈妈身材和风格的服装款式和颜色组合。
用户个人信息
用户的身份是
- 结合用户画像和妈妈历史交流中发生过的记忆点事件,灵活地回答她的问题。
回答格式
- 直接输出文本,不要输出 json
限制:
- 所输出的内容必须按照给定的格式进行组织,不能偏离框架要求。
- 请确保信息来源准确可靠,必要时注明引用来源。
与宝宝闲聊
回复语气
- 俏皮可爱,就像一个6岁的孩子一样
聊天模式:
- 自然的陪伴儿童闲聊,关心他的生活状态和在学校的状态
- 单轮回应要长一点,让小朋友感受到你对他的关注,要超过50个字
- 每1轮都触发问句,推进聊天节奏。但是如果已经询问了小朋友的年龄或者姓名了,就别再问更多问题了
- 经常夸奖小朋友
知识问答模式:
- 绘声绘色的详细的解答小朋友的问题,就像百科全书一样,讲完一小段,会停顿一下
- 每次返回的内容不少于500个字
- 讲完之后,结合小朋友的情况,问一些相关的问题
讲故事模式:
- 绘声绘色的讲述很长的故事,包括人物、场景都细节的描述出来,讲完一小段,会停顿一下
- 故事来源于 《伊索寓言》《格林童话》《安徒生通话》《一千零一夜》等等
- 是小朋友喜欢的主题,首先会告诉小朋友故事的标题
- 每次返回的故事不少于500个字
- 讲完一个故事后,会询问小朋友关于故事的一些问题,比如故事告诉我们什么道理呢?然后再问朋友要不要听其他故事
古诗教学系统
- 欢欢说诗词的上句,让小朋友接下句
- 如果接不上来,就询问是不是需要提示
- 有节奏的朗诵诗句
- 在完成整个一首古诗的接龙之后,会把完整的古诗朗诵一遍,包括标题、作者和古诗内容
- 朗诵完之后,再把这个故事的背景介绍一下,介绍的时候,与小朋友的现状相结合
- 经常夸奖小朋友
成语学习系统
- 故事叙述:"今天我们要学『井底之蛙』~ 从前有只小青蛙住在深井里...",每个成语的叙述都要详细,绘声绘色的描述故事里的人物和场景,要超过500个字
- 道理阐释:"这个成语告诉我们呀,不能像小青蛙那样只看眼前哦~",一般200个字左右
- 知识扩展:询问小朋友要不要听其他与这个成语相关的成语?
- 经常夸奖小朋友
异常处理
当收到非预期输入: "我们换个好玩的好不好?比如..." + 推荐当前未进行的活动
