แชร์ผ่าน


รวมโปรแกรมโทรออกของบริษัทอื่นเข้ากับระบบการสนทนาอัจฉริยะของ Dynamics 365 (พรีวิว)

[บทความนี้เป็นคู่มือรุ่นก่อนวางจำหน่าย และอาจจะมีการเปลี่ยนแปลงในอนาคต]

ด้วยการรวมนี้ ผู้ใช้ Dynamics 365 สามารถใช้โปรแกรมโทรออกที่ให้บริการโดยบริษัทโทรศัพท์บุคคลที่สาม เช่น Twilio Flex เพื่อโทรออกและรับสายใน Dynamics 365 และรับข้อมูลเชิงลึกที่สร้างโดย AI แบบเรียลไทม์และการวิเคราะห์หลังการโทรอย่างละเอียด เรียนรู้เพิ่มเติมเกี่ยวกับระบบการสนทนาอัจฉริยะของ Dynamics 365

สำคัญ

  • นี่คือคุณลักษณะพรีวิว
  • คุณลักษณะพรีวิวไม่ได้มีไว้สำหรับการนำไปใช้งานจริง และอาจมีการจำกัดฟังก์ชันการทำงาน คุณลักษณะเหล่านี้อยู่ภายใต้ ข้อกำหนดการใช้งานเพิ่มเติม และสามารถใช้ได้ก่อนการเผยแพร่อย่างเป็นทางการเพื่อให้ลูกค้าสามารถเข้าถึงล่วงหน้าและแสดงความคิดเห็น

วิธีที่การรวมทำงาน

ในระดับสูง การรวมประกอบด้วยสามส่วน:

  1. ลงทะเบียนผู้ให้บริการ: ลงทะเบียนรายละเอียดผู้ให้บริการและขอรับรายชื่อผู้ใช้ที่จะบันทึกโดยใช้ API ระบบการสนทนาอัจฉริยะ

  2. แยกสื่อ: แยกสตรีมเสียงไปยังโปรแกรมบันทึกของระบบการสนทนาอัจฉริยะโดยใช้โปรโตคอล SIPREC

  3. ส่งเหตุการณ์แบบเรียลไทม์: หากต้องการเปิดใช้งานการถอดความแบบเรียลไทม์และประสบการณ์ข้อมูลเชิงลึกการโทร ให้ส่งเหตุการณ์ UI จาก UI ไคลเอ็นต์ของผู้ให้บริการไปยังระบบการสนทนาอัจฉริยะของ Dynamics 365

