当前位置: 首页 > news >正文

【AI智能体】智能音视频-硬件设备基于 WebSocket 实现语音交互

本文介绍硬件设备通过 WebSocket 实现语音交互的完整流程。WebSocket 技术为硬件设备提供了低延迟的语音交互能力,支持按键说话和自由对话两种模式,适用于智能音箱、车载系统、智能家居控制、在线客服、游戏语音聊天等场景,满足不同使用场景的需求。

WebSocket 语音功能介绍

扣子 WebSocket 提供了高效且灵活的语音交互解决方案,以下是其核心功能:

  • 支持按键说话与自由对话
    • 按键说话(客户端按键判停):用户通过按键控制录音的开始和结束,适用于需要精准控制对话的场景。
    • 自由对话(扣子云端判停):扣子云端通过语音活动检测(VAD)自动判断语音的开始和结束,实现无缝的自然对话体验。
  • 支持多种音频编码格式

扣子 WebSocket 支持多种音频编码格式,以满足不同设备和网络环境的需求:

  • 输入音频:支持 PCM、OPUS、G711A 和 G711U 格式。
  • 输出音频:支持 PCM、OPUS、G711A 和 G711U 格式,默认为采样率 24000 的 PCM 片段。
  • 低延迟交互

扣子 WebSocket 具备低延迟的语音交互体验, 按键说话场景的时延低至 1.2 秒,自由对话场景的时延低至 1.8 秒。

按键说话场景的实现流程

1 检查智能体配置

在接入硬件设备之前,确保智能体的配置无误,且通话延迟小于两秒。可以通过以下步骤进行测试和验证:

  1. 在 WebSocket 实时语音 Demo 页面右上角的 Settings 中配置个人访问令牌(PAT)和智能体 ID ,具体步骤请参见集成 WebSocket 实时语音 Web SDK。
  2. 与智能体进行语音对话。测试对话的延迟,如果延迟较高,建议检查智能体的配置,例如是否配置了插件或工作流。可以先去掉这些配置进行测试,正常体感延迟应控制在 2 秒左右。

2 设备侧接入

整体交互流程

步骤一:建立 WebSocket 连接

与扣子建立 WebSocket 连接,具体请参见双向流式语音对话。

步骤二:发送 chat.update 事件更新配置

与扣子 WebSocket 连接成功后,立即发送 chat.update 事件更新对话配置。以下是配置示例:

说明:

实际使用时需要去掉代码中的注释。

输入输出音频都是 PCM

