Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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:
- Konto platformy Azure z aktywną subskrypcją, aby uzyskać szczegółowe informacje, zobacz Utwórz konto za darmo.
- Zasób usług Azure Communication Services - zobacz tworzenie nowego zasobu usług Azure Communication Services. Musisz zarejestrować parametry połączenia zasobu dla tego przykładu.
- Utwórz nową aplikację usługi internetowej przy użyciu zestawu Sdk automatyzacji wywołań.
- Zasób Wielousługowy Azure AI oraz niestandardowa domena.
- Łączenie usług Azure Communication Services i azure AI.
- Licencja Copilot Studio, aby móc utworzyć i opublikować agenta.
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.
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.
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 .
- Kliknij pozycję Zabezpieczenia w okienku po lewej stronie.
- Wybierz pozycję Uwierzytelnianie, wybierz pozycję Brak uwierzytelniania, a następnie kliknij przycisk Zapisz.
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.