Dynamics 365 대화 인텔리전스와 타사 다이얼러 통합(프리뷰)

[이 문서는 시험판 문서이며 변경될 수 있습니다.]

이 통합을 통해 Dynamics 365 사용자는 Twilio Flex와 같은 타사 전화 통신 회사에서 제공하는 다이얼러를 사용하여 Dynamics 365에서 전화를 걸고 받을 수 있으며 통화에 대한 실시간 AI 생성 인사이트 및 풍부한 통화 후 분석을 얻을 수 있습니다. Dynamics 365 대화 인텔리전스에 대해 자세히 알아보기

중요

  • 이는 프리뷰 기능입니다.
  • 프리뷰 기능은 생산용으로 만들어진 것이 아니므로 기능이 제한될 수 있습니다. 이런 기능은 공식 릴리스 전에 사용할 수 있으므로 고객이 조기에 액세스하고 피드백을 제공할 수 있습니다.

통합 작동 방식

높은 수준에서 통합은 세 부분으로 구성됩니다.

  1. 공급자 등록: 대화 인텔리전스 API를 사용하여 공급자 세부 정보를 등록하고 기록할 사용자 목록을 가져옵니다.

  2. 미디어 분기: SIPREC 프로토콜을 사용하여 오디오 스트림을 대화 인텔리전스 레코더로 분기합니다.

  3. 실시간 이벤트 보내기: 제공자의 클라이언트 UI에서 Dynamics 365 대화 인텔리전스로 UI 이벤트를 보내 실시간 전사 및 통화 인사이트 경험을 활성화합니다.

Dynamics 365 대화 인텔리전스와 타사 전화 통신 공급자인 Twilio Flex 간의 통합 예는 Twilio Flex와 Dynamics 365 대화 인텔리전스 통합을 참조하세요

다음 다이어그램은 통합이 어떻게 작동하는지 보여줍니다.

통합 흐름을 나타내는 다이어그램

1단계: 공급자 등록

  1. Microsoft Entra ID 애플리케이션 만들기.

  2. 미디어 녹음/녹화를 위한 API 권한 추가:

    1. 생성한 Microsoft Entra ID 애플리케이션에서 API 권한으로 이동합니다.

    2. 권한 추가를 선택합니다.

    3. 사용자의 조직에서 사용하는 API에서 Dynamics 365 Sales용 미디어 녹음/녹화를 검색하고 선택: 미디어 녹음/녹화 옵션의 스크린샷

    4. Users.Read.All 권한을 추가하고 권한 추가를 선택

    노트

    앱 컨텍스트에서 대화 인텔리전스 API를 호출할 수 있는 권한에 대해 관리자 동의를 얻어야 합니다. 권한 및 동의에 대해 자세히 알아보기.

  3. 이전 섹션에서 만든 앱을 사용하여 대화 인텔리전스 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=f448d7e5-e313-4f90-a3eb-5dbb3277e4b3/.default' -d 'client_secret=<your app secret>'

    scope 매개 변수는 대화 인텔리전스 앱의 애플리케이션 ID를 지정합니다. 이 값을 변경하지 마십시오.

    curl 명령에 대한 자세한 내용은 서비스 주체에 대한 Microsoft Entra ID 토큰 가져오기를 참조하십시오.

  4. 다음 대화 인텔리전스 API를 호출하여 타사 서비스 공급자를 등록합니다.
    POST /api/v1.0/providers/tenants

    요청 본문에 다음 매개 변수를 지정합니다.

    • orgID: Dynamics 365 조직 ID를 지정합니다.

    • 유형: 타사 다이얼러에 대해 "사용자 지정"을 지정합니다.

    • 호스팅: 전화 통신 공급자의 호스팅 유형을 지정합니다. 예: "클라우드" 또는 "온-프레미스".

    • AccountId: 전화 통신 공급자의 계정 ID를 지정합니다.

    • 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 설명서를 참조하십시오.

    <<편집자 주: 매개 변수에 대한 정보와 매개 변수를 가져올 수 있는 위치가 필요합니다. 또한 Swagger 설명서의 요청 본문은 위와 다릅니다.>>

  5. 다음 대화 인텔리전스 API를 호출하여 기록할 사용자 목록을 가져옵니다.
    GET /api/v1.0/providers/users

