了解 Amazon Chime SDK PSTN 音频服务的端到端呼叫 - Amazon Chime SDK

了解 Amazon Chime SDK PSTN 音频服务的端到端呼叫

此使用案例提供示例代码,用于接听 PSTN 呼叫者的电话、用音频消息向呼叫者打招呼、从呼叫者那里获取会议 PIN 码、播放音频以及让呼叫者加入会议。

调用事件和操作

音频服务将调用事件作为 JSON 对象传递给 AWS Lambda 函数。这些对象包括调用事件类型和任何相关的元数据。AWS Lambda 函数还以 JSON 对象的形式返回 SIP 媒体应用程序操作,这些对象包括操作类型和任何相关的元数据。

下表列出了您收到调用事件时的调用事件以及可能的 ActionData.Type

调用事件 ActionData.Type

ACTION_SUCCESSFUL

CallAndBridge

ReceiveDigits

PlayAudio

PlayAudioAndGetDigits

JoinChimeMeeting

ModifyChimeMeetingAttendees

RecordMeeting

ACTION_FAILED

CallAndBridge

PlayAudio

PlayAudioAndGetDigits

ModifyChimeMeetingAttendees

RecordMeeting

挂断

HangUp

DIGITS_RECEIVED

ReceiveDigits
注意

要实现以下使用案例,您需要在您的 Amazon Chime SDK 库存中至少有一个电话号码、一个使用带 Amazon Resource Name (ARN) 的 AWS Lambda 函数的 SIP 媒体应用程序托管对象,以及一个使用电话号码作为触发器的 SIP 规则。

当 Amazon Chime SDK 接到规则中指定的电话号码的呼叫时,PSTN 音频服务会通过 NEW_INBOUND_CALL 调用事件类型调用 AWS Lambda 函数。

{ "SchemaVersion": "1.0", "Sequence": 1, "InvocationEventType": "NEW_INBOUND_CALL", "CallDetails": { "TransactionId": "transaction-id", "AwsAccountId": "aws-account-id", "AwsRegion": "us-east-1", "SipRuleId": "sip-rule-id", "SipApplicationId": "sip-application-id", "Participants": [ { "CallId": "call-id-1", "ParticipantTag": "LEG-A", "To": "+11234567890", "From": "+19876543210", "Direction": "Inbound", "StartTimeInMilliseconds": "159700958834234", "Status": "Connected" } ] } }

您可以对 AWS Lambda 函数进行编程以验证呼叫详细信息并将其存储以备将来使用。对于 NEW_INBOUND_CALL 事件,AWS Lambda 函数会以一组操作进行响应,这些操作会播放欢迎提示并要求提供会议 PIN 码。

音频文件具有以下要求:

  • 您必须播放 Amazon Simple Storage Service (S3) 存储桶中的音频文件。S3 存储桶必须与 SIP 媒体应用程序处于同一 AWS 账户。此外,您必须向 Amazon Chime SDK 语音连接器服务主体 voiceconnector.chime.amazonaws.com 授予 s3:GetObject 权限。您可以使用 S3 控制台或命令行界面 (CLI) 完成此操作。

  • 您必须使用大小不超过 50 MB 的 PCM WAV 文件。Amazon Chime SDK 推荐 8kHz 单声道。

  • 每个 WAV 文件的 S3 元数据必须包含 {'ContentType': 'audio/wav'}

{ "SchemaVersion": "1.0", "Actions": [ { "Type" : "PlayAudio", "Parameters" : { "CallId": "call-id-1", "AudioSource": { "Type": "S3", "BucketName": "chime-meetings-audio-files-bucket-name", "Key": "welcome-to-meetings.wav" } } }, { "Type": "PlayAudioAndGetDigits", "Parameters" : { "ParticipantTag": "LEG-A", "AudioSource": { "Type": "S3", "BucketName": "chime-meetings-audio-files-bucket-name", "Key": "enter-meeting-pin.wav" }, "FailureAudioSource": { "Type": "S3", "BucketName": "chime-meetings-audio-files-bucket-name", "Key": "invalid-meeting-pin.wav" }, "MinNumberOfDigits": 3, "MaxNumberOfDigits": 5, "TerminatorDigits": ["#"], "InBetweenDigitsDurationInMilliseconds": 5000, "Repeat": 3, "RepeatDurationInMilliseconds": 10000 } } ] }

