经典案例

如何构建智能互动语音响应IVR呼叫路由系统 商业生产力

如何构建智能互动语音响应IVR呼叫路由系统 商业生产力

构建智能互动语音应答IVR呼叫路由系统的指南

关键要点

互动语音应答IVR系统允许来电者通过电话与各种业务系统进行交互。通过Amazon Chime SDK PSTN音频服务结合Amazon Lex,可以构建智能路由的IVR。本文将讲解创建一个简单IVR的步骤,并智能路由呼叫。

许多企业运营互动语音应答IVR系统,使来电者能够通过电话与不同的业务系统互动。IVR通过向来电者提供提示,并允许他们使用自己的声音或通过双音多频DTMF输入进行响应。IVR广泛应用于自动化、自助服务场景,以减少对人工互动的依赖。若你曾拨打电话查询银行账户余额、支付账单或获取最近订单的状态,很大可能你已经与IVR交互过。

另一个常见的IVR用例是,允许来电者被路由到不同电话系统或联络中心的目的地例如:“与客服代表交谈”。Amazon Chime SDK PSTN音频服务与Amazon Lex集成,使开发者能够创建无服务器的应用程序,为公共交换电话网络PSTN的来电或外呼提供对话接口。该服务支持将呼叫桥接到PSTN电话号码和会话发起协议SIP中继,通过Amazon Chime语音连接器。在这篇博客中,我们将向你展示如何利用这些功能创建一个使用Amazon Lex的简单IVR,能够智能路由多个电话系统之间的呼叫。

使用Amazon Chime SDK PSTN音频进行呼叫路由

解决方案概述

Amazon Chime SDK PSTN音频服务与AWS Lambda函数结合,提供可编程的电话功能。在本演示中,我们将使用Amazon Lex的自然语言处理NLP来理解来电者的请求并做出路由决策。还可以使用其他条件,如时间、拨号号码、被叫号码或DTMF输入。AWS Lambda函数可以访问像Amazon DynamoDB这样的外部数据源,以帮助做出路由决定。

智能IVR系统利用人工智能进行呼叫路由,而不需要客户服务代表。在以下架构中,Amazon Lex利用自然语言处理来理解语音命令,然后将来电者路由到正确的目的地。Amazon Chime SDK PSTN音频服务与Amazon Lex集成,使开发者能够创建无服务器的应用程序,为公共交换电话网络PSTN的呼叫提供对话接口。

前提条件

在开始之前,您需要具备以下前提条件:

Node JS v12 和 npm 已安装yarn 已安装AWS命令行界面AWS CLI已经安装拥有适当权限的AWS账户有关Amazon Chime SDK电话号码的AWS服务配额

该演示还假设您对Amazon Chime SDK PSTN音频服务和Amazon Lex有中等了解。作为入门,我们建议您完成AWS工作坊:使用Amazon Chime SDK PSTN音频服务构建电话应用。有关如何使用本演示中使用的Amazon Lex的背景信息和术语以及特性的详细说明,请参见 Amazon Lex 如何运作。

演示步骤

本文引用的示例代码将部署一个功能性IVR演示,您可以配置为将呼叫路由到公共交换电话网络PSTN号码或直接到Amazon Chime SDK语音连接器。该路由决定将基于从Amazon Lex机器人传递到Amazon Chime SDK SIP媒体应用的信息。该演示的高层包括两个组件:

组件描述Webbased SIP客户端本地部署的SIP客户端,用于接听来电后端资源包括AWS Lambda函数、Amazon Chime Voice Connectors、Amazon DynamoDB表、Amazon S3存储桶、Amazon Lex机器人等

部署后端资源

克隆演示库并运行yarn launch进行部署:

bashgit clone https//githubcom/awssamples/amazonchimepstnaudiowithamazonlexivrcd amazonchimepstnaudiowithamazonlexivryarn launch

部署AWS Cloud Development Kit (CDK)后,将为您提供一个美国电话号码作为输出:

OutputsChimeLexIVRpstnPhoneNumber = 1NPANXXXXXX

部署Webbased SIP客户端

切换到站点目录,并在本地启动SIP客户端:

bashcd siteyarnyarn run start

这将启动一个可以在 http//localhost8080 访问的本地服务器注意: 部署此演示并接收从此文中创建的演示产生的流量可能会产生AWS费用。完成后请确保去除未使用的组件以避免额外费用。

工作原理

使用Amazon Chime SDK PSTN音频预加载会话信息到Amazon Lex机器人

