將第三方撥號程式與 Dynamics 365 交談智慧整合 (預覽版)
[本文章是發行前版本文件,隨時可能變更。]
Dynamics 365 使用者可以透過這種整合,使用第三方電話公司 (例如 Twilio Flex) 提供的撥號程式在 Dynamics 365 中撥打和接聽通話,並取得 AI 產生的即時見解和豐富的通話後分析。 深入了解 Dynamics 365 交談智慧
重要
- 這是預覽功能。
- 預覽功能不供生產時使用,而且可能功能受限。 這些功能應受補充使用規定規範,並且是在正式發行前先行推出,讓客戶可以搶先體驗並提供意見反應。
整合的運作方式
大致上,整合由三個部分組成:
註冊提供者:註冊提供者詳細資料,並使用交談智慧 API 取得要錄音的使用者清單。
派生媒體:使用 SIPREC 通訊協定將音訊串流派生至談話智慧錄音機。
傳送即時事件:若要啟用即時謄寫和通話見解體驗,請將 UI 事件從提供者的用戶端 UI 傳送至 Dynamics 365 交談智慧。
如需 Dynamics 365 交談智慧與第三方電話語音提供者 (Twilio Flex) 之間的範例整合,請參閱將 Twilio Flex 與 Dynamics 365 交談智慧整合。
下圖顯示此整合的運作方式:
步驟 1:註冊提供者
新增媒體錄製的 API 權限:
在您建立的 Microsoft Entra ID 應用程式中,移至 API 權限。
選取新增權限。
在我的組織使用的 API 底下,搜尋 Dynamics 365 Sales 的媒體錄製並加以選取:
新增 Users.Read.All 權限,並選取新增權限
注意
請務必取得管理員同意,讓權限可以在應用程式內容中呼叫交談智慧 API。 深入了解權限和同意。
取得權杖,以使用上一節中建立的應用程式來執行交談智慧 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
參數指定交談智慧應用程式的應用程式識別碼。 不要變更此值。如需 curl 命令的詳細資訊,請參閱取得服務主體的 Microsoft Entra ID 權杖。
呼叫下列交談智慧 API 來註冊第三方服務提供者:
POST /api/v1.0/providers/tenants
在要求本文中指定下列參數:
orgID:指定 Dynamics 365 組織識別碼。
Type:指定第三方撥號程式的「自訂」。
hosting:指定電話語音提供者的代管類型。 例如,「雲端」或「內部部署」。
AccountId:指定電話語音提供者的帳戶識別碼。
CerfificateSubjectName 和 CertificateIssuer:指定電話語音提供者的憑證詳細資料。
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 通訊協定。
通訊是使用 SIP (連接埠 5061) 和 SRTP 通訊協定來保護。 驗證是在 SIPS 訊息連接中使用 mTLS 來完成,並且是根據提供給 API 的憑證而定,這意味著必須註冊租用戶的提供者才能建立 SIPS 連接。
下列螢幕擷取畫面顯示 SIPREC 用戶端與 SIPREC 伺服器之間的通訊:
交談智慧需要下列中繼資料:
標頭:
標頭名稱 | 描述 | 值範例 |
---|---|---|
通話識別碼 | 通話的唯一識別碼。 此識別碼用於將 SIP 訊號與使用者動作 (例如開始/停止錄製) 相互關聯。 | efxxxxxxxxxxxxx |
X-AccountId | 通話所屬帳戶的唯一識別碼。 此識別碼用於驗證和授權。 這與租用戶在 API 中註冊的帳戶識別碼相同。 | ACxxxxxxxxxxxxxxxxxxxxxxx |
中繼資料
中繼資料金鑰名稱 | 描述 | 值範例 |
---|---|---|
角色 | 指示這是賣家的撥入通話還是撥出通話。 | ["撥入", "撥出"] |
CallerDisplayName | 來電者顯示名稱。 如果沒有提供,則會顯示電話號碼。 | Kenny Smith |
CalleeDisplayName | 受話者的顯示名稱。 如果沒有提供,則會顯示電話號碼。 | Alex Baker |
以下是邀請和再見訊息的範例,其中包含所需的標頭和中繼資料:
邀請訊息:
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。
端點 | 地區 |
---|---|
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 | 美國 |
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:傳送即時事件 (撥號程式的用戶端整合)
若要讓交談智慧提供即時謄寫和深入解析,第三方撥號程式可以使用兩個事件,在通話開始或結束時發出通知。
通話開始事件:交談智慧收到「通話開始」事件時,它會顯示錄音按鈕以及即時謄寫和深入解析。
通話結束事件:交談智慧收到「通話結束」事件時,它會結束通話,並顯示完整摘要按鈕,以取得 AI 產生的通話摘要和深入解析。
若要傳送事件,請使用 Dynamics 365 管道整合架構 (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 事件時,您會有選項可用於開始錄音:
選取錄製後,您可以在通話期間看到即時謄寫,並在通話結束時看到完整摘要和通話見解。