サードパーティのダイヤラーと Dynamics 365 の会話インテリジェンスを統合する (プレビュー)
[この記事はプレリリース ドキュメントであり、変更されることがあります。]
この統合により、Dynamics 365 ユーザーは、Twilio Flex などのサードパーティのテレフォニー企業が提供するダイヤラーを使用して、Dynamics 365 で電話をかけたり受けたりすることができ、AI が生成したリアルタイムの分析情報や、通話後の豊富な分析結果を取得できるようになります。 Dynamics 365 会話インテリジェンスの詳細情報
重要
- これはプレビュー機能です。
- プレビュー機能は運用環境での使用を想定しておらず、機能が制限されている可能性があります。 これらの機能は、お客様が一足先にアクセスして追加使用条件 の対象で、公式リリースの前に使用できるようになっています。
統合のしくみ
高いレベルでは、統合は次の 3 つの部分から構成されます:
プロバイダーの登録: プロバイダーの詳細を登録し、会話インテリジェンス API を使用して記録するユーザー リストを取得します。
メディアのフォーク: SIPREC プロトコルを使用して、音声ストリームを会話インテリジェンス レコーダーにフォークします。
リアルタイムイベントを送信: リアルタイムの文字起こしと通話分析エクスペリエンスを有効にするには、プロバイダーのクライアント UI から Dynamics 365 会話インテリジェンスに UI イベントを送信します。
Dynamics 365 会話インテリジェンスとサードパーティ テレフォニー プロバイダーである T wilio Flex との統合例については、Twilio Flex と Dynamics 365 会話インテリジェンスの統合 を参照してください。
次の図は、統合がどのように機能するかを示しています:
ステップ1: プロバイダーを登録する
メディア録画用の API 権限を追加します。
作成した Microsoft Entra ID 申請については、 API 権限 をご覧ください。
アクセス許可の追加 を選択します。
組織で使用している API で Dynamics 365 Sales のメディア コーディング を検索し、選択します:
Users.Read.All のアクセス許可を追加し、アクセス許可の追加 を選択します
注意
アプリのコンテキストで会話インテリジェンス API を呼び出せるようにするためには、必ず管理者の同意を得てください。 アクセス許可と同意について詳しく知る。
前のセクションで作成したアプリを使用して Conversation Intelligence API を実行するトークンを取得します:
curl -X POST -H 'Content-Type: application/x-www-form-urlencoded' https://login.microsoftonline.com/<tenant-id>/oauth2/v2.0/token -d 'client_id=<your app id>' -d 'grant_type=client_credentials' -d 'scope=00001111-aaaa-2222-bbbb-3333cccc4444/.default' -d 'client_secret=<your app secret>'
scope
のパラメーターは、会話インテリジェンス アプリのアプリケーション ID を指定します。 この値を変更しないでください。curl コマンドの詳細については、サービスプリンシパルの Microsoft Entra ID トークンを取得する を参照してください。
次の会話インテリジェンス API を呼び出して、サードパーティ サービス プロバイダーを登録します:
POST /api/v1.0/providers/tenants
要求本文に以下のパラメーターを指定する:
orgID: Dynamics 365 組織 ID を指定します。
タイプ: サードパーティのダイヤラーには「カスタム」を指定します。
ホスティング: テレフォニー プロバイダーのホスティング タイプを指定します。 たとえば、「クラウド」や「オンプレミスの」などです。
アカウント ID: テレフォニープロバイダーのアカウント ID を指定します。
証明書の件名と証明書の発行者: テレフォニー プロバイダーの証明書の詳細を指定します。
SourceIPNetwork: SIPREC クライアントの IP アドレスを指定します。 IP アドレスを制限しない場合は「0.0.0.0」を指定します。
次のスニペットは要求本文の例です:{ "orgId": "ad3dca46-962a-4895-9f85-d25f3828781f", "Type": "custom", "hosting": "cloud", "displayName": "Test Custom Provider", "AuthenticationDetails": { "AccountId":"adxxxxx-xxxx-xxxx-xxxx-xxxxxxxx", "CertificateSubjectName": "certSubject", "CertificateIssuer": "issuer", "SourceIPNetwork": "0.0.0.0" } }
API, の詳細については、Swagger のドキュメント を参照してください。
次の会話インテリジェンス API を呼び出して、記録するユーザーのリストを取得します:
GET /api/v1.0/providers/users
Dynamics 365 Sales 管理者が録音ポリシーを作成した後、プロバイダーはこの エンドポイント を使用して、会話インテリジェンス レコーダーにフォークされるメディアをフィルターできます。
ステップ 2: メディアをフォークする (SIPREC 統合)
会話インテリジェンスレコーダーは標準の SIPREC プロトコル を実装します。
通信は、SIPS (ポート 5061) および SRTP プロトコルを使用して保護されます。 認証は、SIPS メッセージ接続での mTLS を使用して行われ、API に提供される証明書に基づいています。つまり、テナントが SIPS 接続を確立するには、プロバイダーを登録する必要があります。
次のスクリーンショットは、SIPREC クライアントと SIPREC サーバー間の通信を示しています:
会話インテリジェンスには次のメタデータが必要です:
ヘッダー:
ヘッダー名 | 内容 | 値の例 |
---|---|---|
通話-ID | 通話の一意識別子です。 この ID は、SIP 信号と録音の開始/停止などのユーザー アクションを関連付けるために使用されます。 | efxxxxxxxxxxxxx |
X-AccountId | 呼び出しが属するアカウントの一意の識別子です。 この ID は認証と承認に使用されます。 これは、テナントの API に登録されているアカウント ID と同じです。 | ACxxxxxxxxxxxxxxxxxxxxxxx |
Metadata
メタデータのキー名 | 内容 | 値の例 |
---|---|---|
役割 | 販売者にとって着信コールか発信コールかを示します。 | ["inbound"、"outbound"] |
CallerDisplayName | 呼び出し者の表示名です。 利用できない場合は電話番号が表示されます。 | ケニー スミス |
CalleeDisplayName | 受信者の表示名です。 利用できない場合は電話番号が表示されます。 | アレックス ベイカー |
必要なヘッダーとメタデータを含む招待メッセージとバイバイ メッセージの例を次に示します:
招待状メッセージ:
INVITE sip:SRS@media.recording.dynamics.com:5061;transport=tls SIP/2.0
Via: SIP/2.0/TLS 84.172.x.x:5061;branch=z9hG4bK4fa2.cdabfe83d76d3c41987802096d3b342a.0;received=172.16.x.x;rport=40334
Via: SIP/2.0/UDP 172.25.x.x:5060;rport=5060;branch=z9hG4bK917ce574-0345-4c3d-9b63-d98c2c57dbe6_c3356d0b_599-10236398515455707148
To: <sip:SRS@media.recording.dynamics.com:5061;transport=tls>
From: <sip:SRC@sip.provider.com>;tag=66790678_c3356d0b_917ce574-0345-4c3d-9b63-d98c2c57dbe6
Call-ID: efab0870bc597cb3fb56010921e2f57f
CSeq: 1 INVITE
Contact: <sip:SRC@172.25.x.x:5060;transport=udp>;+sip.src
Max-Forwards: 67
Record-Route: <sip:84.172.x.x:5061;transport=tls;r2=on;lr>,<sip:84.172.x.x;r2=on;lr>
User-Agent: provider Gateway
Allow: INVITE,ACK,CANCEL,OPTIONS,BYE,REFER,NOTIFY
Require: siprec
Content-Length: 3194
Content-Type: multipart/mixed;boundary=\"----=_Part_1253_283419664.1674116473425\"
Min-SE: 35
X-AccountId: ACxxxxxxxxxxxxxxxxxxxx
------=_Part_1253_283419664.1674116473425
Content-Type: application/sdp
v=0
o=root 1176539620 1176539620 IN IP4 172.18.x.x
s=provider Media Gateway
c=IN IP4 84.172.x.x
t=0 0
m=audio 15352 RTP/SAVP 0 8 101
a=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:<Encryption_key>
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-16
a=ptime:20
a=maxptime:20
a=sendonly
a=label:inbound
m=audio 16022 RTP/SAVP 0 8 101
a=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:<Encryption_key>
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-16
a=ptime:20
a=maxptime:20
a=sendonly
a=label:outbound
------=_Part_1253_283419664.1674116473425
Content-Type: application/rs-metadata+xml
Content-Disposition: recording-session
<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<recording xmlns='urn:ietf:params:xml:ns:recording:1'>
<datamode>complete</datamode>
<session session_id=\"Wd/putWgTWCW2z1lI5Db9w==\">
<ExtensionParameters xmlns=\"http://provider.com/siprec\">
<Parameter name=\"Role\" value=\"inbound\"/>
<Parameter name=\"CallerDisplayName\" value=\"Kiana Anderson\"/>
<Parameter name=\"CalleeDisplayName\" value=\"Tomas Richardson\"/>
</ExtensionParameters>
</session>
<participant participant_id=\"bXCloPcETS6P/kfeeJtiow==\">
<nameID aor=\"EE5C7EF0\"/>
</participant>
<participant participant_id=\"3nPi8XzBSzWrtSLlkU8Gjw==\">
<nameID aor=\"230908\"/>
</participant>
<stream stream_id=\"9xff8FcdRUaJCSTxWFbV9g==\" session_id=\"Wd/putWgTWCW2z1lI5Db9w==\"><label>inbound</label></stream>
<stream stream_id=\"f/Qezx4jTMqiWSB1vW7oJA==\" session_id=\"Wd/putWgTWCW2z1lI5Db9w==\"><label>outbound</label></stream>
<sessionrecordingassoc session_id=\"Wd/putWgTWCW2z1lI5Db9w==\">
<associate-time>2023-01-19T08:21:13.382512Z</associate-time>
</sessionrecordingassoc>
<participantsessionassoc participant_id=\"bXCloPcETS6P/kfeeJtiow==\" session_id=\"Wd/putWgTWCW2z1lI5Db9w==\">
<associate-time>2023-01-19T08:21:13.382512Z</associate-time>
</participantsessionassoc>
<participantsessionassoc participant_id=\"3nPi8XzBSzWrtSLlkU8Gjw==\" session_id=\"Wd/putWgTWCW2z1lI5Db9w==\">
<associate-time>2023-01-19T08:21:13.382512Z</associate-time>
</participantsessionassoc>
<participantstreamassoc participant_id=\"bXCloPcETS6P/kfeeJtiow==\">
<send>9xff8FcdRUaJCSTxWFbV9g==</send>
<recv>f/Qezx4jTMqiWSB1vW7oJA==</recv>
</participantstreamassoc>
<participantstreamassoc participant_id=\"3nPi8XzBSzWrtSLlkU8Gjw==\">
<send>f/Qezx4jTMqiWSB1vW7oJA==</send>
<recv>9xff8FcdRUaJCSTxWFbV9g==</recv>
</participantstreamassoc>
</recording>
------=_Part_1253_283419664.1674116473425--
お別れのメッセージ:
BYE sip:SRS@media.recording.dynamics.com:5061;transport=tls SIP/2.0
Via: SIP/2.0/TLS 84.172.x.x:5061;branch=z9hG4bK1fa2.d03c36b567136fcfae84281e926cda62.0;received=172.16.x.x;rport=40334
Via: SIP/2.0/UDP 172.25.x.x:5060;rport=5060;received=84.144.x.x;branch=z9hG4bK917ce574-0345-4c3d-9b63-d98c2c57dbe6_c3356d0b_600-2513288074170844985
To: <sip:SRS@media.recording.dynamics.com:5061;transport=tls>;tag=OXFWHPJQTL
From: <sip:SRC@sip.provider.com>;tag=66790678_c3356d0b_917ce574-0345-4c3d-9b63-d98c2c57dbe6
Call-ID: efab0870bc597cb3fb56010921e2f57f
CSeq: 2 BYE
Max-Forwards: 68
User-Agent: provider Gateway
Require: siprec
Content-Length: 901
Content-Type: multipart/mixed;boundary=\"----=_Part_29418_1017575873.1674116842924\"
X-AccountId: ACxxxxxxxxxxxxx
サポートされているレコーダーのエンドポイントとリージョン
次の表に、サポートされているレコーダー エンドポイントとそのリージョンを示します。 テレフォニー プロバイダーの設定で、使用するレコーダーを構成できます。 Twilio Flex でこれがどのように行われるかについては、ステップ 2: SIPREC コネクタをインストールし、通話を Dynamics 365 にルーティングする を参照してください。
エンドポイント | Region |
---|---|
media.recording.dynamics.com | グローバル (最も近い地域) |
southeastasia.media.recording.dynamics.com | 東南アジア |
australiaeast.media.recording.dynamics.com | オーストラリア |
sam.media.recording.dynamics.com | 南アフリカ |
canadacentral.media.recording.dynamics.com | カナダ |
switzerlandnorth.media.recording.dynamics.com | スイス |
eastus.media.recording.dynamics.com | US |
francecentral.media.recording.dynamics.com | フランス |
centralindia.media.recording.dynamics.com | インド |
japaneast.media.recording.dynamics.com | 日本 |
uae.media.recording.dynamics.com | UAE |
uksouth.media.recording.dynamics.com | 英国 |
westeurope.media.recording.dynamics.com | 西ヨーロッパ |
zaf.media.recording.dynamics.com | 南アフリカ |
ステップ 3: リアルタイム イベントの送信 (ダイヤラのクライアント統合)
会話インテリジェンスがリアルタイムの文字起こしと洞察を提供できるようにするために、サードパーティ ダイヤラーは 2 つのイベントを使用して、通話の開始または終了を通知できます。
通話開始イベント: 会話インテリジェンスが「通話開始」イベントを取得すると、録音ボタン、リアルタイムの文字起こしと分析情報が表示されます。
通話終了イベント: 会話インテリジェンスが「通話終了」イベントを取得すると、通話を終了し、AIが生成した通話の要約と洞察を得るために 完全な概要 ボタンを表示します。
イベントを送信するには、Dynamics 365 Channel Integration Framework (CIF) の raiseEvent API を使用します。
イベントを送信するサンプル コード スニペットを次に示します:
export interface CallStartedEvent {
callId: string;
startTime: Date;
isIncomingCall: boolean;
contactNumber: string;
contactName: string;
}
export interface CallEndedEvent {
callId: string;
callDurationInSeconds: number;
callTerminationReason: string; // ['success', 'error']
callEndTime: Date;
isCallStarted: boolean;
}
dialer.Actions.addListener('onCallStarted', (payload: any) => {
const callStartedEvent : CallStartedEvent = {
callId: payload.call_sid,
startTime: new Date(),
isIncomingCall: payload.attributes.is_incoming_call,
contactName: payload.attributes.caller_name,
contactNumber: payload.attributes.caller_phone_number
};
// @ts-ignore
Microsoft.CIFramework.raiseEvent('WIDGET_CALL_STARTED', callStartedEvent);
});
dialer.Actions.addListener('onCallEnded', (payload: any) => {
const callEndedEvent : CallEndedEvent = {
callId: payload.call_sid,
callEndTime: new Date(),
callTerminationReason: 'success',
isCallStarted: true,
callDurationInSeconds: payload.attributes.call_length
};
// @ts-ignore
Microsoft.CIFramework.raiseEvent('WIDGET_CALL_ENDED', callEndedEvent);
});
統合のテスト
新しいプロバイダーをテナントに登録し、SIPRECフ ォークとクライアント ダイヤラー イベントを設定した後、新しいプロバイダーで新しい録音ポリシーを作成することで統合をテストできます。
営業ハブ アプリでシステム管理者としてログインします。
変更領域で、Sales Insights 設定 を選択します。
グローバル設定>会話インテリジェンス に移動します。 通話プロバイダー セクションに、登録したサードパーティ プロバイダーが表示されます。
新しいプロバイダーの録音ポリシーを作成します。 詳細情報: 会話インテリジェンス用 Microsoft Teams を設定する
次のスクリーンショットは、Twilio の録音ポリシーの例です。
ここで、選択した セキュリティ ロール に属するユーザーを呼び出します (この例では、ポリシーはすべてのセキュリティ ロールに対して有効になっています)。
Dynamics 365 がダイヤラーから callStarted イベントを受信すると、録音を開始するオプションが表示されます:
録音 を選択すると、通話中にリアルタイムの文字起こしが表示され、通話終了時に完全な概要と通話の分析情報が表示されます。