IBM Cloud Docs
处理电话交互

处理电话交互

如果助手使用电话集成,那么可以使用各种响应类型来定制集成的行为或管理助手通过电话与客户进行的对话流。

您可以使用响应类型来执行以下特定于电话的操作:

在某些情况下,您可能希望组合响应类型以执行多个操作。 例如,您可能希望通过请求电话小键盘条目并从同一操作步骤发送文本消息来实现双因子认证。 有关更多信息,请参阅 定义电话命令序列

您还可以执行以下特定于手机的操作:

有关更多信息,请参阅 响应类型参考

向助手添加特定于电话的响应

要从操作步骤启动特定于语音的交互,请在 generic 数组中添加具有相应响应类型的响应。 有关使用 JSON 编辑器添加响应的更多信息,请参阅 使用 JSON 编辑器定义响应

将高级设置应用于 Speech to Text 服务

使用 speech_to_text 响应类型将配置命令发送到电话集成所使用的 Speech to Text 服务实例。 通过从操作步骤发送 speech_to_text 响应,您可以在对话期间动态更改 Speech to Text 配置。

缺省情况下,您对其余对话进行的任何 Speech to Text 配置更改都会持久存储,或者直到您再次更新这些更改为止。 您可以通过指定 parameters 对象的 update_strategy 属性来更改此行为。

speech_to_text 响应类型的格式如下所示:

{
  "generic": [
    {
      "response_type": "speech_to_text",
      "command_info": {
        "type": "<command type>",
        "parameters": {
          "parameter name1": "parameter value",
          "parameter name2": "parameter value"
        }
      }
    }
  ]
}

以下部分描述了每种命令类型及其相关参数。

command_info.type : configure

通过应用一组可基于对话流的配置参数,动态重新配置 Speech to Text 服务。 例如,您可能希望在对话中的特定点选择特定定制标识或语法。

参数 描述 必需 缺省
narrowband_recognize 要用于窄带编码解码器 (例如 PCMU 和 PCMA,采样率为 8 kHz) 的 Speech to Text 服务配置。 当连接到语音识别请求的 Speech to Text 服务时,将使用此对象的参数。 有关这些参数的更多信息,请参阅 Speech to Text API 文档 当前 Speech to Text 配置
broadband_recognize 要用于宽带编码解码器 (例如 G722,采样率为 8 kHz) 的 Speech to Text 服务配置。 当连接到语音识别请求的 Speech to Text 服务时,将使用此对象的参数。 有关这些参数的更多信息,请参阅 Speech to Text API 文档 当前 Speech to Text 配置
band_preference 指定在协商会话的音频编解码器时首选哪个音频带 (narrowbandbroadband)。 设置为 broadband 会尽可能使用宽带音频。 narrowband
update_strategy

指定设置语音配置时使用的更新策略。 可能的值包括:

  • replace: 替换会话其余部分的配置。 新配置中的任何根级别字段都将完全覆盖先前配置。
  • replace_once: 仅在下一轮对话中替换配置。 然后,使用先前的配置。
  • merge: 将新配置与会话其余部分的现有配置合并。 仅覆盖已更改的参数; 任何其他配置参数保持不变。
  • merge_once: 仅在下一轮对话中将新配置与现有配置合并。 然后,将使用先前的配置。
replace

可以为 narrowband_recognizebroadband_recognize 设置的参数反映 Speech to Text WebSocket 接口提供的参数。 WebSocket API 发送两种类型的参数: 查询参数 (在电话集成连接到服务时发送) 和消息参数 (作为请求主体中 JSON 数据的一部分发送)。 例如,model 是查询参数,smart_formatting 是 WebSocket 消息参数。 有关参数的完整列表,请参阅 Speech to Text API 文档

您可以为电话集成与 Speech to Text 服务的连接定义以下查询参数。 您为 narrowbandbroadband 定义的任何其他参数都将作为 WebSocket 消息请求的一部分传递。

  • model
  • acoustic_customization_id
  • version
  • x-watson-learning-opt-out
  • base_model_version
  • language_customization_id

无法修改 Speech to Text 服务中的以下参数,因为它们具有电话集成所使用的固定值。

  • action
  • content-type
  • interim_results
  • continuous
  • inactivity_timeout