当拨打电话号码ChimeLexIVRpstnPhoneNumber时,它将被送往Amazon Chime SDK PSTN音频SIP媒体应用。当SIP媒体应用应答时,我们将预加载信息到Amazon Lex会话中,然后使用startBotConversation动作将呼叫连接到Amazon Lex机器人。

如何构建智能互动语音响应IVR呼叫路由系统 商业生产力

javascriptasync function startSessions(event) { const putSessionCommandParams = { botAliasId lexBotAliasId botId lexBotId localeId enUS sessionId eventCallDetailsParticipants[0]CallId sessionState { SessionAttributes { phoneNumber eventCallDetailsParticipants[0]From } intent { name RouteCall } dialogAction { type ElicitSlot slotToElicit Department } } } try { consolelog(JSONstringify(putSessionCommandParams null 3)) await lexClientsend(new PutSessionCommand(putSessionCommandParams)) return true } catch (err) { consolelog(Error {err}) }}

当Amazon Chime SDK PSTN音频SIP媒体应用开始Lex机器人会话时,将使用呼叫者的CallId作为Lex机器人的sessionId。我们将利用这个参数在实际对话开始时填充要使用的槽。在此情况下,我们将使用putSession告知Lex机器人在呼叫者加入对话时请求特定的slot在特定的intent上。这将允许我们立即从呼叫者捕获部门名称。