สำหรับตัวอย่างการรวมระหว่างระบบการสนทนาอัจฉริยะของ 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 ระบุรหัสแอปพลิเคชันของแอประบบการสนทนาอัจฉริยะ อย่าเปลี่ยนค่านี้

    สำหรับข้อมูลเพิ่มเติมเกี่ยวกับคำสั่ง curl โปรดดู รับโทเค็น Microsoft Entra ID สำหรับบริการหลัก

  4. เรียก API ระบบการสนทนาอัจฉริยะต่อไปนี้เพื่อลงทะเบียนผู้ให้บริการบุคคลที่สาม:
    POST /api/v1.0/providers/tenants

    ระบุพารามิเตอร์ต่อไปนี้ในเนื้อความของคำขอ:

    • orgID: ระบุรหัสองค์กร Dynamics 365

    • Type: ระบุ "กำหนดเอง" สำหรับโปรแกรมโทรออกของบริษัทอื่น

    • hosting: ระบุชนิดการโฮสต์ของผู้ให้บริการระบบโทรศัพท์ ตัวอย่างเช่น "ระบบคลาวด์" หรือ "ในสถานที่"

    • AccountId: ระบุรหัสบัญชีของผู้ให้บริการระบบโทรศัพท์

    • CerfificateSubjectName และ CertificateIssuer: ระบุรายละเอียดใบรับรองของผู้ให้บริการระบบโทรศัพท์

    • SourceIPNetwork: ระบุที่อยู่ IP ของไคลเอ็นต์ SIPREC ระบุ "0.0.0.0" หากคุณไม่ต้องการจำกัดที่อยู่ IP
      ส่วนย่อยต่อไปนี้เป็นตัวอย่างเนื้อความของคำขอ:

      
      {
         "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

  5. เรียก API ระบบการสนทนาอัจฉริยะต่อไปนี้เพื่อรับรายชื่อผู้ใช้ที่จะบันทึก:
    GET /api/v1.0/providers/users

หลังจากที่ผู้ดูแลระบบ Dynamics 365 Sales สร้างนโยบายการบันทึก ผู้ให้บริการสามารถใช้ตำแหน่งข้อมูลนี้เพื่อกรองสื่อที่จะถูกแยกไปยังโปรแกรมบันทึกของระบบการสนทนาอัจฉริยะ

ขั้นตอนที่ 2: แยกสื่อ (การรวม SIPREC)

โปรแกรมบันทึกของระบบการสนทนาอัจฉริยะใช้ โปรโตคอล SIPREC มาตรฐาน

การสื่อสารมีการรักษาความปลอดภัยโดยใช้โปรโตคอล SIPS (พอร์ต 5061) และ SRTP การรับรองความถูกต้องเสร็จสิ้นโดยใช้ mTLS ในการเชื่อมต่อข้อความ SIPS และอิงตามใบรับรองที่มอบให้กับ API ซึ่งหมายความว่าผู้ให้บริการต้องลงทะเบียนสำหรับผู้เช่าเพื่อสร้างการเชื่อมต่อ SIPS

ภาพหน้าจอต่อไปนี้แสดงการสื่อสารระหว่างไคลเอ็นต์ SIPREC กับเซิร์ฟเวอร์ SIPREC:

ภาพหน้าจอของตัวอย่างการสื่อสารระหว่างไคลเอ็นต์ SIPREC กับเซิร์ฟเวอร์ SIPREC

เมตาดาต้าต่อไปนี้จำเป็นสำหรับระบบการสนทนาอัจฉริยะ:

ส่วนหัว:

ชื่อส่วนหัว คำอธิบาย ตัวอย่างค่า
Call-ID รหัสเฉพาะของผู้โทร รหัสนี้ใช้เพื่อเชื่อมโยงสัญญาณ SIP และการดำเนินการของผู้ใช้ เช่น การเริ่ม/หยุดการบันทึก efxxxxxxxxxxxxx
X-AccountId รหัสเฉพาะของบัญชีที่มีการโทร รหัสนี้ใช้สำหรับการรับรองความถูกต้องและการอนุญาต รหัสนี้เป็นรหัสบัญชีเดียวกันกับที่ลงทะเบียนใน API สำหรับผู้เช่า ACxxxxxxxxxxxxxxxxxxxxxxx

เมตาดาต้า

ชื่อคีย์เมตาดาต้า คำอธิบาย ตัวอย่างค่า
บทบาท ระบุว่าเป็นการโทรเข้าหรือโทรออกสำหรับผู้ขาย ["โทรเข้า", "โทรออก"]
CallerDisplayName ชื่อที่แสดงของผู้โทร หากไม่มี หมายเลขโทรศัพท์จะแสดงขึ้น Kenny Smith
CalleeDisplayName ชื่อที่แสดงของผู้รับ หากไม่มี หมายเลขโทรศัพท์จะแสดงขึ้น Alex Baker

ต่อไปนี้เป็นตัวอย่างข้อความเชิญและการลาที่มีส่วนหัวและเมตาดาต้าที่จำเป็น:

ข้อความ INVITE:

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:

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 และข้อมูลเชิงลึก

เมื่อต้องการส่งเหตุการณ์ ใช้ raiseEvent API ในเฟรมเวิร์กการรวมช่องทาง (CIF) ของ Dynamics 365

นี่คือตัวอย่างส่วนย่อยของโค้ดที่จะส่งเหตุการณ์:

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 จากโปรแกรมโทรออก คุณจะมีตัวเลือกเพื่อเริ่มการบันทึก:

ภาพหน้าจอของการแจ้งเตือนเพื่อบันทึกการโทร

หลังจากเลือก บันทึก คุณจะสามารถดูการถอดความแบบเรียลไทม์ระหว่างการโทรและสรุปข้อมูลทั้งหมดข้อมูลเชิงลึกการโทรเมื่อสิ้นสุดการโทร

ดูและทำความเข้าใจหน้าสรุปการโทร