使用 configure 命令从 watsonx Assistant 动态配置时,仅会更新根级别字段,例如 narrowbandbroadband。 如果从命令中省略这些字段,那么原始配置设置将持久存储。 您可以使用 update_strategymergemerge_once 将配置参数与现有配置合并。

使用定制语言模型

设置电话集成后,可以将该集成配置为始终使用定制语言模型。

但是,您可能希望绝大部分时间使用标准语言模型,而指定的定制语言模型仅用于助手设计为帮助客户的特定主题。 例如,您可能希望使用一个专门针对医疗术语的自定义模型,用于仅帮助处理医疗账单的操作。 您可以对对话的特定分支应用定制语言模型。

有关更多信息,请参阅 创建定制语言模型

要将定制语言模型应用于操作步骤,请使用 speech_to_text 响应类型。

{
  "generic": [
    {
      "response_type": "speech_to_text",
      "command_info": {
        "type": "configure",
        "parameters": {
          "narrowband_recognize": {
            "x-watson-learning-opt-out": true,
            "model": "en-US_NarrowbandModel",
            "profanity_filter": true,
            "smart_formatting": true,
            "language_customization_id": "81d3630-ba58-11e7-aa4b-41bcd3f6f24d",
            "acoustic_customization_id": "e4766090-ba51-11e7-be33-99bd3ac8fa93"
          }
        }
      }
    }
  ]
}

您还可以应用声学模型,您可以训练该模型来处理背景噪音、重音或其他与信号质量或噪音相关的问题。

使用定制语法

Speech to Text 服务支持语法的使用。 您可以使用语法将音频配置为仅与特定特征匹配。

  • 定制语言模型用于扩展服务的基本词汇表。
  • 语法用于限制服务可以从该词汇表中识别的词。

将语法与定制语言模型一起用于语音识别时,服务可以仅识别语法识别到的词、短语和字符串。 例如,您可能只想接受 yesno 的回复。 为此,可以定义仅允许这些选项的语法。

有关更多信息,请参阅 将语法用于定制语言模型

此示例显示如何在对话期间指定定制语法:

{
  "generic": [
    {
      "response_type": "speech_to_text",
      "command_info": {
        "type": "configure",
        "parameters": {
          "update_strategy": "merge_once",
          "narrowband_recognize": {
            "x-watson-learning-opt-out": true,
            "grammar_name": "names-abnf",
            "language_customization_id": "81d3630-ba58-11e7-aa4b-41bcd3f6f24d"
          }
        }
      }
    }
  ]
}

示例

以下示例说明如何使用 speech_to_text 响应类型将配置命令发送到 Speech to Text 服务。

示例: 设置语言模型

在此示例中,语言模型切换为西班牙语 (es-ES_NarrowbandModel),并启用智能格式化。


{
  "generic": [
    {
      "response_type": "speech_to_text",
      "command_info": {
        "type": "configure",
        "parameters": {
          "narrowband_recognize": {
            "model": "es-ES_NarrowbandModel",
            "smart_formatting": true
          }
        }
      }
    }
  ]
}

示例: 更新一个对话轮次的 recognizeBody 属性

以下示例显示如何指定将定制语言模型用于对话轮次的单个轮次。 将 update_strategy 设置为 merge_once,并在配置参数中指定定制语言模型的标识。

{
  "generic": [
    {
      "response_type": "speech_to_text",
      "command_info": {
        "type": "configure",
        "parameters": {
          "update_strategy": "merge_once",
          "narrowband_recognize": {
            "language_customization_id": "ao45vohgFuxyOQRgztu-02I10ut7aJcM-AdInT-VWgj3V"
          }
        }
      }
    }
  ]
}

将高级设置应用于 Text to Speech 服务

使用 text_to_speech 响应类型将配置命令发送到电话集成所使用的 Text to Speech 服务实例。 通过从操作步骤发送 text_to_speech 响应,可以在对话期间动态更改 Text to Speech 配置。

缺省情况下,您对对话的其余部分进行的任何 Text to Speech 配置更改都会持久存储,或者直到您再次更新这些更改为止。 您可以通过指定 parameters 对象的 update_strategy 属性来更改此行为。

speech_to_text 响应类型的格式如下所示:


{
  "generic": [
    {
      "response_type": "text_to_speech",
      "command_info": {
        "type": "<command type>",
        "parameters": {
          "parameter name": "parameter value",
          "parameter name": "parameter value"
        }
      }
    }
  ]
}