javascriptexportshandler = async (event context callback) =gt{ consolelog(Lambda is invoked with calldetails JSONstringify(event)) let actions switch (eventInvocationEventType) { case NEWINBOUNDCALL consolelog(NEW INBOUND CALL) await startSessions(event) speakActionParametersCallId = eventCallDetailsParticipants[0]CallId startBotConversationActionParametersConfigurationSessionStateSessionAttributesphoneNumber = eventCallDetailsParticipants[0]From actions = [speakAction startBotConversationAction] break

Amazon Lex机器人处理

在演示中构建的Amazon Lex机器人包含两个意图:

由于我们使用putSession来请求RouteCall意图中的Department槽,我们将利用该槽并查找其中的值。

加速器永久免费版加速器

一旦Amazon Lex机器人捕获了槽,我们需要验证所说的部门是否为有效部门。为此,一个可选的代码挂钩用于执行验证。此代码挂钩是一个与Amazon Lex机器人相关联的AWS Lambda函数,将在每次对话中执行。

槽验证

槽捕获后,使用与Amazon Lex机器人关联的AWS Lambda 函数进行验证。

pythondef RouteCall(intentrequest) sessionattributes = getsessionattributes(intentrequest) slots = getslots(intentrequest) department = getslot(intentrequest Department) querydepartment = getdepartment(department) if querydepartment print(querying department) text = Connecting you to department department message = {contentType PlainText content text} fulfillmentstate = Fulfilled return close(sessionattributes RouteCall fulfillmentstate message) else if failurecount in sessionattributes print(fFailure Count {sessionattributes[failurecount]}) if int(sessionattributes[failurecount]) gt= 2 text = Sorry I couldnt find that department Let me connect you to an operator message = {contentType PlainText content text} fulfillmentstate = Fulfilled return close(sessionattributes RouteCall fulfillmentstate message) else sessionattributes[failurecount] = int(sessionattributes[failurecount]) 1 tryex(lambda slotspop(Department)) text = Sorry I couldnt find that department Can you try again message = {contentType PlainText content text} return elicitslot(sessionattributes intentrequest[sessionState][intent][name]slotsDepartmentmessage) else sessionattributes[failurecount] = 1 tryex(lambda slotspop(Department)) text = Sorry I couldnt find that department Can you try again message = {contentType PlainText content text} return elicitslot(sessionattributes intentrequest[sessionState][intent][name]slotsDepartmentmessage)

此AWS Lambda函数将从槽中获取所说的部门,并将其与存储在Amazon DynamoDB表中的部门名称进行比较,该表已经预填充了示例部门名称作为CDK的一部分进行部署。Amazon Lex代码挂钩函数将被调用,携带一个将被解析的JSON事件。若无法在槽中找到department,将记录并跟踪失败,使用Amazon Lex机器人的会话属性。失败将导致槽的重试。当failurecount超过2时,将默认路由关闭呼叫。

json{ sessionState { sessionAttributes {} activeContexts [] intent { slots { Department { shape Scalar value { originalValue history resolvedValues [history] interpretedValue history } } } confirmationState None name RouteCall state InProgress } originatingRequestId 7be9976e50df4e079d99670445c55102 }}

department将在此处设置为interpretatedValue。在这种情况下,department将为history。然后该值将被查询到Amazon DynamoDB表中,以查看是否是有效部门。

pythondef getdepartment(departmentname) try response = dynamodbclientgetitem( Key={ departmentname { S str(departmentname) } } TableName=departmenttable ) if Item in response return True else return False except Exception as err loggererror(DynamoDB Query error failed to fetch data from table Error excinfo=err) return None

当history在Amazon DynamoDB表中查询时返回True,这将导致AWS Lambda函数返回以下内容给Lex机器人:

json{ messages [ { contentType PlainText content Connecting you to history department } ] sessionState { dialogAction { type Close } sessionAttributes {} intent { name RouteCall state Fulfilled } }}

这个JSON将告知Amazon Lex机器人意图已经完成,应关闭并播放“正在连接您到历史部门”的消息。

返回SIP媒体应用程序

一旦在Amazon Lex机器人中关闭了RouteCall意图,信息将返回到Amazon Chime SDK SIP媒体应用程序,并且与之关联的AWS Lambda函数将根据InvocationEventType ACTIONSUCCESSFUL进行调用,并标识为类型 StartBotConversation,表明Amazon Lex处理成功完成。

与Amazon Chime SDK SIP媒体应用程序关联的AWS Lambda函数接着将使用接收到的信息来决定如何路由呼叫:

javascriptcase ACTIONSUCCESSFULconsolelog(ACTION SUCCESSFUL)switch (eventActionDataType) { case StartBotConversation consolelog(StartBotConversation Success) const callerIdNumber = eventCallDetailsParticipants[0]From let lexDepartment let route = {} if (Department in eventActionDataIntentResultSessionStateIntentSlots ) { lexDepartment = eventActionDataIntentResultSessionStateIntentSlotsDepartmentValueInterpretedValue route = await getRoute(lexDepartment) consolelog(Route from DynamoDB {route}) consolelog(lexDepartment from event {lexDepartment}) } else { lexDepartment = Unknown routeservice = voiceConnector routenumber = 000000 } switch (routeservice) { case voiceConnector consolelog(Using Amazon Chime Voice Connector Routing) vcCallAndBridgeActionParametersCallerIdNumber = callerIdNumber vcCallAndBridgeActionParametersSipHeaders[XLexInfo] = lexDepartment vcCallAndBridgeActionParametersEndpoints[0]Uri = routenumber actions = [vcCallAndBridgeAction] break case pstnNumber consolelog(Using PSTN Routing) pstnCallAndBridgeActionParametersCallerIdNumber = callerIdNumber pstnCallAndBridgeActionParametersEndpoints[0]Uri = routenumber actions = [pstnCallAndBridgeAction] break default break } break

当SIP媒体应用程序确定ACTIONSUCCESSFUL指的是StartBotConversation,AWS Lambda函数将从事件中提取lexDepartment如果存在。

jsonSessionState { SessionAttributes {} Intent { Name RouteCall Slots { Department { Value { OriginalValue history InterpretedValue history ResolvedValues [history] } Values [] } } State Fulfilled ConfirmationState None }}

它将查询与部门关联的Amazon DynamoDB表,以确定应使用哪个服务来路由呼叫以及在拨打此呼叫时使用哪个号码作为URI。在上述表示例中,所有呼叫将被路由到Amazon Chime语音连接器。

使用CallAndBridgeAction连接到语音连接器

vcCallAndBridgeAction和pstnCallAndBridgeAction

  1. 使用私有中心管理 Amazon SageMaker JumpStart 基础模型访问 机器学习博客 使用私有中心管理 Amazon SageMaker JumpStart 基础模型访问 机器学习博客

    管理 Amazon SageMaker JumpStart 基础模型访问权限关键要点Amazon SageMaker JumpStart 是一个提供预训练模型和解决方案的机器学习中心。私有中心 让组织能够集中管理模型和笔记本,提升可发现性和重用性。企业管理员可以通过私有中心配置模型的细粒度访问控制。...

  1. 无缝集成数据湖和数据仓库,使用 Amazon Redshift Spectrum 和 Amazon 无缝集成数据湖和数据仓库,使用 Amazon Redshift Spectrum 和 Amazon

    高效整合数据湖与数据仓库:使用Amazon Redshift Spectrum与Amazon DataZone作者:Lakshmi Nair与Srividya Parthasarathy,发布于2024年8月15日,原文链接关键要点解决孤立信息带来的挑战,通过数据网格框架实现数据共享和治理。利用Am...