Bagikan melalui


Tingkatkan Daya Interaksi Suara Anda: Mengintegrasikan Azure Communication Services dengan Agen Studio Microsoft Copilot

Dokumen ini menyediakan instruksi langkah demi langkah tentang cara membuat dan mengintegrasikan agen Copilot Studio dengan Azure Communication Services. Panduan ini akan memungkinkan Anda membuat agen berkemampuan suara yang dapat dipanggil pengguna Anda.

Unduh contoh

Temukan proyek untuk sampel ini di GitHub. Anda dapat mengunduh kode ini dan menjalankannya secara lokal untuk mencobanya sendiri.

Prasyarat

Sebelum memulai, pastikan Anda memiliki:

1. Buat Agen Anda di Copilot Studio

Setelah masuk atau mendaftar untuk Copilot Studio, Anda masuk ke halaman Beranda. Pilih Buat di navigasi kiri.

Cuplikan layar tentang cara membuat agen.

Pada halaman Buat, pilih Agen baru. Gunakan obrolan untuk menjelaskan agen Anda, menggunakan pertanyaan yang disediakan untuk panduan.
Setelah Anda memberikan semua informasi yang diminta, klik Buat.

Cuplikan layar Klik untuk membuat.

Untuk detail selengkapnya tentang membuat dan menyesuaikan agen, Anda dapat melihat panduan memulai cepat Copilot Studio.

2. Nonaktifkan Autentikasi

Setelah membuat agen, Anda perlu membuat beberapa pembaruan sehingga Anda dapat mengintegrasikannya dengan Azure Communication Service.

  • Navigasi ke tab Pengaturan .

Cuplikan layar cara Menavigasi ke tab pengaturan.

  • Klik Keamanan di panel kiri.

Cuplikan layar tab Keamanan.

  • Pilih Autentikasi, pilih Tanpa Autentikasi, dan klik Simpan.

Cuplikan layar langkah Autentikasi.

3. Dapatkan Kunci Keamanan Webchannel

Menavigasi kembali ke bagian Keamanan pilih Keamanan Saluran Web. Salin dan simpan kunci ini di suatu tempat. Anda memerlukan ini saat menyebarkan aplikasi Anda.

4. Aktifkan Agen

Setelah Anda memperbarui pengaturan agen dan menyimpan kunci agen, kini Anda dapat menerbitkan agen Anda.

5. Menyiapkan Kode

Sekarang setelah Anda membuat agen, pastikan untuk mengunduh sampel. Setelah mengunduh sampel, Anda harus memperbarui beberapa properti.

  • String koneksi Anda: Anda bisa mendapatkan string koneksi dari sumber daya Azure Communication Services Anda.
  • Kunci Microsoft Copilot Studio Direct Line: Yang Anda simpan di langkah 3, kunci keamanan webchannel Anda.
  • Titik akhir kustom Azure AI Services: Anda bisa mendapatkan titik akhir ini dari sumber daya Azure AI Services Anda.
  • Anda harus memiliki port yang berjalan untuk menerima pemberitahuan peristiwa dari Azure Communication Services. Anda dapat menggunakan alat seperti DevTunnels untuk membantu menyiapkannya.

6. Gambaran Umum Kode

Ada beberapa konsep dasar yang harus Anda kenal bahwa sampel menggunakan untuk membangun alur kerja ini.

Panggilan masuk

Daftarkan peristiwa panggilan masuk, sehingga aplikasi Anda tahu kapan panggilan masuk dan perlu dijawab.

Menjawab panggilan dengan transkripsi waktu nyata

Saat menjawab panggilan, Anda juga mengaktifkan streaming transkripsi waktu nyata, yang mengirimkan konten hasil konversi dari Ucapan ke Teks yang dikatakan pemanggil dalam waktu yang hampir nyata.