以下部分描述了每种命令类型及其相关参数。

command_info.type : configure

通过应用一组可基于对话流的配置参数,动态重新配置 Text to Speech 服务。 例如,您可能希望在对话中的特定点选择特定声音。

参数 描述 必需 缺省
synthesize 要在合成音频时使用的 Text to Speech 服务配置。 当连接到语音合成请求的 Text to Speech 服务时,将使用此对象定义的参数。 有关这些参数的更多信息,请参阅 Text to Speech API 文档 当前 Text to Speech 配置
update_strategy

指定设置语音配置时使用的更新策略。 可能的值包括:

  • replace: 替换会话其余部分的配置。 新配置中的任何根级别字段都将完全覆盖先前配置。
  • replace_once: 仅在下一轮对话中替换配置。 然后,使用先前的配置。
  • merge: 将新配置与会话其余部分的现有配置合并。 仅覆盖已更改的参数; 任何其他配置参数保持不变。
  • merge_once: 仅在下一轮对话中将新配置与现有配置合并。 然后,将使用先前的配置。
replace

可以为 synthesize 设置的参数反映 Text to Speech WebSocket 接口提供的参数。 WebSocket API 发送两种类型的参数: 查询参数 (在电话集成连接到服务时发送) 和消息参数 (作为请求主体中 JSON 数据的一部分发送)。 有关参数的完整列表,请参阅 Text to Speech API 文档

command_info.type : disable_barge_in

禁用语音打断,以便在回放音频时,当呼叫者说话时不会中断回放。

无参数。

command_info.type : enable_barge_in

启用语音闯入功能,这样来电者就可以通过说话中断播放。

无参数。

更改助手的声音

当对话中涉及到某些有必要的话题时,您可以改变助理的语音。 例如,您可能希望将带有英国口音的语音用于仅适用于英国客户的对话分支。

此示例显示如何在对话期间指定语音:


{
  "generic": [
    {
      "response_type": "text_to_speech",
      "command_info": {
        "type": "configure",
        "parameters": {
          "synthesize": {
            "voice": "en-GB_KateV3Voice"
          }
        }
      }
    }
  ]
}

voice 参数中,指定要使用的语音模型。 有关语音模式选项的更多信息,请参阅 支持的语言和语音

您指定的模型必须是 Text to Speech 服务实例支持的模型,该服务实例已配置用于集成。

将呼叫转移给在线客服

配置电话集成时,可以选择设置备份呼叫中心支持,这使得助手可以将呼叫转接到人员。 您可以在操作步骤中使用 连接到代理程序 响应类型,以在对话中的特定点启动到实时代理程序的传输。 将 连接到代理 响应发送到电话集成时,将使用 SIP REFER 消息启动 SIP 传输,如 RFC 5589所定义。

有关在对话期间启动到实时代理的传输的更多信息,请参阅以下文档:

电话集成支持 Connect to agent 响应类型的更多参数。 您可以使用 JSON 编辑器将这些特定于电话的参数添加到 connect_to_agent 响应类型。

connect_to_agent 响应类型支持在 transfer_info 参数下指定目标传输信息。

以下示例显示了使用所有可配置参数的传输:

{
  "generic": [
    {
      "response_type": "connect_to_agent",
      "transfer_info": {
        "target": {
          "service_desk": {
            "sip": {
              "uri": "sip:user\\@domain.com",
              "transfer_headers": [
                {
                  "name": "Customer-Header1",
                  "value": "Some-Custom-Info"
                },
                {
                  "name": "User-to-User",
                  "value": "XXXXXX"
                }
              ],
              "transfer_headers_send_method": "refer_to_header"
            }
          }
        }
      },
      "agent_available": {
        "message": "I'll transfer you to an agent"
      },
      "agent_unavailable": {
        "message": "Sorry, I could not find an agent."
      },
      "message_to_human_agent": "The caller needs help resetting their password"
    }
  ]
}

connect_to_agent 响应类型支持以下特定于电话的属性。

参数 缺省值 描述
service_desk.sip.uri 不适用 要转接呼叫的 SIP 或电话 URI,如 sip:12345556789\@myhost.comtel:+18883334444。 对于 hangup 方法是可选的。
service_desk.sip.transfer_method refer

