Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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
- Konto Azure z aktywną subskrypcją. Aby uzyskać więcej informacji, zobacz Tworzenie konta bezpłatnie.
- Zasób usług Azure Communication Services. Aby uzyskać więcej informacji, zobacz Tworzenie nowego zasobu usług Azure Communication Services. Musisz zarejestrować parametry połączenia zasobu dla tego przykładu.
- Nowa aplikacja usługi internetowej korzystająca z zestawu Sdk usługi Call Automation.
- Zasób wielousługowy usługi Azure AI i domena niestandardowa.
- Azure Communication Services i Azure AI.
- Licencja użytkownika programu Copilot Studio, aby można było utworzyć i opublikować agenta.
Krok 1. Tworzenie agenta w programie Copilot Studio
Po zalogowaniu się lub zarejestrowaniu się w aplikacji Copilot Studio zostanie otwarta strona główna. W okienku po lewej stronie wybierz pozycję Utwórz.
Na stronie Utwórz wybierz opcję Nowy agent.
Użyj czatu, aby opisać agenta. Skorzystaj z podanych pytań, aby uzyskać wskazówki.
Po podaniu wszystkich żądanych informacji wybierz 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.
Przejdź do karty Ustawienia .
W okienku po lewej stronie wybierz pozycję Zabezpieczenia.
Wybierz pozycję Uwierzytelnianie>bez uwierzytelniania, a następnie wybierz pozycję Zapisz.
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.