app.MapPost("/api/incomingCall", async (
    [FromBody] EventGridEvent[] eventGridEvents,
    ILogger<Program> logger) =>
{
    foreach (var eventGridEvent in eventGridEvents)
    {
        logger.LogInformation($"Incoming Call event received : {JsonConvert.SerializeObject(eventGridEvent)}");
        // Handle system events
        if (eventGridEvent.TryGetSystemEventData(out object eventData))
        {
            // Handle the subscription validation event.
            if (eventData is SubscriptionValidationEventData subscriptionValidationEventData)
            {
                var responseData = new SubscriptionValidationResponse
                {
                    ValidationResponse = subscriptionValidationEventData.ValidationCode
                };
                return Results.Ok(responseData);
            }
        }
        var jsonObject = JsonNode.Parse(eventGridEvent.Data).AsObject();
        var incomingCallContext = (string)jsonObject["incomingCallContext"];
        var callbackUri = new Uri(baseUri + $"/api/calls/{Guid.NewGuid()}");
        
        var answerCallOptions = new AnswerCallOptions(incomingCallContext, callbackUri)
        {
            CallIntelligenceOptions = new CallIntelligenceOptions()
            {
                CognitiveServicesEndpoint = new Uri(cognitiveServicesEndpoint)
            },
            TranscriptionOptions = new TranscriptionOptions(new Uri($"wss://{baseWssUri}/ws"), "en-US", true, TranscriptionTransport.Websocket)
            {
                EnableIntermediateResults = true
            }
        };

        try
        {
            AnswerCallResult answerCallResult = await client.AnswerCallAsync(answerCallOptions);

            var correlationId = answerCallResult?.CallConnectionProperties.CorrelationId;
            logger.LogInformation($"Correlation Id: {correlationId}");

            if (correlationId != null)
            {
                CallStore[correlationId] = new CallContext()
                {
                    CorrelationId = correlationId
                };
            }
        }
        catch (Exception ex)
        {
            logger.LogError($"Answer call exception : {ex.StackTrace}");
        }
    }
    return Results.Ok();
});

Membuat koneksi copilot

Setelah panggilan tersambung, aplikasi perlu membuat koneksi ke agen AI yang Anda buat menggunakan API Direct Line dengan websocket.

Memulai percakapan

var response = await httpClient.PostAsync("https://directline.botframework.com/v3/directline/conversations", null);
response.EnsureSuccessStatusCode();
var content = await response.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject(content);

Mendengarkan webscket

await webSocket.ConnectAsync(new Uri(streamUrl), cancellationToken);

var buffer = new byte[4096]; // Set the buffer size to 4096 bytes
var messageBuilder = new StringBuilder();

while (webSocket.State == WebSocketState.Open && !cancellationToken.IsCancellationRequested)
{
    messageBuilder.Clear(); // Reset buffer for each new message
    WebSocketReceiveResult result;
    do
    {
        result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), cancellationToken);
        messageBuilder.Append(Encoding.UTF8.GetString(buffer, 0, result.Count));
    }
    while (!result.EndOfMessage); // Continue until we've received the full message
}

Logika interupsi bawaan:

Aplikasi ini menggunakan hasil menengah yang diterima dari transkripsi real-time untuk mendeteksi penyelaan dari pemanggil dan membatalkan operasi pemutaran.

if (data.Contains("Intermediate"))
{
    Console.WriteLine("\nCanceling prompt");
    if (callMedia != null)
    {
        await callMedia.CancelAllMediaOperationsAsync();
    }
}
  • Saat agen AI memberikan respons, aplikasi menggunakan Play API untuk mengonversi teks tersebut ke audio layanan Teks ke Ucapan.
var ssmlPlaySource = new SsmlSource($"{message}");

var playOptions = new PlayToAllOptions(ssmlPlaySource)
{
    OperationContext = "Testing"
};

await callConnectionMedia.PlayToAllAsync(playOptions);
  • Tingkatkan panggilan saat penelepon meminta perwakilan: Ketika pengguna meminta untuk berbicara dengan perwakilan, agen AI mentransfer panggilan ke agen manusia.
if (botActivity.Type == "handoff")
{
    var transferOptions = new TransferToParticipantOptions(agentPhoneIdentity)
    {
        SourceCallerIdNumber = acsPhoneIdentity
    };

    await Task.Delay(6000);
    await callConnection.TransferCallToParticipantAsync(transferOptions);
}

7. Jalankan

Anda sekarang dapat melakukan panggilan dan berbicara dengan agen Anda.

Petunjuk

Topik

Untuk mengoptimalkan suara, kami sarankan Anda memperbarui topik di mana Anda menggunakan jenis "Pesan" Teks ke Ucapan, karena mengoptimalkan respons agen untuk skenario Ucapan.

Cara Menangani Topik Tentang Sistem

Agen Anda memiliki Topik Sistem bawaan secara default. Anda dapat memilih untuk menonaktifkan topik-topik ini, tetapi jika Anda ingin terus menggunakannya, aplikasi Anda harus membangun logika untuk menangani topik ini. Misalnya:

  • Eskalasi: Anda perlu membangun fitur transfer agen ke dalam aplikasi Anda untuk mengalihkan panggilan dari agen copilot ini ke perwakilan manusia.