确定如何传输呼叫:

  • refer: 通过发送 SIP REFER 请求 (缺省值) 来传输呼叫。
  • hangup: 通过发送 SIP BYE 请求来传输呼叫。
service_desk.sip.transfer_target_header Transfer-Target BYE 请求用于传输呼叫时,包含传输目标的 SIP 头。 此选项仅在 hangup 方法中受支持。
service_desk.sip.transfer_headers 不适用 要添加到传输请求中的自定义头信息字段名值对列表。
service_desk.sip.transfer_headers_send_method custom_header

用于发送 SIP 传输头的方法。

  • custom_header: 将传输头作为 SIP 消息的一部分发送,这是缺省值。
  • contact_header: 在 Contact 头中发送传输头。 此选项在 hangup 方法中不受支持。
  • refer_to_header: 在 Refer-To 头中发送传输头。 此选项在 hangup 方法中不受支持。

如果将 SIP URI 定义为转接目标,请通过在 URI 中的 @ 符号前面添加两个反斜杠 (\\) 以对此符号转义。 这将阻止将字符串识别为实体速记语法的一部分。

    "uri": "sip:12345556789\\@myhost.com"

挂断后传输

缺省情况下,电话集成通过使用 SIP REFER 请求来传输呼叫。 根据 IVR 服务提供者,您可能需要配置呼叫转移以改为使用 SIP BYE 请求。 使用 transfer_method 属性来指定如何使用 referhangup 来传输调用。 当 transfer_method 设置为 hangup 而不是 refer 时,传输操作的行为将发生更改。 电话集成不发送 SIP REFER 请求,而是回放任何关联文本,然后通过发送 SIP BYE 请求来挂起呼叫。

挂断后,电话集成会将 url 属性中指定的传输目标传递到 BYE 消息中的呼叫锚点。 包含传输目标的头字段由 transfer_target_header 属性确定。 如果未指定 transfer_target_header 属性,那么电话集成将使用 Transfer-Target

{
  "generic": [
    {
      "response_type": "connect_to_agent",
      "transfer_info": {
        "target": {
          "service_desk": {
            "sip": {
              "uri": "sip:user\\@domain.com",
              "transfer_method": "hangup",
              "transfer_target_header": "Transfer-Target"
            }
          }
        }
      },
      "agent_available": {
        "message": "Please hold on while I connect you with a live agent."
      },
      "agent_unavailable": {
        "message": "Sorry, I could not find an agent."
      },
      "message_to_human_agent": "The caller needs help resetting their password"
    }
  ]
}

失败时传输

要配置失败时的传输,请转至电话集成设置中的 高级 选项卡。 可以配置以下选项:

  • 传输失败消息

  • 在传输失败时断开连接调用

有关更多信息,请参阅 处理呼叫和传输失败

在 SIP 信令中传递 watsonx Assistant 元数据

为支持在呼叫者与 watsonx Assistant之间装入会话历史记录,电话集成指定 User-to-User 头的值作为可用于 Web 聊天集成的键。 如果在 transfer_headers 列表中指定了 User-to-User,那么将在 X-Watson-Assistant-Session-History-Key 头中发送会话历史记录密钥。

SIP 头的值限制为 1024 字节。

此数据在 SIP REFER 消息中的显示方式还取决于 transfer_headers_send_method 的值。

此示例显示了作为头包含的数据:

REFER sip:b@atlanta.example.com SIP/2.0
Via: SIP/2.0/UDP agenta.atlanta.example.com;branch=z9hG4bK2293940223
To: <sip:b@atlanta.example.com>
From: <sip:a@atlanta.example.com>;tag=193402342
Call-ID: 898234234@agenta.atlanta.example.com
CSeq: 23 REFER
Max-Forwards: 7
Refer-To: sip:user@domain.com
X-Watson-Assistant-Token: 8f817472-8c57-4117-850d-fdf4fd23ba7
User-to-User: 637573746f6d2d757365722d746f2d75736572;encoding=hex
Contact: sip:a@atlanta.example.com
Content-Length: 0

如果指定了定制 User-to-User 头,那么将在 X-Watson-Assistant-Session-History-Key 头中设置会话历史记录密钥:

REFER sip:b@atlanta.example.com SIP/2.0
Via: SIP/2.0/UDP agenta.atlanta.example.com;branch=z9hG4bK2293940223
To: <sip:b@atlanta.example.com>
From: <sip:a@atlanta.example.com>;tag=193402342
Call-ID: 898234234@agenta.atlanta.example.com
CSeq: 93809823 REFER
Max-Forwards: 70
Refer-To: sip:user@domain.com
User-to-User: 637573746f6d2d757365722d746f2d75736572;encoding=hex
X-Watson-Assistant-Session-History-Key: dev::latest::212033::0a64c30d-c558-4055-85ad-ef75ad6cc29d::978f1fd7-4e24-47d8-adb0-24a8a6eff69e::b5ffd6c2-902f-4658-b586-e3fc170a6cf3::7ad616a350cc48078f17e3ee3df551de
Contact: sip:a@atlanta.example.com
Content-Length: 0

此示例显示了作为查询参数 (由 SIP RFC 3261定义) 传递到 Refer-To 头的元数据。

REFER sip:b@atlanta.example.com SIP/2.0
Via: SIP/2.0/UDP agenta.atlanta.example.com;branch=z9hG4bK2293940223
To: <sip:b@atlanta.example.com>
From: <sip:a@atlanta.example.com>;tag=193402342
Call-ID: 898234234@agenta.atlanta.example.com
CSeq: 23 REFER
Max-Forwards: 70
Refer-To: sip:user@domain.com?User-to-User=637573746f6d2d757365722d746f2d75736572%3Bencoding%3Dhex
Contact: sip:a@atlanta.example.com
Content-Length: 0

如果指定了定制 User-to-User 头,那么会在 X-Watson-Assistant-Session-History-Key 头中设置会话历史记录密钥。

REFER sip:b@atlanta.example.com SIP/2.0
Via: SIP/2.0/UDP agenta.atlanta.example.com;branch=z9hG4bK2293940223
To: <sip:b@atlanta.example.com>
From: <sip:a@atlanta.example.com>;tag=193402342
Call-ID: 898234234@agenta.atlanta.example.com
CSeq: 93809823 REFER
Max-Forwards: 70
Refer-To: sip:user@domain.com?User-to-User=637573746f6d2d757365722d746f2d75736572%3Bencoding%3Dhex&X-Watson-Assistant-Session-History-Key=dev::latest::893499::dff9c274-adc4-4f63-93de-781166760bf8::978f1fd7-4e24-47d8-adb0-24a8a6eff69e::b5ffd6c2-902f-4658-b586-e3fc170a6cf3::7ad616a350cc48078f17e3ee3df551de
Contact: sip:a@atlanta.example.com
Content-Length: 0

对于 Twilio Flex,User-to-User 头使用 encoding=ascii。

播放等待音乐或录音

要播放保持音乐或录音信息,请使用 audio 响应类型。 有关响应类型的更多信息,请参阅 使用 JSON 编辑器定义响应

在呼叫转接期间无法播放等待音乐。 但是,如果助手需要时间执行某种处理,例如调用客户端操作或呼叫 webhook,则可能需要播放保持音乐。

电话集成支持 audio 响应类型的以下属性:

属性 描述
source 可公开访问的 .wav 音频文件的 URL。 音频文件必须是单声道(单声道)和 PCM 编码,采样率必须为 8,000 Hz,每个样本 16 比特。
channel_options.voice_telephony.loop 是否在音频回放完成后重复重新启动。 缺省值为 false

如果将 channel_options.voice_telephony.loop 设置为 true,请使用 vgwActForceNoInputTurn 命令添加用户定义的响应。 此命令指示电话集成使用 vgwNoInputTurn 文本启动轮次,而无需等待来自调用者的输入。 在 vgwNoInputTurn 轮中,可以在调用者处于暂挂状态时启动事务。 当 vgwNoInputTurn 轮次完成时,循环音频将停止。

以下示例显示了具有 loop=trueaudio 响应以及具有 vgwActForceNoInputTurn 命令的 user_defined 响应。

{   
  "generic": [
    {
      "response_type": "user_defined",
      "user_defined": {
        "vgwAction": {
          "command": "vgwActForceNoInputTurn"
        }
      }
    },
    {
      "response_type": "audio",
      "source": "https://upload.wikimedia.org/wikipedia/commons/d/d8/Random_composition3.wav",
      "channel_options": {
        "voice_telephony": {
          "loop": true
        }
      }
    }
  ]
}

启用小键盘输入

