Udostępnij przez


Integrowanie usług Azure Communication Services z agentami programu Microsoft Copilot Studio

Ten artykuł zawiera instrukcje krok po kroku dotyczące tworzenia i integrowania agenta Programu Microsoft Copilot Studio z usługami Azure Communication Services. W tym artykule pokazano, jak utworzyć agentów obsługujących głos, 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.

Prerequisites

Krok 1. Tworzenie agenta w programie Copilot Studio

  1. Po zalogowaniu się lub zarejestrowaniu się w aplikacji Copilot Studio zostanie otwarta strona główna. W okienku po lewej stronie wybierz pozycję Utwórz.

    Zrzut ekranu przedstawiający sposób tworzenia agenta.

  2. Na stronie Utwórz wybierz opcję Nowy agent.

    Użyj czatu, aby opisać agenta. Skorzystaj z podanych pytań, aby uzyskać wskazówki.

  3. Po podaniu wszystkich żądanych informacji wybierz pozycję Utwórz.

    Zrzut ekranu przedstawiający pozycję Utwórz.

Aby uzyskać więcej informacji na temat tworzenia i dostosowywania agenta, zobacz Szybki start Copilot Studio.

Krok 2. Wyłączanie uwierzytelniania

Po utworzeniu agenta należy wprowadzić pewne aktualizacje, aby można je było zintegrować z usługami Azure Communication Services.

  1. Przejdź do karty Ustawienia .

    Zrzut ekranu przedstawiający kartę Ustawienia.

  2. W okienku po lewej stronie wybierz pozycję Zabezpieczenia.

    Zrzut ekranu przedstawiający kartę Zabezpieczenia.

  3. Wybierz pozycję Uwierzytelnianie>bez uwierzytelniania, a następnie wybierz pozycję Zapisz.

    Zrzut ekranu przedstawiający krok Uwierzytelnianie.

Krok 3. Pobieranie klucza zabezpieczeń kanału sieci Web

Wróć do sekcji Zabezpieczenia i wybierz pozycję Zabezpieczenia kanału internetowego. Skopiuj i zapisz klucz. Jest ona potrzebna podczas wdrażania aplikacji.

Krok 4. Publikowanie agenta

Po zaktualizowaniu ustawień agenta i zapisaniu klucza, możesz następnie opublikować swojego asystenta.

Krok 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 Direct Line programu Microsoft Copilot Studio: Zapisałeś swój klucz zabezpieczeń Kanału Internetowego w kroku 3.
  • Niestandardowy punkt końcowy usług Azure AI: ten punkt końcowy można uzyskać z zasobu usług Azure AI.
  • Port do odbierania powiadomień o zdarzeniach z usług Azure Communication Services: możesz użyć narzędzi takich jak tunele deweloperskie , aby je skonfigurować.

Krok 6. Omówienie kodu

Musisz zapoznać się z kilkoma podstawowymi pojęciami używanymi przez przykład do kompilowania tego przepływu pracy.

Rejestrowanie połączenia przychodzącego

Zarejestruj zdarzenie połączenia przychodzącego, aby aplikacja wiedziała, kiedy przychodzi połączenie i musi na nie odpowiedzieć.

Odpowiadanie na połączenie za pomocą transkrypcji w czasie rzeczywistym

Po odebraniu połączenia włączysz również przesyłanie strumieniowe transkrypcji w czasie rzeczywistym. Zawartość przekonwertowana z mowy na tekst, którą wypowiada osoba dzwoniąca, jest przesyłana strumieniowo 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();
});

Nawiąż połączenie z Copilot

Po nawiązaniu połączenia, aplikacja musi ustanowić połączenie z agentem AI, który został utworzony przy użyciu Direct Line API z WebSocket.

Rozpoczynanie konwersacji

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 połączenia protokołu WebSocket

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
}

Wykrywanie "barge-in"

Aplikacja używa wyników pośrednich, które są odbierane z transkrypcji w czasie rzeczywistym w celu wykrywania przerwania przez obiekt wywołujący 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 Play API do przekształcania tego tekstu w dźwięk dla usługi zamiany tekstu na mowę.

    var ssmlPlaySource = new SsmlSource($"{message}");
    
    var playOptions = new PlayToAllOptions(ssmlPlaySource)
    {
        OperationContext = "Testing"
    };
    
    await callConnectionMedia.PlayToAllAsync(playOptions);
    
  • Gdy rozmówcy prosi o rozmowę z przedstawicielem, agent sztucznej inteligencji eskaluje połączenie, przesyłając go do agenta ludzkiego.

    if (botActivity.Type == "handoff")
    {
        var transferOptions = new TransferToParticipantOptions(agentPhoneIdentity)
        {
            SourceCallerIdNumber = acsPhoneIdentity
        };
    
        await Task.Delay(6000);
        await callConnection.TransferCallToParticipantAsync(transferOptions);
    }
    

Krok 7. Uruchamianie agenta

Teraz możesz nawiązać połączenie i porozmawiać z agentem.

Tips

Topics

Aby zoptymalizować język głosowy, zalecamy aktualizowanie tematów, w których używasz Message typu tekstu do mowy, ponieważ optymalizuje odpowiedzi agenta na potrzeby scenariuszy mowy.

Tematy systemowe

Domyślnie twój agent ma wbudowane tematy systemowe. Możesz wyłączyć te tematy. Jeśli chcesz nadal ich używać, aplikacja powinna tworzyć logikę do obsługi tych tematów. Na przykład musisz zintegrować funkcjonalność transferu agenta w swojej aplikacji, aby eskalować połączenie od tego agenta Copilot do przedstawiciela człowieka.