SIP 媒体应用程序在调用分支 A 上运行这些操作。假设 PlayAudioAndGetDigits 操作收到数字,则 SIP 媒体应用程序将使用 ACTION_SUCCESSFUL 事件类型调用 AWS Lambda 函数。

{ "SchemaVersion": "1.0", "Sequence": 2, "InvocationEventType": "ACTION_SUCCESSFUL", "ActionData": { "Type": "PlayAudioAndGetDigits", "Parameters" : { "ParticipantTag": "LEG-A", "AudioSource": { "Type": "S3", "BucketName": "chime-meetings-audio-files-bucket-name", "Key": "enter-meeting-pin.wav" }, "FailureAudioSource": { "Type": "S3", "BucketName": "chime-meetings-audio-files-bucket-name", "Key": "invalid-meeting-pin.wav" }, "MinNumberOfDigits": 3, "MaxNumberOfDigits": 5, "TerminatorDigits": ["#"], "InBetweenDigitsDurationInMilliseconds": 5000, "Repeat": 3, "RepeatDurationInMilliseconds": 10000 }, "ReceivedDigits": "12345" // meeting PIN }, "CallDetails": { ... // same as in previous event } } }

您可以对 AWS Lambda 函数进行编程,以根据 CallDetails 数据识别呼叫者。您也可以验证之前收到的会议 PIN。假设 PIN 正确,您可以使用 CreateMeetingCreateAttendee API 创建 Amazon Chime SDK 会议并生成与会者使用的加入令牌。AWS Lambda 函数以加入 Amazon Chime SDK 会议的操作作为响应。

{ "SchemaVersion": "1.0", "Actions": [ { "Type": "JoinChimeMeeting", "Parameters": { "JoinToken": "meeting-attendee-join-token" } } ] }

假设 JoinToken 有效,则 SIP 媒体应用程序将加入 Amazon Chime SDK 会议并使用 ACTION_SUCCESSFUL 事件调用 AWS Lambda 函数,其中 CallDetails 包含来自 SIP 媒体应用程序和 Chime 媒体服务 (LEG-B) 的数据

{ "SchemaVersion": "1.0", "Sequence": 3, "InvocationEventType": "ACTION_SUCCESSFUL", "ActionData": { "Type" : "JoinChimeMeeting", "Parameters" : { "JoinToken": "meeting-attendee-join-token" } }, "CallDetails": { "TransactionId": "transaction-id", "AwsAccountId": "aws-account-id", "AwsRegion": "us-east-1", "SipRuleId": "sip-rule-id", "SipApplicationId": "sip-application-id", "Participants": [ { "CallId": "call-id-1", "ParticipantTag": "LEG-A", "To": "+11234567890", "From": "+19876543210", "Direction": "Inbound", "StartTimeInMilliseconds": "159700958834234", "Status": "Connected" }, { "CallId": "call-id-2", "ParticipantTag": "LEG-B", "To": "SMA", "From": "+17035550122", "Direction": "Outbound", "StartTimeInMilliseconds": "159700958834234", "Status": "Connected" } ] } }

如果您想在此时停止在调用或调用分支上运行操作,则可以使用一组空操作进行响应。

{ "SchemaVersion": "1.0" "Actions": [] }

呼叫者挂断后,SIP 媒体应用程序使用 HANGUP 事件调用 AWS Lambda 函数。

{ "SchemaVersion": "1.0", "Sequence": 4, "InvocationEventType": "HANGUP", "ActionData": { "Type": "Hangup", "Parameters": { "CallId": "call-id-1", "ParticipantTag": "LEG-A" } }, "CallDetails": { "TransactionId": "transaction-id", "AwsAccountId": "aws-account-id", "AwsRegion": "us-east-1", "SipRuleId": "sip-rule-id", "SipApplicationId": "sip-application-id", "Participants": [ { "CallId": "call-id-1", "ParticipantTag": "LEG-A", "To": "+11234567890", "From": "+19876543210", "Direction": "Inbound", "StartTimeInMilliseconds": "159700958834234", "Status": "Disconnected" }, { "CallId": "call-id-2", "ParticipantTag": "LEG-B", "To": "SMA", "From": "+17035550122", "Direction": "Outbound", "StartTimeInMilliseconds": "159700958834234", "Status": "Disconnected" } ] } }

如果您使用操作来响应 Hangup 事件,若没有其他 Participants 显示 ConnectedStatus,则 SIP 媒体应用程序将忽略该操作。