{ "id": "event_id", "event_type": "chat.update", "data": { "chat_config": { "auto_save_history": true, // 保存历史记录。默认 true "conversation_id": "", // 会话 ID,按需配置,可以不设置,不设置就去掉这行配置,不要传空!,你可以通过查看会话列表 API 的返回参数中获取 conversation_id。"user_id": "xxx",  // 标识当前与智能体的用户,由使用方自行定义、生成与维护。user_id 用于标识对话中的不同用户,不同的 user_id,其对话的上下文消息、数据库等对话记忆数据互相隔离。如果不需要用户数据隔离,可将此参数固定为一个任意字符串 "meta_data": {}, // 附加信息,通常用于封装一些业务相关的字段。查看对话消息详情时,系统会透传此附加信息。 "custom_variables": {}, // 智能体中定义的变量。在智能体prompt中设置变量{{key}}后,可以通过该参数传入变量值,同时支持Jinja2语法。详细说明可参考变量示例。变量名只支持英文字母和下划线。 "extra_params": {},   // 附加参数,通常用于特殊场景下指定一些必要参数供模型判断,例如指定经纬度,并询问智能体此位置的天气。自定义键值对格式,其中键(key)仅支持设置为:latitude:纬度,此时值(Value)为纬度值,例如39.9800718。longitude:经度,此时值(Value)为经度值,例如116.309314。 "parameters": {"custom_var_1": "测试"} }, "input_audio": {         // 输入音频格式 "format": "pcm",       // 输入音频格式,支持 PCM格式 "codec": "pcm",         // 输入音频编码。 支持 pcm/g711a/g711u/opus。默认 pcm "sample_rate": 24000,  // 按需配置采样率 "channel": 1, // 通道数 "bit_depth": 16 // 位深 }, "output_audio": {        // 输出音频格式 "codec": "pcm",      // 支持 pcm/g711a/g711u/opus。默认 pcm。如果是 g711a/g711u,pcm_config 的 sample_rate 只能是 8000"pcm_config": { "sample_rate": 16000,  // 默认  24000 "frame_size_ms": 50, "limit_config": { "period": 1, "max_frame_num": 22 } }, "speech_rate": 0,  // 回复的语速,取值范围 [-50, 100],默认为 0,-50 表示 0.5 倍速,100 表示 2倍速 "voice_id": "7426720361733046281"    // 音色id,你可以通过查看音色列表 API 获取可用的音色,具体请参见https://www.coze.cn/open/docs/developer_guides/list_voices},"event_subscriptions": ["error","conversation.chat.camplete","conversation.chat.canceled","conversation.audio.delta","conversation.chat.failed"]} 
}

输入是 PCM,输出是 OPUS

{ "id": "event_id", "event_type": "chat.update", "data": { "chat_config": { "auto_save_history": true, // 保存历史记录。默认 true "conversation_id": "", // 会话 ID,按需配置,可以不设置,不设置就去掉这行配置,不要传空!,你可以通过查看会话列表 API 的返回参数中获取 conversation_id"user_id": "xxx",  // 标识当前与智能体的用户,由使用方自行定义、生成与维护。user_id 用于标识对话中的不同用户,不同的 user_id,其对话的上下文消息、数据库等对话记忆数据互相隔离。如果不需要用户数据隔离,可将此参数固定为一个任意字符串 "meta_data": {}, // 附加信息,通常用于封装一些业务相关的字段。查看对话消息详情时,系统会透传此附加信息。 "custom_variables": {}, // 智能体中定义的变量。在智能体prompt中设置变量{{key}}后,可以通过该参数传入变量值,同时支持Jinja2语法。详细说明可参考变量示例。变量名只支持英文字母和下划线。 "extra_params": {},   // 附加参数,通常用于特殊场景下指定一些必要参数供模型判断,例如指定经纬度,并询问智能体此位置的天气。自定义键值对格式,其中键(key)仅支持设置为:latitude:纬度,此时值(Value)为纬度值,例如39.9800718。longitude:经度,此时值(Value)为经度值,例如116.309314。 "parameters": {"custom_var_1": "测试"} }, "input_audio": {         // 输入音频格式 "format": "pcm",       // 输入音频格式,支持 PCM 格式 "codec": "pcm",         // 输入音频编码。支持 pcm/g711a/g711u/opus。默认 pcm "sample_rate": 24000,  // 采样率 "channel": 1, // 通道数 "bit_depth": 16 // 位深 }, "output_audio": {        // 输出音频格式 "codec": "opus",      // 支持 pcm/g711a/g711u/opus。默认 pcm。如果是 g711a/g711u,pcm_config 的 sample_rate 只能是 8000"opus_config": { "bitrate": 48000,   // 码率 "use_cbr": true,     // 是否使用 cbr 编码 "frame_size_ms": 60,   // 帧长(单位ms) "limit_config": { "period": 1,   // 周期(单位 s) "max_frame_num": 17 // 周期内返回最大 opus 帧数量 } }, "speech_rate": 0,  // 回复的语速,取值范围 [-50, 100],默认为 0,-50 表示 0.5 倍速,100 表示 2倍速 "voice_id": "7426720361733046281"  // 音色id,你可以通过查看音色列表 API 获取可用的音色,具体请参见https://www.coze.cn/open/docs/developer_guides/list_voices},"event_subscriptions": ["error","conversation.chat.camplete","conversation.chat.canceled","conversation.audio.delta","conversation.chat.failed"]} 
}

输入是 OPUS,输出是 PCM

{ "id": "event_id", "event_type": "chat.update", "data": { "chat_config": { "auto_save_history": true, // 保存历史记录。默认 true "conversation_id": "", // 会话 ID,按需配置,可以不设置,不设置就去掉这行配置,不要传空!,你可以通过查看会话列表 API 的返回参数中获取 conversation_id。"user_id": "xxx",  // 标识当前与智能体的用户,由使用方自行定义、生成与维护。user_id 用于标识对话中的不同用户,不同的 user_id,其对话的上下文消息、数据库等对话记忆数据互相隔离。如果不需要用户数据隔离,可将此参数固定为一个任意字符串 "meta_data": {}, // 附加信息,通常用于封装一些业务相关的字段。查看对话消息详情时,系统会透传此附加信息。 "custom_variables": {}, // 智能体中定义的变量。在智能体prompt中设置变量{{key}}后,可以通过该参数传入变量值,同时支持Jinja2语法。详细说明可参考变量示例。变量名只支持英文字母和下划线。 "extra_params": {},   // 附加参数,通常用于特殊场景下指定一些必要参数供模型判断,例如指定经纬度,并询问智能体此位置的天气。自定义键值对格式,其中键(key)仅支持设置为:latitude:纬度,此时值(Value)为纬度值,例如39.9800718。longitude:经度,此时值(Value)为经度值,例如116.309314。 "parameters": {"custom_var_1": "测试"} }, "input_audio": {         // 输入音频格式 "format": "pcm",       // 输入音频格式,支持 PCM格式 "codec": "opus",         // 输入音频编码。 支持 pcm/g711a/g711u/opus。默认 pcm "sample_rate": 24000,  // 按需配置采样率 "channel": 1, // 通道数 "bit_depth": 16 // 位深 }, "output_audio": {        // 输出音频格式 "codec": "pcm",        // 支持 pcm/g711a/g711u/opus。默认 pcm。如果是 g711a/g711u,pcm_config 的 sample_rate 只能是 8000"pcm_config": { "sample_rate": 16000,  // 默认  24000 "frame_size_ms": 50, "limit_config": { "period": 1, "max_frame_num": 22 } }, "speech_rate": 0,  // 回复的语速,取值范围 [-50, 100],默认为 0,-50 表示 0.5 倍速,100 表示 2倍速 "voice_id": "7426720361733046281"    // 音色id,你可以通过查看音色列表 API 获取可用的音色,具体请参见https://www.coze.cn/open/docs/developer_guides/list_voices},"event_subscriptions": ["error","conversation.chat.camplete","conversation.chat.canceled","conversation.audio.delta","conversation.chat.failed"]} 
}

输入输出都是 OPUS

{ "id": "event_id", "event_type": "chat.update", "data": { "chat_config": { "auto_save_history": true, // 保存历史记录。默认 true "conversation_id": "", // 会话 ID,按需配置,可以不设置,不设置就去掉这行配置,不要传空!,你可以通过查看会话列表 API 的返回参数中获取 conversation_id"user_id": "xxx",  // 标识当前与智能体的用户,由使用方自行定义、生成与维护。user_id 用于标识对话中的不同用户,不同的 user_id,其对话的上下文消息、数据库等对话记忆数据互相隔离。如果不需要用户数据隔离,可将此参数固定为一个任意字符串 "meta_data": {}, // 附加信息,通常用于封装一些业务相关的字段。查看对话消息详情时,系统会透传此附加信息。 "custom_variables": {}, // 智能体中定义的变量。在智能体prompt中设置变量{{key}}后,可以通过该参数传入变量值,同时支持Jinja2语法。详细说明可参考变量示例。变量名只支持英文字母和下划线。 "extra_params": {},   // 附加参数,通常用于特殊场景下指定一些必要参数供模型判断,例如指定经纬度,并询问智能体此位置的天气。自定义键值对格式,其中键(key)仅支持设置为:latitude:纬度,此时值(Value)为纬度值,例如39.9800718。longitude:经度,此时值(Value)为经度值,例如116.309314。 "parameters": {"custom_var_1": "测试"} }, "input_audio": {         // 输入音频格式 "format": "pcm",       // 输入音频格式,支持 PCM 格式 "codec": "opus",         // 输入音频编码。支持 pcm/g711a/g711u/opus。默认 pcm "sample_rate": 24000,  // 采样率 "channel": 1, // 通道数 "bit_depth": 16 // 位深 }, "output_audio": {        // 输出音频格式 "codec": "opus",      // 支持 pcm/g711a/g711u/opus。默认 pcm。如果是 g711a/g711u,pcm_config 的 sample_rate 只能是 8000"opus_config": { "bitrate": 48000,   // 码率 "use_cbr": true,     // 是否使用 cbr 编码 "frame_size_ms": 60,   // 帧长(单位ms) "limit_config": { "period": 1,   // 周期(单位 s) "max_frame_num": 17 // 周期内返回最大 opus 帧数量 } }, "speech_rate": 0,  // 回复的语速,取值范围 [-50, 100],默认为 0,-50 表示 0.5 倍速,100 表示 2倍速 "voice_id": "7426720361733046281"  // 音色id,你可以通过查看音色列表 API 获取可用的音色,具体请参见https://www.coze.cn/open/docs/developer_guides/list_voices},"event_subscriptions": ["error","conversation.chat.camplete","conversation.chat.canceled","conversation.audio.delta","conversation.chat.failed"]} 
}
步骤三:发送音频数据
  1. 用户按下录音键,开始录音,通过 input_audio_buffer.append 事件持续发送音频数据给扣子,事件说明请参见流式上传音频片段。

如果是上行是 PCM 编码的音频,每次发送 10ms ~ 20ms 的音频数据给扣子,例如每间隔 20ms,发送 20ms 的音频数据,对应字节数 = 采样率 * 位深/8 * 通道数 * 0.02。

如果上行是 OPUS 编码的音频,每次发送 20ms/40ms 帧长的 OPUS 音频数据是最优的选择。

  1. 用户松开录音键,结束录音,发送 input_audio_buffer.complete 事件告诉扣子音频发送完毕。事件说明请参见提交音频。
步骤四:接收音频事件
  1. 收到扣子返回的 conversation.audio.delta 事件后,解析其中的 content 字段,进行 Base64 解码后获取二进制音频数据。事件说明请参见增量语音 。
  2. 将音频数据放入播放缓冲区队列,由单独的线程从缓冲区取音频数据进行播放。
步骤五:打断对话
  1. 智能体正在播放时,用户按下录音键,需要发送 conversation.chat.cancel 事件告诉扣子打断智能体输出。事件说明请参见打断智能体输出。
  2. 扣子接收到 conversation.chat.cancel 事件后,会停止返回音频数据,并返回 conversation.chat.canceled 事件。
  3. 设备侧接收到 conversation.chat.canceled 事件后,需要停止播放并清空播放缓冲区的数据。

自由对话场景的实现流程

扣子 WebSocket 方案支持自由对话,扣子云端会进行 VAD 的检测。

1 检查智能体配置

在接入硬件设备之前,确保智能体的配置无误,且通话延迟小于两秒。可以通过以下步骤进行测试和验证:

  1. 在 WebSocket 实时语音 Demo 页面右上角的 Settings 中配置个人访问令牌(PAT)和智能体 ID ,具体步骤请参见集成 WebSocket 实时语音 Web SDK。
  2. 与智能体进行语音对话。测试对话的延迟,如果延迟较高,建议检查智能体的配置,例如是否配置了插件或工作流。可以先去掉这些配置进行测试,正常体感延迟应控制在 2 秒左右。

2 设备侧接入

整体交互流程

步骤一:建立 WebSocket 连接

与扣子建立 WebSocket 连接,具体请参见双向流式语音对话。

步骤二:发送 chat.update 事件更新配置

与扣子 WebSocket 连接成功后,立即发送 chat.update 事件更新对话配置。以下是配置示例:

说明:

实际使用时需要去掉代码中的注释。

输入输出音频都是 PCM

{ "id": "event_id", "event_type": "chat.update", "data": { "chat_config": { "auto_save_history": true, // 保存历史记录。默认 true "conversation_id": "", // 会话 ID,按需配置,可以不设置,不设置就去掉这行配置,不要传空!,你可以通过查看会话列表 API 的返回参数中获取 conversation_id。"user_id": "xxx",  // 标识当前与智能体的用户,由使用方自行定义、生成与维护。user_id 用于标识对话中的不同用户,不同的 user_id,其对话的上下文消息、数据库等对话记忆数据互相隔离。如果不需要用户数据隔离,可将此参数固定为一个任意字符串 "meta_data": {}, // 附加信息,通常用于封装一些业务相关的字段。查看对话消息详情时,系统会透传此附加信息。 "custom_variables": {}, // 智能体中定义的变量。在智能体prompt中设置变量{{key}}后,可以通过该参数传入变量值,同时支持Jinja2语法。详细说明可参考变量示例。变量名只支持英文字母和下划线。 "extra_params": {},   // 附加参数,通常用于特殊场景下指定一些必要参数供模型判断,例如指定经纬度,并询问智能体此位置的天气。自定义键值对格式,其中键(key)仅支持设置为:latitude:纬度,此时值(Value)为纬度值,例如39.9800718。longitude:经度,此时值(Value)为经度值,例如116.309314。 "parameters": {"custom_var_1": "测试"} }, "input_audio": {         // 输入音频格式 "format": "pcm",       // 输入音频格式,支持 PCM 格式"codec": "pcm",         // 输入音频编码。支持 pcm/g711a/g711u/opus。默认 pcm "sample_rate": 24000,  // 采样率 "channel": 1, // 通道数 "bit_depth": 16 // 位深 }, "output_audio": {        // 输出音频格式 "codec": "pcm",      // 支持 pcm/g711a/g711u/opus。默认 pcm。如果是 g711a/g711u,pcm_config 的 sample_rate 只能是 8000"pcm_config": { "sample_rate": 16000,  // 默认  24000 "frame_size_ms": 50, "limit_config": { "period": 1, "max_frame_num": 22 } }, "speech_rate": 0,  // 回复的语速,取值范围 [-50, 100],默认为 0,-50 表示 0.5 倍速,100 表示 2倍速 "voice_id": "7426720361733046281" // 音色id,你可以通过查看音色列表 API 获取可用的音色,具体请参见https://www.coze.cn/open/docs/developer_guides/list_voices},"turn_detection": {"type": "server_vad"   // 默认是客户端打断(按键说话)},"event_subscriptions": ["error","input_audio_buffer.speech_started","input_audio_buffer.speech_stopped","conversation.audio.delta","conversation.chat.failed"]} 
}

输入是 PCM,输出是 OPUS

{ "id": "event_id", "event_type": "chat.update", "data": { "chat_config": { "auto_save_history": true, // 保存历史记录。默认 true "conversation_id": "", // 会话 ID。按需配置,可以不设置,不设置就去掉这行配置,不要传空!,你可以通过查看会话列表 API 的返回参数中获取 conversation_id。"user_id": "xxx",  // 标识当前与智能体的用户,由使用方自行定义、生成与维护。user_id 用于标识对话中的不同用户,不同的 user_id,其对话的上下文消息、数据库等对话记忆数据互相隔离。如果不需要用户数据隔离,可将此参数固定为一个任意字符串 "meta_data": {}, // 附加信息,通常用于封装一些业务相关的字段。查看对话消息详情时,系统会透传此附加信息。 "custom_variables": {}, // 智能体中定义的变量。在智能体prompt中设置变量{{key}}后,可以通过该参数传入变量值,同时支持Jinja2语法。详细说明可参考变量示例。变量名只支持英文字母和下划线。 "extra_params": {},   // 附加参数,通常用于特殊场景下指定一些必要参数供模型判断,例如指定经纬度,并询问智能体此位置的天气。自定义键值对格式,其中键(key)仅支持设置为:latitude:纬度,此时值(Value)为纬度值,例如39.9800718。longitude:经度,此时值(Value)为经度值,例如116.309314。 "parameters": {"custom_var_1": "测试"} }, "input_audio": {         // 输入音频格式 "format": "pcm",       // 输入音频格式,支持 PCM 格式 "codec": "pcm",         // 输入音频编码。支持 pcm/g711a/g711u/opus。默认 pcm "sample_rate": 24000,  // 采样率 "channel": 1, // 通道数 "bit_depth": 16 // 位深 }, "output_audio": {        // 输出音频格式 "codec": "opus",     // 支持 pcm/g711a/g711u/opus。默认 pcm。如果是 g711a/g711u,pcm_config 的 sample_rate 只能是 8000"opus_config": { "bitrate": 48000,   // 码率 "use_cbr": false,     // 是否使用 cbr 编码 "frame_size_ms": 60,   // 帧长(单位ms) "limit_config": { "period": 1,   // 周期(单位 s) "max_frame_num": 17 // 周期内返回最大 opus 帧数量 } }, "speech_rate": 0,  // 回复的语速,取值范围 [-50, 100],默认为 0,-50 表示 0.5 倍速,100 表示 2倍速 "voice_id": "7426720361733046281"   // 音色id,你可以通过查看音色列表 API 获取可用的音色,具体请参见https://www.coze.cn/open/docs/developer_guides/list_voices},"turn_detection": {"type": "server_vad"},"event_subscriptions": ["error","input_audio_buffer.speech_started","input_audio_buffer.speech_stopped","conversation.audio.delta","conversation.chat.failed"]} 
}

输入是 OPUS,输出是 PCM

{ "id": "event_id", "event_type": "chat.update", "data": { "chat_config": { "auto_save_history": true, // 保存历史记录。默认 true "conversation_id": "", // 会话 ID,按需配置,可以不设置,不设置就去掉这行配置,不要传空!,你可以通过查看会话列表 API 的返回参数中获取 conversation_id。"user_id": "xxx",  // 标识当前与智能体的用户,由使用方自行定义、生成与维护。user_id 用于标识对话中的不同用户,不同的 user_id,其对话的上下文消息、数据库等对话记忆数据互相隔离。如果不需要用户数据隔离,可将此参数固定为一个任意字符串 "meta_data": {}, // 附加信息,通常用于封装一些业务相关的字段。查看对话消息详情时,系统会透传此附加信息。 "custom_variables": {}, // 智能体中定义的变量。在智能体prompt中设置变量{{key}}后,可以通过该参数传入变量值,同时支持Jinja2语法。详细说明可参考变量示例。变量名只支持英文字母和下划线。 "extra_params": {},   // 附加参数,通常用于特殊场景下指定一些必要参数供模型判断,例如指定经纬度,并询问智能体此位置的天气。自定义键值对格式,其中键(key)仅支持设置为:latitude:纬度,此时值(Value)为纬度值,例如39.9800718。longitude:经度,此时值(Value)为经度值,例如116.309314。 "parameters": {"custom_var_1": "测试"} }, "input_audio": {         // 输入音频格式 "format": "pcm",       // 输入音频格式,支持 PCM 格式"codec": "opus",         // 输入音频编码。支持 pcm/g711a/g711u/opus。默认 pcm "sample_rate": 24000,  // 采样率 "channel": 1, // 通道数 "bit_depth": 16 // 位深 }, "output_audio": {        // 输出音频格式 "codec": "pcm",      // 支持 pcm/g711a/g711u/opus。默认 pcm。如果是 g711a/g711u,pcm_config 的 sample_rate 只能是 8000  "pcm_config": { "sample_rate": 16000,  // 默认  24000 "frame_size_ms": 50, "limit_config": { "period": 1, "max_frame_num": 22 } }, "speech_rate": 0,  // 回复的语速,取值范围 [-50, 100],默认为 0,-50 表示 0.5 倍速,100 表示 2倍速 "voice_id": "7426720361733046281" // 音色id,你可以通过查看音色列表 API 获取可用的音色,具体请参见https://www.coze.cn/open/docs/developer_guides/list_voices},"turn_detection": {"type": "server_vad"   // 默认是客户端打断(按键说话)},"event_subscriptions": ["error","input_audio_buffer.speech_started","input_audio_buffer.speech_stopped","conversation.audio.delta","conversation.chat.failed"]} 
}

输入输出都是 OPUS

{ "id": "event_id", "event_type": "chat.update", "data": { "chat_config": { "auto_save_history": true, // 保存历史记录。默认 true "conversation_id": "", // 会话 ID。按需配置,可以不设置,不设置就去掉这行配置,不要传空!,你可以通过查看会话列表 API 的返回参数中获取 conversation_id。"user_id": "xxx",  // 标识当前与智能体的用户,由使用方自行定义、生成与维护。user_id 用于标识对话中的不同用户,不同的 user_id,其对话的上下文消息、数据库等对话记忆数据互相隔离。如果不需要用户数据隔离,可将此参数固定为一个任意字符串 "meta_data": {}, // 附加信息,通常用于封装一些业务相关的字段。查看对话消息详情时,系统会透传此附加信息。 "custom_variables": {}, // 智能体中定义的变量。在智能体prompt中设置变量{{key}}后,可以通过该参数传入变量值,同时支持Jinja2语法。详细说明可参考变量示例。变量名只支持英文字母和下划线。 "extra_params": {},   // 附加参数,通常用于特殊场景下指定一些必要参数供模型判断,例如指定经纬度,并询问智能体此位置的天气。自定义键值对格式,其中键(key)仅支持设置为:latitude:纬度,此时值(Value)为纬度值,例如39.9800718。longitude:经度,此时值(Value)为经度值,例如116.309314。 "parameters": {"custom_var_1": "测试"} }, "input_audio": {         // 输入音频格式 "format": "pcm",       // 输入音频格式,支持 PCM 格式 "codec": "opus",         // 输入音频编码。支持 pcm/g711a/g711u/opus。默认 pcm "sample_rate": 24000,  // 采样率 "channel": 1, // 通道数 "bit_depth": 16 // 位深 }, "output_audio": {        // 输出音频格式 "codec": "opus",     // 支持 pcm/g711a/g711u/opus。默认 pcm。如果是 g711a/g711u,pcm_config 的 sample_rate 只能是 8000 "opus_config": { "bitrate": 48000,   // 码率 "use_cbr": false,     // 是否使用 cbr 编码 "frame_size_ms": 60,   // 帧长(单位ms) "limit_config": { "period": 1,   // 周期(单位 s) "max_frame_num": 17 // 周期内返回最大 opus 帧数量 } }, "speech_rate": 0,  // 回复的语速,取值范围 [-50, 100],默认为 0,-50 表示 0.5 倍速,100 表示 2倍速 "voice_id": "7426720361733046281"   // 音色id,你可以通过查看音色列表 API 获取可用的音色,具体请参见https://www.coze.cn/open/docs/developer_guides/list_voices},"turn_detection": {"type": "server_vad"},"event_subscriptions": ["error","input_audio_buffer.speech_started","input_audio_buffer.speech_stopped","conversation.audio.delta","conversation.chat.failed"]} 
}
步骤三:开启录音

通过 input_audio_buffer.append 事件持续发送音频给扣子,事件的详细说明请参见流式上传音频片段。

如果上行是 PCM 编码的音频,每次发送 10ms ~ 20ms 的音频数据给扣子,例如每间隔 20ms,发送 20ms 的音频数据,对应字节数 = 采样率 * 位深/8 * 通道数 * 0.02。

如果上行是 OPUS 编码的音频,每次发送 20ms/40ms 帧长的 OPUS 音频数据是最优的选择。

步骤四:接收音频事件
  1. 收到扣子返回的 conversation.audio.delta 事件后,解析其中的 content 字段,进行 Base64 解码后获取二进制音频数据。事件说明请参见增量语音 。
  2. 将音频数据放入播放缓冲区队列,由单独的线程从缓冲区取音频数据进行播放。
步骤五:停止播放声音

设备端收到以下两个事件后,需要停止播放声音,并清空播放缓冲区:

  1. 收到扣子返回的 input_audio_buffer.speech_started 事件后,表示扣子服务端识别到用户正在说话。事件说明请参见用户开始说话。
  2. 收到扣子返回的 conversation.chat.canceled 事件后,表示扣子服务器打断了智能体说话。事件说明请参见智能体输出中断。
http://www.dtcms.com/a/269887.html

相关文章:

  • ReactNative【实战系列教程】我的小红书 4 -- 首页(含顶栏tab切换,横向滚动频道,频道编辑弹窗,瀑布流布局列表等)
  • 深入解读MCP:构建低延迟、高吞吐量通信中间件
  • Terraform `for_each` 精讲:优雅地自动化多域名证书验证
  • ELK日志分析
  • Spring Boot 项目中的多数据源配置
  • Go语言网络游戏服务器模块化编程
  • C++——从C到C++
  • Mybatis-plus 中 LambdaQueryWrapper和QueryWrapper 区别对比,及完整示例演示
  • 大型语言模型(LLM)的最新研究进展及相关新信息技术
  • 如何在 Android Framework层面控制高通(Qualcomm)芯片的 CPU 和 GPU。
  • 在Docker中安装nexus3(作为maven私服)
  • 使用Node.js搭建Web应用有哪些注意事项?
  • 中韩SD-WAN网络加速专线:提升国内与韩国公司网络性能的关键
  • 四十四、NoSQL、Redis
  • Docker、Git与虚拟机:技术原理与深度对比(更新版)
  • 【网络安全】恶意 Python 包“psslib”仿冒 passlib,可导致 Windows 系统关闭
  • 【王树森推荐系统】召回12:曝光过滤 Bloom Filter
  • Java面试基础:概念
  • FairyGUI 实现 Boss 双层血条动画
  • 3D 演示动画在汽车培训与教育领域中的应用
  • 从0开始学习R语言--Day41--Moran‘s I
  • 城乡社区服务体系建设-城乡商城:意义深远与前景广阔——仙盟创梦IDE
  • 把文件夹下所有的excle写入word文件中
  • 50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | StickyNavbar(粘性导航栏)
  • Qwen视觉模型本地化部署,实现识别图片:Qwen2___5-VL-7B-Instruct
  • 分布式光纤传感:为储能安全保驾护航
  • 2025年7月:打cs1.5 600元装机台式电脑方案A
  • 学习软件测试的第十二天(接口测试)
  • Spring Security架构与实战全解析
  • 人工智能-基础篇-24-RAG和LLM到底怎么理解和区分?(LLM是深度训练的大语言生成模型,RAG是LLM更智能的补充技术)