如果您希望客户能够通过在其电话小键盘上输入信息而不是通过讲话来发送信息,那么可以添加对电话小键盘输入的支持。 实现此类型支持的最佳方法是启用双音多频 (DTMF) 信号。 DTMF 是一种传输音调的协议,当用户按下按键电话上的按键时就会产生音调。 音调具有特定的频率和持续时间,可以通过电话网络进行解释。

要在用户按电话键时开始侦听音调,请在操作步骤中使用 dtmf 响应类型。 可以使用 JSON 编辑器添加此响应类型。

{
  "generic": [
    {
      "response_type": "dtmf",
      "command_info": {
        "type": "<command type>",
        "parameters": {
          "parameter name": "parameter value",
          "parameter name": "parameter value"
        }
      },
      "channels": [
        {
          "channel": "voice_telephony"
        }
      ]
    }
  ]
}

command_info 属性指定用于电话集成的 DTMF 命令。 受支持的命令及其相关参数如下所示。

command_info.type : collect

指示电话集成收集用户的双音多频信令 (DTMF) 输入。 此命令支持以下参数:

参数名 描述 必需 缺省
termination_key DTMF 终止键,表示 DTMF 输入结束(例如 # )。 不适用
count 要收集的 DTMF 位数,必须是不大于 100 的正整数。 需要 (如果未定义 termintation_keyminimum_countmaximum_count) 不适用
minimum_count 要收集的最小 DTMF 位数。 此属性与 maximum_count 一起用于定义要收集的位数的范围。 此值必须是最小值为 1 且最大值小于 maximum_count 的正整数。 如果未定义 terminatation_keycount,那么是必需的。 不适用
maximum_count 要收集的最大 DTMF 位数。 此属性与 minimum_count 一起用于定义要收集的位数的范围。 当收集到这一数字时,对话就开始了。 此值必须是不大于 100 的正整数。 如果未定义 termintation_keycount,那么是必需的。 不适用
inter_digit_timeout_count 收到 DTMF 数字后等待新 DTMF 数字的时间(毫秒)。 在活动 DTMF 收集期间,当接收到第一个 DTMF 收集时,将会激活此超时。 当数字间超时激活时,它将停用响应后超时定时器。 如果未指定 inter_digit_timeout_count 参数,那么响应后计时器会在每个 DTMF 数字后重置,并且会保持活动状态,直到满足响应后超时计数或收集完成为止。 此值是不超过 100,000 (或 100 秒) 的正整数。 不适用
ignore_speech 在收集 DTMF 数字期间是否禁用语音识别,直到收集完成或发生超时为止。 如果此参数为 true,那么当接收到第一个 DTMF 信号时,将自动禁用语音识别。
stop_after_collection DTMF 收集完成时是否停止 DTMF 输入。 在此命令之后,将忽略所有 DTMF 输入,直到使用 start 响应类型将其重新启用为止。

command_info.type : disable_barge_in

禁用 DTMF 干扰,这样当来电者按键时,电话集成的播放就不会中断。 如果启用了 disable_barge_in,那么将忽略回放期间按下的键。

该命令没有参数。

command_info.type : enable_barge_in

启用 DTMF 打断,以便呼叫者可以通过按键中断电话集成中的回放。

该命令没有参数。

command_info.type : send

通过电话集成发送 DTMF 信号。

此命令支持以下参数:

参数 描述 必需 缺省
digits JSON 对象的数组,其中每个元素表示要发送给调用者的 DTMF 音调。 不适用
digits[].code 要发送的事件代码。 除了数字 0 到 9 之外,还可以指定以下代码:
-10: *
-11: #
-12: A
-13: B
-14: C
-15: D
不适用
digits[].duration 事件的持续时间 (以毫秒为单位)。 200
digits[].volume 音调的电源级别,以 dBm0表示。 支持的范围是 0 到 -63 dBm0。 0
send_interval 在发送列表中的下一个 DTMF 音调之前要等待的时间间隔 (以毫秒为单位)。 200

示例

此示例显示了带有 collect 命令的 dtmf 响应类型,用于收集 DTMF 输入。

{
  "generic": [
    {
      "response_type": "dtmf",
      "command_info": {
        "type": "collect",
        "parameters": {
          "termination_key": "#",
          "count": 16,
          "ignore_speech": true
        }
      },
      "channels": [
        {
          "channel": "voice_telephony"
        }
      ]
    }
  ]
}

此示例显示了带有 send 命令的 dtmf 响应类型,用于发送 DTMF 信号。

{
  "generic": [
    {
      "response_type": "dtmf",
      "command_info": {
        "type": "send",
        "parameters": {
          "digits": [
            {
              "code": "9",
              "volume": -8
            },
            {
              "code": "11"
            }
          ],
          "send_interval": 100
        }
      },
      "channels": [
        {
          "channel": "voice_telephony"
        }
      ]
    }
  ]
}

将对话传输到 Web 聊天集成

您可以使用 channel_transfer 响应类型将呼叫者从当前电话呼叫传输到 Web 聊天 会话。

助手会向来电者发送一条短信,其中包括一个 URL,来电者可以点击该网址在手机浏览器中加载网络聊天小工具。 Web 聊天会话显示电话呼叫的历史记录,并可以启动收集完成事务所需的信息的过程。

这在以下情况下很有用: 客户可以更轻松地以书面方式提供信息,而不是通过讲话 (例如,更改地址) 提供信息。

在传输成功完成后,呼叫者可以挂断电话并使用 Web 聊天继续对话。

仅当还为助手配置了 SMS with Twilio 集成时,channel_transfer 响应类型才能用于电话集成。

{
  "generic": [
    {
      "response_type": "text",
      "values": [
        {
          "text": "I will send you a text message now with a link to our website."
        }
      ],
      "selection_policy": "sequential"
    },
    {
      "response_type": "channel_transfer",
      "message_to_user": "Click the link to connect with an agent using our website.",
      "transfer_info": {
        "target": {
          "chat": {
            "url": "https://example.com/webchat"
          }
        }
      }
    }
  ]
}

结束调用

您可以指示助手使用 end_session 响应类型来结束电话呼叫,如本示例中所示。

{
  "generic": [
    {
      "response_type": "end_session"
    }
  ]
}

您可以选择包含要与 SIP BYE 请求一起包含的定制头,该请求是在电话集成接收到此响应类型时生成的。

此示例显示具有定制 SIP 头的 end_session 响应类型:

{
  "generic": [
    {
      "response_type": "end_session",
      "channel_options": {
        "voice_telephony": {
          "sip": {
            "headers": [
              {
                "name": "Customer-Header1",
                "value": "Some-Custom-Info"
              },
              {
                "name": "User-to-User",
                "value": "XXXXXX"
              }
            ]
          }
        }
      }
    }
  ]
}

在电话交谈期间发送文本消息

在比通过转录语音输出更容易以书面方式准确通信的情况下,您可以在进行中的语音期间发送文本消息。 例如,地址或指示。

必须先设置 SMS 集成,然后才能在电话呼叫期间发送 SMS 消息。 更多信息,请参阅 SMS 集成

在对话期间与客户交换文本时,助手会启动 SMS 消息交换。 将向用户发送一条文本消息,并要求用户响应。

要从操作步骤发送特定消息,请将 user_defined 响应类型与 vgwActSendSMS 命令配合使用:

{
  "generic": [
    {
      "response_type": "text",
      "values": [
        {
          "text": "I will send you a text message now."
        }
      ],
      "selection_policy": "sequential"
    },
    {
      "response_type": "user_defined",
      "user_defined": {
        "vgwAction": {
          "command": "vgwActSendSMS",
          "parameters": {
            "message": "To send me your street address, respond to this text message with your address."
          }
        }
      }
    }
  ]
}

您可以在 parameters 对象中指定以下任何参数:

参数 类型 描述
消息 string 要发送的短信消息的文本。 必需。
mediaURL 列表 要将消息作为 MMS 附件发送的媒体文件的 URL 列表。 可选。
tenantPhoneNumber string 与租户相关联的电话号码。 号码格式必须与 SMS 提供商要求的格式一致。 如果未提供 tenantPhoneNumber 值,那么将使用来自活动呼叫的电话集成配置的租户标识。 可选。
userPhoneNumber string 要发送短信的电话号码。 号码格式必须与 SMS 提供商要求的格式一致。 如果未提供 userPhoneNumber 值,那么将使用来自入局 SIP INVITE 请求的 From 头的语音呼叫者电话号码。 可选。
setAsInputText 布尔型 是否从 input.text 中的用户发送短信消息。 如果指定 true,那么将在 input.text 中发送来自用户的短信消息。 否则,input.text 将设为 vgwSMSMessage,短信将作为集成变量和上下文变量发送。 可选。 缺省值:false。

如果 SMS 集成支持多个 SMS 电话号码,或者您正在使用不同于 SMS 提供程序的 SIP 中继,请确保指定要用于发送文本消息的电话号码。 否则,将使用调用的同一电话号码来发送文本。

助手收到短信消息后,将使用文本输入 vgwSMSMessage 启动新的对话轮次。 此输入指示已从调用者接收到消息。 客户消息的文本包含为 vgwSMSMessage 上下文变量和 sms_message 集成变量的值。

如果助手无法向呼叫者发送 SMS 消息,那么将使用文本输入 vgwSMSFailed 启动新轮次。 此输入指示无法向呼叫者发送 SMS 消息。 您可以通过创建由输入文本 vgwSMSFailed 触发的操作来设计助手以处理此类故障。

{
  "input": {
    "text": "vgwSMSMessage",
    "integrations": {
      "voice_telephony": {
        "sms_message": "230 Leigh Farm rd"
      }
    }
  },
  "context": {
    "skills": {
      "main skill": {
        "user_defined": {
          "vgwSMSMessage": "1545 Lexington Ave."
        }
      }
    }
  }
}

以下是当 setAsInputText 设置为 true 时的轮次请求示例:

{
  "input": {
    "text": "230 Leigh Farm rd",
    "integrations": {
      "voice_telephony": {
        "sms_message": "230 Leigh Farm rd"
      }
    }
  },
  "context": {
    "skills": {
      "main skill": {
        "user_defined": {
          "vgwSMSMessage": "1545 Lexington Ave."
        }
      }
    }
  }
}

定义电话命令序列

如果要连续运行多个命令,请在 generic 数组中包含多个响应。 这些命令按它们在数组中指定的顺序进行处理。

此示例显示两个响应: 第一,文本响应; 第二,用于结束调用的 end_session 响应。

{
  "generic": [
    {
      "response_type": "text",
      "values": [
        {
          "text": "Goodbye."
        }
      ],
      "selection_policy": "sequential"
    },
    {
      "response_type": "end_session"
    }
  ]
}

将定制值注入到 CDR 日志事件中

如果您正在使用日志 Webhook 来记录呼叫详细信息记录 (CDR) 事件,那么可以使用 cdr_custom_data 上下文变量向记录的事件添加定制数据。 您可以使用此方法在调用期间记录数据 (例如,指示特定任务的完成)。

要记录定制 CDR 数据,请使用 JSON 编辑器来编辑上下文。 将 cdr_custom_data 定义为 context.integrations.voice_telephony 对象的子代,如以下示例中所示:

  "context": {
    "integrations": {
      "voice_telephony": {
        "cdr_custom_data": {
          "key1": "value1",
          "key2": "value2"
        }
      }
    }
  }

cdr_custom_data 对象可以包含任何有效的 JSON 数据。

生成 CDR 报告时,定制数据将包含在 injected_custom_data 字段中,如以下示例中所示:

{
  "payload": {
  ...
    "injected_custom_data": {
      "key1": "value1",
      "key2": "value2"
    }
  ...
  }
}

有关 CDR 日志事件有效内容的结构的更多信息,请参阅 CDR 日志事件参考

合并和删除定制 CDR 数据

每次由操作定义 cdr_custom_data 对象时,都会将新数据与任何先前存在的数据合并。 为先前定义的属性指定的新值将覆盖先前的值,并且将添加任何新属性; 否则,先前定义的数据将保持不变。

要除去先前定义的属性,必须将其显式设置为空值,如以下示例中所示:

  "context": {
    "integrations": {
      "voice_telephony": {
        "cdr_custom_data": {
          "key1": ""
        }
      }
    }
  }

从操作中访问电话集成上下文变量

如果要访问电话集成上下文变量,请使用 JSON 编辑器来编辑上下文。

以下示例显示如何访问用户电话号码 (从其接收呼叫的电话号码):

  "context": {
    "variables": [
      {
        "value": {
          "expression": "${system_integrations.voice_telephony.private.user_phone_number}.replace('+','')"
        },
        "skill_variable": "user_phone_number"
      }
    ]
  }

有关更多信息,请参阅 Phone 集成上下文变量