Dynamics 365 Sales 관리자가 녹음/녹화 정책을 만든 후 공급자는 이 엔드포인트를 사용하여 대화 인텔리전스 레코더로 분기될 미디어를 필터링할 수 있습니다.

2단계: 미디어 분기(SIPREC 통합)

대화 인텔리전스 레코더는 표준 SIPREC 프로토콜을 구현합니다.

통신은 SIPS(포트 5061) 및 SRTP 프로토콜을 사용하여 보호됩니다. 인증은 SIPS 메시지 연결에서 mTLS를 사용하여 수행되며 API에 제공된 인증서를 기반으로 합니다. 즉, SIPS 연결을 설정하려면 테넌트에 대해 공급자를 등록해야 합니다.

다음 스크린샷은 SIPREC 클라이언트와 SIPREC 서버 간의 통신을 보여줍니다.

SIPREC 클라이언트와 SIPREC 서버 간의 샘플 통신 스크린샷.

대화 인텔리전스에는 다음 메타데이터가 필요합니다.

헤더:

헤더 이름 설명 예제 값
통화 ID 통화의 고유 식별자입니다. 이는 SIP 신호와 녹음/녹화 시작/중지와 같은 사용자 작업을 연관시키는 데 사용됩니다. efxxxxxxxxxxxxx
X-AccountId 통화가 속한 계정의 고유 식별자입니다. 인증 및 권한 부여에 사용됩니다. 이는 테넌트에 대해 API에 등록된 것과 동일한 계정 ID입니다. ACxxxxxxxxxxxxxxxxxxxxxxxx

메타데이터

메타데이터 키 이름 설명 예제 값
역할 판매자에 대한 인바운드 또는 아웃바운드 호출인지 여부를 나타냅니다. ["inbound", "outbound"]
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 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단계: 실시간 이벤트 보내기(다이얼러의 클라이언트 통합)

대화 인텔리전스가 실시간 대화 내용 기록 및 인사이트를 제공할 수 있도록 타사 다이얼러는 두 가지 이벤트를 사용하여 통화가 시작되거나 종료될 때 알릴 수 있습니다.

  • 통화 시작 이벤트: 대화 인텔리전스가 "통화 시작" 이벤트를 가져오면 녹음/녹화 버튼과 실시간 대화 내용 기록 및 인사이트가 표시됩니다.

  • 통화 종료 이벤트: 대화 인텔리전스가 "통화 종료" 이벤트를 가져오면 통화를 마무리하고 전체 요약 버튼을 표시하여 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 분기 및 클라이언트 다이얼러 이벤트를 설정한 후 새 공급자로 새 녹음 정책을 만들어 통합을 테스트할 수 있습니다.

  1. 영업 허브 앱에서 시스템 관리자로 로그인합니다.

  2. 영역 변경에서 Sales Insights 설정을 선택합니다.

  3. 전역 설정>대화 인텔리전스로 이동합니다. 통화 공급자 섹션에 등록한 타사 공급자가 표시됩니다.

  4. 새 공급자에 대한 녹음/녹화 정책을 만듭니다. 자세한 내용은 대화 인텔리전스를 위한 Microsoft Teams 설정을 참조하세요

다음 스크린샷은 Twilio에 대한 녹음/녹화 정책의 예입니다.

Twilio에 대한 녹음/녹화 정책 스크린샷

이제 선택한 보안 역할의 일부인 사용자를 호출합니다(이 예에서는 정책이 모든 보안 역할에 대해 활성화됨).

Dynamics 365가 다이얼러에서 callStarted 이벤트를 받으면 녹음/녹화를 시작하는 옵션이 있습니다.

통화 녹음/녹화 알림 스크린샷

녹음/녹화를 선택하면 통화 중에 실시간 대화 내용 기록을 볼 수 있고 통화가 끝나면 전체 요약 및 통화 인사이트를 볼 수 있습니다.

참조 항목

통화 요약 페이지 보기 및 이해