Udostępnij za pośrednictwem


Zmaksymalizuj swoje interakcje głosowe: Integracja usług Azure Communication Services z agentami Microsoft Copilot Studio

Ten dokument zawiera szczegółowe instrukcje dotyczące tworzenia i integrowania agenta Copilot Studio z usługami Azure Communication Services. Ten przewodnik umożliwia tworzenie agentów z obsługą głosu, do których użytkownicy mogą dzwonić.

Pobierz przykład

Znajdź projekt dla tego przykładu w witrynie GitHub. Możesz pobrać ten kod i uruchomić go lokalnie, aby spróbować samodzielnie.

Wymagania wstępne

Przed rozpoczęciem upewnij się, że masz:

1. Tworzenie agenta w programie Copilot Studio

Po zalogowaniu się lub zarejestrowaniu się w aplikacji Copilot Studio możesz trafić na stronę główną. Wybierz Utwórz w nawigacji po lewej.

Zrzut ekranu przedstawiający sposób tworzenia agenta.

Na stronie Tworzenie wybierz pozycję Nowy agent. Użyj czatu, aby opisać swojego agenta, używając podanych pytań w celu uzyskania wskazówek.
Po podaniu wszystkich żądanych informacji kliknij przycisk Utwórz.

Zrzut ekranu przedstawiający sekcję 'Kliknij, aby utworzyć'.

Aby uzyskać więcej informacji na temat tworzenia i dostosowywania agenta, zobacz Przewodnik szybkiego startu Copilot Studio.

2. Wyłącz uwierzytelnianie

Po utworzeniu agenta należy wprowadzić aktualizacje, aby można je było zintegrować z usługą Azure Communication Service.

  • Przejdź do karty Ustawienia .

Zrzut ekranu przedstawiający sposób przechodzenia do karty Ustawienia.

  • Kliknij pozycję Zabezpieczenia w okienku po lewej stronie.

Zrzut ekranu przedstawiający kartę Zabezpieczenia.

  • Wybierz pozycję Uwierzytelnianie, wybierz pozycję Brak uwierzytelniania, a następnie kliknij przycisk Zapisz.

Zrzut ekranu przedstawiający krok uwierzytelniania.

3. Pobieranie klucza zabezpieczeń webchannel

Powrót do sekcji Zabezpieczenia wybierz Zabezpieczenia kanału internetowego. Skopiuj i zapisz ten klucz gdzieś. Jest to konieczne podczas wdrażania aplikacji.

4. Opublikuj agenta

Teraz, po zaktualizowaniu i zapisaniu klucza agenta, możesz opublikować agenta.

5. Konfigurowanie kodu

Po utworzeniu agenta upewnij się, że pobierzesz przykład. Po pobraniu przykładu należy zaktualizować niektóre właściwości.

  • Parametry połączenia: Parametry połączenia można pobrać z zasobu usług Azure Communication Services.
  • Klucz bezpośredni programu Microsoft Copilot Studio: który został zapisany w kroku 3, klucz zabezpieczeń webchannel.
  • Niestandardowy punkt końcowy usług Azure AI Services: ten punkt końcowy można uzyskać z zasobu usług Azure AI Services.
  • Aby otrzymywać powiadomienia o zdarzeniach z usług Azure Communication Services, musisz mieć uruchomiony port. Możesz użyć narzędzi, takich jak DevTunnels , aby ułatwić ich skonfigurowanie.

6. Omówienie kodu

Istnieje kilka podstawowych pojęć, z którymi należy się zapoznać, które przykład używa do zbudowania tego przepływu pracy.

Połączenie przychodzące

Zarejestruj zdarzenie połączenia przychodzącego, aby aplikacja wiedziała, kiedy nadchodzi połączenie i potrzebuje odpowiedzieć.

Odbierz połączenie z transkrypcją w czasie rzeczywistym

Podczas odpowiadania na połączenie włączysz również przesyłanie strumieniowe transkrypcji w czasie rzeczywistym, która wysyła przekonwertowaną zawartość zamiany mowy na tekst, którą obiekt wywołujący mówi niemal w czasie rzeczywistym.

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();
});

Ustanawianie połączenia copilot

Po nawiązaniu połączenia aplikacja musi ustanowić połączenie z agentem AI, który został zbudowany przy użyciu Direct Line APIs z wykorzystaniem websockets.

Rozpocznij konwersację

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);

Nasłuchiwanie składnika 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
}

Wbudowana logika barge-in:

Aplikacja używa pośrednich wyników odebranych z transkrypcji w czasie rzeczywistym w celu wykrywania przerywania rozmówcy i anuluje operację odtwarzania.

if (data.Contains("Intermediate"))
{
    Console.WriteLine("\nCanceling prompt");
    if (callMedia != null)
    {
        await callMedia.CancelAllMediaOperationsAsync();
    }
}
  • Gdy agent sztucznej inteligencji udostępnia odpowiedzi, aplikacja używa interfejsu API odtwarzania do konwertowania tego tekstu na dźwięk usługi Zamiana tekstu na mowę.
var ssmlPlaySource = new SsmlSource($"{message}");

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

await callConnectionMedia.PlayToAllAsync(playOptions);
  • Eskaluj połączenie, gdy dzwoni do przedstawiciela: gdy użytkownik prosi o rozmowę z przedstawicielem, agent sztucznej inteligencji przesyła połączenie do agenta ludzkiego.
if (botActivity.Type == "handoff")
{
    var transferOptions = new TransferToParticipantOptions(agentPhoneIdentity)
    {
        SourceCallerIdNumber = acsPhoneIdentity
    };

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

7. Uruchom

Teraz powinieneś móc zadzwonić i porozmawiać z agentem.

Wskazówki

Tematy

Aby zoptymalizować głos, zalecamy zaktualizowanie tematów, w których używasz syntezatora mowy typu "Wiadomość", ponieważ optymalizuje odpowiedzi agentów w scenariuszach głosowych.

Jak obsługiwać tematy systemowe

Twój agent ma wbudowane tematy systemowe. Możesz wyłączyć te tematy, ale jeśli chcesz nadal z nich korzystać, aplikacja powinna tworzyć logikę do obsługi tych tematów. Taki jak:

  • Eskalacja: Musisz wbudować funkcję transferu agenta w aplikację, aby eskalować połączenie od tego agenta copilot do ludzkiego przedstawiciela.