Szybki start: przesyłanie strumieniowe audio po stronie serwera
Ważne
Funkcje opisane w tym artykule są obecnie dostępne w publicznej wersji zapoznawczej. Ta wersja zapoznawcza jest udostępniana bez umowy dotyczącej poziomu usług i nie zalecamy korzystania z niej w przypadku obciążeń produkcyjnych. Niektóre funkcje mogą być nieobsługiwane lub ograniczone. Aby uzyskać więcej informacji, zobacz Uzupełniające warunki korzystania z wersji zapoznawczych platformy Microsoft Azure.
Rozpoczynanie pracy ze strumieniami audio za pośrednictwem interfejsu API przesyłania strumieniowego audio usług Azure Communication Services. W tym przewodniku Szybki start założono, że znasz już interfejsy API usługi Call Automation w celu utworzenia zautomatyzowanego rozwiązania do routingu wywołań.
Funkcje opisane w tym przewodniku Szybki start są obecnie dostępne w publicznej wersji zapoznawczej.
Wymagania wstępne
- Aby uzyskać szczegółowe informacje, zobacz Tworzenie konta platformy Azure z aktywną subskrypcją.
- Zasób usług Azure Communication Services. Zobacz Tworzenie zasobu usług Azure Communication Services.
- Nowa aplikacja usługi internetowej utworzona przy użyciu zestawu Call Automation SDK.
- Najnowsza biblioteka .NET dla systemu operacyjnego.
- Serwer websocket, który może wysyłać i odbierać strumienie multimediów.
Konfigurowanie serwera websocket
Usługi Azure Communication Services wymagają, aby aplikacja serwera skonfigurowała serwer WebSocket w celu strumieniowego przesyłania dźwięku w czasie rzeczywistym. WebSocket to ustandaryzowany protokół, który zapewnia kanał komunikacji pełnodupleksowej za pośrednictwem jednego połączenia TCP.
Zapoznaj się z dokumentacją tutaj , aby dowiedzieć się więcej na temat obiektów WebSocket i sposobu ich używania.
Odbieranie i wysyłanie danych przesyłanych strumieniowo audio
Istnieje wiele sposobów rozpoczęcia odbierania strumienia audio, które można skonfigurować przy użyciu startMediaStreaming
flagi mediaStreamingOptions
w konfiguracji. Możesz również określić żądaną częstotliwość próbkowania używaną do odbierania lub wysyłania danych audio przy użyciu parametru audioFormat
. Obecnie obsługiwane formaty to mono PCM 24K i PCM 16K mono, a domyślnym formatem jest PCM 16K mono.
Aby włączyć dwukierunkowe przesyłanie strumieniowe audio, w którym wysyłasz dane audio do wywołania, możesz włączyć flagę EnableBidirectional
. Aby uzyskać więcej informacji, zapoznaj się ze specyfikacjami interfejsu API.
Uruchamianie przesyłania strumieniowego dźwięku do serwera internetowego w momencie odpowiadania na połączenie
Włącz automatyczne przesyłanie strumieniowe audio po nawiązaniu połączenia przez ustawienie flagi startMediaStreaming: true
.
To ustawienie zapewnia, że przesyłanie strumieniowe audio jest uruchamiane automatycznie natychmiast po nawiązaniu połączenia.
var mediaStreamingOptions = new MediaStreamingOptions(
new Uri("wss://YOUR_WEBSOCKET_URL"),
MediaStreamingContent.Audio,
MediaStreamingAudioChannel.Mixed,
startMediaStreaming: true) {
EnableBidirectional = true,
AudioFormat = AudioFormat.Pcm24KMono
}
var options = new AnswerCallOptions(incomingCallContext, callbackUri) {
MediaStreamingOptions = mediaStreamingOptions,
};
AnswerCallResult answerCallResult = await client.AnswerCallAsync(options);
Gdy usługi Azure Communication Services odbierają adres URL serwera WebSocket, nawiązuje z nim połączenie. Po pomyślnym nawiązaniu połączenia zostanie zainicjowane przesyłanie strumieniowe.
Uruchamianie przesyłania strumieniowego dźwięku do serwera internetowego, gdy trwa wywołanie
Aby uruchomić przesyłanie strumieniowe multimediów podczas wywołania, możesz użyć interfejsu API. Aby to zrobić, ustaw startMediaStreaming
parametr na false
(czyli wartość domyślną), a później w wywołaniu możesz użyć interfejsu API uruchamiania, aby włączyć przesyłanie strumieniowe multimediów.
var mediaStreamingOptions = new MediaStreamingOptions(
new Uri("wss://<YOUR_WEBSOCKET_URL"),
MediaStreamingContent.Audio,
MediaStreamingAudioChannel.Mixed,
startMediaStreaming: false) {
EnableBidirectional = true,
AudioFormat = AudioFormat.Pcm24KMono
}
var options = new AnswerCallOptions(incomingCallContext, callbackUri) {
MediaStreamingOptions = mediaStreamingOptions,
};
AnswerCallResult answerCallResult = await client.AnswerCallAsync(options);
Start media streaming via API call
StartMediaStreamingOptions options = new StartMediaStreamingOptions() {
OperationContext = "startMediaStreamingContext"
};
await callMedia.StartMediaStreamingAsync();
Zatrzymywanie przesyłania strumieniowego audio
Aby zatrzymać odbieranie strumieni audio podczas wywołania, możesz użyć interfejsu API Zatrzymywanie przesyłania strumieniowego. Umożliwia to zatrzymanie przesyłania strumieniowego audio w dowolnym momencie wywołania. Istnieją dwa sposoby zatrzymania przesyłania strumieniowego audio;
- Wyzwalanie interfejsu API zatrzymywania przesyłania strumieniowego: użyj interfejsu API, aby zatrzymać odbieranie danych przesyłania strumieniowego audio, gdy wywołanie jest nadal aktywne.
- Automatyczne zatrzymywanie po rozłączeniu połączenia: przesyłanie strumieniowe audio automatycznie zatrzymuje się po rozłączeniu połączenia.
StopMediaStreamingOptions options = new StopMediaStreamingOptions() {
OperationContext = "stopMediaStreamingContext"
};
await callMedia.StopMediaStreamingAsync();
Obsługa strumieni audio na serwerze websocket
W tym przykładzie pokazano, jak nasłuchiwać strumieni audio przy użyciu serwera websocket.
private async Task StartReceivingFromAcsMediaWebSocket(Websocket websocket) {
while (webSocket.State == WebSocketState.Open || webSocket.State == WebSocketState.Closed) {
byte[] receiveBuffer = new byte[2048];
WebSocketReceiveResult receiveResult = await webSocket.ReceiveAsync(
new ArraySegment < byte > (receiveBuffer));
if (receiveResult.MessageType != WebSocketMessageType.Close) {
string data = Encoding.UTF8.GetString(receiveBuffer).TrimEnd('\0');
var input = StreamingData.Parse(data);
if (input is AudioData audioData) {
// Add your code here to process the received audio chunk
}
}
}
}
Pierwszy otrzymany pakiet zawiera metadane dotyczące strumienia, w tym ustawienia audio, takie jak kodowanie, częstotliwość próbkowania i inne szczegóły konfiguracji.
{
"kind": "AudioMetadata",
"audioMetadata": {
"subscriptionId": "89e8cb59-b991-48b0-b154-1db84f16a077",
"encoding": "PCM",
"sampleRate": 16000,
"channels": 1,
"length": 640
}
}
Po wysłaniu pakietu metadanych usługi Azure Communication Services (ACS) rozpoczną przesyłanie strumieniowe multimediów audio na serwer Protokołu WebSocket.
{
"kind": "AudioData",
"audioData": {
"timestamp": "2024-11-15T19:16:12.925Z",
"participantRawID": "8:acs:3d20e1de-0f28-41c5…",
"data": "5ADwAOMA6AD0A…",
"silent": false
}
}
Wysyłanie danych przesyłanych strumieniowo audio do usług Azure Communication Services
Jeśli dwukierunkowe przesyłanie strumieniowe jest włączone przy użyciu flagi w elemecie EnableBidirectional
MediaStreamingOptions
, możesz przesyłać strumieniowo dane audio z powrotem do usług Azure Communication Services, co odtwarza dźwięk w wywołaniu.
Gdy usługi Azure Communication Services rozpoczną przesyłanie strumieniowe dźwięku do serwera WebSocket, możesz przekazać dźwięk do usług sztucznej inteligencji. Gdy usługa sztucznej inteligencji przetworzy zawartość audio, możesz przesyłać strumieniowo dźwięk z powrotem do trwającego wywołania w usługach Azure Communication Services.
W tym przykładzie pokazano, w jaki sposób inna usługa, taka jak Azure OpenAI lub inne modele językowe oparte na głosach, przetwarza i przesyła dane audio z powrotem do wywołania.
var audioData = OutStreamingData.GetAudioDataForOutbound(audioData)),
byte[] jsonBytes = Encoding.UTF8.GetBytes(audioData);
// Write your logic to send the PCM audio chunk over the WebSocket
// Example of how to send audio data over the WebSocket
await m_webSocket.SendAsync(new ArraySegment < byte > (jsonBytes), WebSocketMessageType.Text, endOfMessage: true, CancellationToken.None);
Możesz również kontrolować odtwarzanie dźwięku w wywołaniu podczas przesyłania strumieniowego z powrotem do usług Azure Communication Services na podstawie logiki lub przepływu biznesowego. Na przykład po wykryciu aktywności głosowej i zatrzymaniu w kolejce dźwięku możesz wysłać komunikat zatrzymania za pośrednictwem protokołu WebSocket, aby zatrzymać odtwarzanie dźwięku w wywołaniu.
var stopData = OutStreamingData.GetStopAudioForOutbound();
byte[] jsonBytes = Encoding.UTF8.GetBytes(stopData);
// Write your logic to send stop data to ACS over the WebSocket
// Example of how to send stop data over the WebSocket
await m_webSocket.SendAsync(new ArraySegment < byte > (jsonBytes), WebSocketMessageType.Text, endOfMessage: true, CancellationToken.None);
Wymagania wstępne
- Aby uzyskać szczegółowe informacje, zobacz Tworzenie konta platformy Azure z aktywną subskrypcją.
- Zasób usług Azure Communication Services. Zobacz Tworzenie zasobu usług Azure Communication Services.
- Nowa aplikacja usługi internetowej utworzona przy użyciu zestawu Call Automation SDK.
- Zestaw Java Development Kit w wersji 17 lub nowszej.
- Apache Maven.
Konfigurowanie serwera websocket
Usługi Azure Communication Services wymagają, aby aplikacja serwera skonfigurowała serwer WebSocket w celu strumieniowego przesyłania dźwięku w czasie rzeczywistym. WebSocket to ustandaryzowany protokół, który zapewnia kanał komunikacji pełnodupleksowej za pośrednictwem jednego połączenia TCP.
Zapoznaj się z dokumentacją tutaj , aby dowiedzieć się więcej na temat obiektów WebSocket i sposobu ich używania.
Odbieranie i wysyłanie danych przesyłanych strumieniowo audio
Istnieje wiele sposobów rozpoczęcia odbierania strumienia audio, które można skonfigurować przy użyciu startMediaStreaming
flagi mediaStreamingOptions
w konfiguracji. Możesz również określić żądaną częstotliwość próbkowania używaną do odbierania lub wysyłania danych audio przy użyciu parametru audioFormat
. Obecnie obsługiwane formaty to mono PCM 24K i PCM 16K mono, a domyślnym formatem jest PCM 16K mono.
Aby włączyć dwukierunkowe przesyłanie strumieniowe audio, w którym wysyłasz dane audio do wywołania, możesz włączyć flagę EnableBidirectional
. Aby uzyskać więcej informacji, zapoznaj się ze specyfikacjami interfejsu API.
Uruchamianie przesyłania strumieniowego dźwięku do serwera internetowego w momencie odpowiadania na połączenie
Włącz automatyczne przesyłanie strumieniowe audio po nawiązaniu połączenia przez ustawienie flagi startMediaStreaming: true
.
To ustawienie zapewnia, że przesyłanie strumieniowe audio jest uruchamiane automatycznie natychmiast po nawiązaniu połączenia.
MediaStreamingOptions mediaStreamingOptions = new MediaStreamingOptions(appConfig.getTransportUrl(), MediaStreamingTransport.WEBSOCKET, MediaStreamingContent.AUDIO, MediaStreamingAudioChannel.MIXED, true).setEnableBidirectional(true).setAudioFormat(AudioFormat.PCM_24K_MONO);
options = new AnswerCallOptions(data.getString(INCOMING_CALL_CONTEXT), callbackUri).setCallIntelligenceOptions(callIntelligenceOptions).setMediaStreamingOptions(mediaStreamingOptions);
Response answerCallResponse = client.answerCallWithResponse(options, Context.NONE);
Gdy usługi Azure Communication Services odbierają adres URL serwera WebSocket, nawiązuje z nim połączenie. Po pomyślnym nawiązaniu połączenia zostanie zainicjowane przesyłanie strumieniowe.
Uruchamianie przesyłania strumieniowego dźwięku do serwera internetowego, gdy trwa wywołanie
Aby uruchomić przesyłanie strumieniowe multimediów podczas wywołania, możesz użyć interfejsu API. Aby to zrobić, ustaw startMediaStreaming
parametr na false
(czyli wartość domyślną), a później w wywołaniu możesz użyć interfejsu API uruchamiania, aby włączyć przesyłanie strumieniowe multimediów.
MediaStreamingOptions mediaStreamingOptions = new MediaStreamingOptions(appConfig.getTransportUrl(), MediaStreamingTransport.WEBSOCKET, MediaStreamingContent.AUDIO, MediaStreamingAudioChannel.MIXED, false)
.setEnableBidirectional(true)
.setAudioFormat(AudioFormat.PCM_24K_MONO);
options = new AnswerCallOptions(data.getString(INCOMING_CALL_CONTEXT), callbackUri)
.setCallIntelligenceOptions(callIntelligenceOptions)
.setMediaStreamingOptions(mediaStreamingOptions);
Response answerCallResponse = client.answerCallWithResponse(options, Context.NONE);
StartMediaStreamingOptions startMediaStreamingOptions = new StartMediaStreamingOptions()
.setOperationContext("startMediaStreamingContext");
callConnection.getCallMedia().startMediaStreamingWithResponse(startMediaStreamingOptions, Context.NONE);
Zatrzymywanie przesyłania strumieniowego audio
Aby zatrzymać odbieranie strumieni audio podczas wywołania, możesz użyć interfejsu API Zatrzymywanie przesyłania strumieniowego. Umożliwia to zatrzymanie przesyłania strumieniowego audio w dowolnym momencie wywołania. Istnieją dwa sposoby zatrzymania przesyłania strumieniowego audio;
- Wyzwalanie interfejsu API zatrzymywania przesyłania strumieniowego: użyj interfejsu API, aby zatrzymać odbieranie danych przesyłania strumieniowego audio, gdy wywołanie jest nadal aktywne.
- Automatyczne zatrzymywanie po rozłączeniu połączenia: przesyłanie strumieniowe audio automatycznie zatrzymuje się po rozłączeniu połączenia.
StopMediaStreamingOptions stopMediaStreamingOptions = new StopMediaStreamingOptions()
.setOperationContext("stopMediaStreamingContext");
callConnection.getCallMedia().stopMediaStreamingWithResponse(stopMediaStreamingOptions, Context.NONE);
Obsługa strumieni audio na serwerze websocket
W tym przykładzie pokazano, jak nasłuchiwać strumieni audio przy użyciu serwera websocket.
@OnMessage
public void onMessage(String message, Session session) {
System.out.println("Received message: " + message);
var parsedData = StreamingData.parse(message);
if (parsedData instanceof AudioData) {
var audioData = (AudioData) parsedData;
sendAudioData(session, audioData.getData());
}
}
Pierwszy otrzymany pakiet zawiera metadane dotyczące strumienia, w tym ustawienia audio, takie jak kodowanie, częstotliwość próbkowania i inne szczegóły konfiguracji.
{
"kind": "AudioMetadata",
"audioMetadata": {
"subscriptionId": "89e8cb59-b991-48b0-b154-1db84f16a077",
"encoding": "PCM",
"sampleRate": 16000,
"channels": 1,
"length": 640
}
}
Po wysłaniu pakietu metadanych usługi Azure Communication Services (ACS) rozpoczną przesyłanie strumieniowe multimediów audio na serwer Protokołu WebSocket.
{
"kind": "AudioData",
"audioData": {
"timestamp": "2024-11-15T19:16:12.925Z",
"participantRawID": "8:acs:3d20e1de-0f28-41c5…",
"data": "5ADwAOMA6AD0A…",
"silent": false
}
}
Wysyłanie danych przesyłanych strumieniowo audio do usług Azure Communication Services
Jeśli dwukierunkowe przesyłanie strumieniowe jest włączone przy użyciu flagi w elemecie EnableBidirectional
MediaStreamingOptions
, możesz przesyłać strumieniowo dane audio z powrotem do usług Azure Communication Services, co odtwarza dźwięk w wywołaniu.
Gdy usługi Azure Communication Services rozpoczną przesyłanie strumieniowe dźwięku do serwera WebSocket, możesz przekazać dźwięk do usług sztucznej inteligencji. Gdy usługa sztucznej inteligencji przetworzy zawartość audio, możesz przesyłać strumieniowo dźwięk z powrotem do trwającego wywołania w usługach Azure Communication Services.
W tym przykładzie pokazano, w jaki sposób inna usługa, taka jak Azure OpenAI lub inne modele językowe oparte na głosach, przetwarza i przesyła dane audio z powrotem do wywołania.
private void sendAudioData(Session session, byte[] binaryData) {
System.out.println("Data buffer---> " + binaryData.getClass().getName());
if (session.isOpen()) {
try {
var serializedData = OutStreamingData.getStreamingDataForOutbound(binaryData);
session.getAsyncRemote().sendText(serializedData);
} catch (IOException e) {
e.printStackTrace();
}
}
}
Możesz również kontrolować odtwarzanie dźwięku w wywołaniu podczas przesyłania strumieniowego z powrotem do usług Azure Communication Services na podstawie logiki lub przepływu biznesowego. Na przykład po wykryciu aktywności głosowej i zatrzymaniu w kolejce dźwięku możesz wysłać komunikat zatrzymania za pośrednictwem protokołu WebSocket, aby zatrzymać odtwarzanie dźwięku w wywołaniu.
private void stopAudio(Session session) {
if (session.isOpen()) {
try {
var serializedData = OutStreamingData.getStopAudioForOutbound();
session.getAsyncRemote().sendText(serializedData);
} catch (IOException e) {
e.printStackTrace();
}
}
}
Wymagania wstępne
- Aby uzyskać szczegółowe informacje, zobacz Tworzenie konta platformy Azure z aktywną subskrypcją.
- Zasób usług Azure Communication Services. Zobacz Tworzenie zasobu usług Azure Communication Services.
- Nowa aplikacja usługi internetowej utworzona przy użyciu zestawu Call Automation SDK.
- instalacja Node.js LTS
- Serwer websocket, który może wysyłać i odbierać strumienie multimediów.
Konfigurowanie serwera websocket
Usługi Azure Communication Services wymagają, aby aplikacja serwera skonfigurowała serwer WebSocket w celu strumieniowego przesyłania dźwięku w czasie rzeczywistym. WebSocket to ustandaryzowany protokół, który zapewnia kanał komunikacji pełnodupleksowej za pośrednictwem jednego połączenia TCP.
Zapoznaj się z dokumentacją tutaj , aby dowiedzieć się więcej na temat obiektów WebSocket i sposobu ich używania.
Odbieranie i wysyłanie danych przesyłanych strumieniowo audio
Istnieje wiele sposobów rozpoczęcia odbierania strumienia audio, które można skonfigurować przy użyciu startMediaStreaming
flagi mediaStreamingOptions
w konfiguracji. Możesz również określić żądaną częstotliwość próbkowania używaną do odbierania lub wysyłania danych audio przy użyciu parametru audioFormat
. Obecnie obsługiwane formaty to mono PCM 24K i PCM 16K mono, a domyślnym formatem jest PCM 16K mono.
Aby włączyć dwukierunkowe przesyłanie strumieniowe audio, w którym wysyłasz dane audio do wywołania, możesz włączyć flagę EnableBidirectional
. Aby uzyskać więcej informacji, zapoznaj się ze specyfikacjami interfejsu API.
Uruchamianie przesyłania strumieniowego dźwięku do serwera internetowego w momencie odpowiadania na połączenie
Włącz automatyczne przesyłanie strumieniowe audio po nawiązaniu połączenia przez ustawienie flagi startMediaStreaming: true
.
To ustawienie zapewnia, że przesyłanie strumieniowe audio jest uruchamiane automatycznie natychmiast po nawiązaniu połączenia.
var mediaStreamingOptions = new MediaStreamingOptions(
new Uri("wss://YOUR_WEBSOCKET_URL"),
MediaStreamingContent.Audio,
MediaStreamingAudioChannel.Mixed,
startMediaStreaming: true)
{
EnableBidirectional = true,
AudioFormat = AudioFormat.Pcm24KMono
}
var options = new AnswerCallOptions(incomingCallContext, callbackUri)
{
MediaStreamingOptions = mediaStreamingOptions,
};
AnswerCallResult answerCallResult = await client.AnswerCallAsync(options);
Gdy usługi Azure Communication Services odbierają adres URL serwera WebSocket, nawiązuje z nim połączenie. Po pomyślnym nawiązaniu połączenia zostanie zainicjowane przesyłanie strumieniowe.
Uruchamianie przesyłania strumieniowego dźwięku do serwera internetowego, gdy trwa wywołanie
Aby uruchomić przesyłanie strumieniowe multimediów podczas wywołania, możesz użyć interfejsu API. Aby to zrobić, ustaw startMediaStreaming
parametr na false
(czyli wartość domyślną), a później w wywołaniu możesz użyć interfejsu API uruchamiania, aby włączyć przesyłanie strumieniowe multimediów.
const mediaStreamingOptions: MediaStreamingOptions = {
transportUrl: transportUrl,
transportType: "websocket",
contentType: "audio",
audioChannelType: "unmixed",
startMediaStreaming: false,
enableBidirectional: true,
audioFormat: "Pcm24KMono"
}
const answerCallOptions: AnswerCallOptions = {
mediaStreamingOptions: mediaStreamingOptions
};
answerCallResult = await acsClient.answerCall(
incomingCallContext,
callbackUri,
answerCallOptions
);
const startMediaStreamingOptions: StartMediaStreamingOptions = {
operationContext: "startMediaStreaming"
}
await answerCallResult.callConnection.getCallMedia().startMediaStreaming(startMediaStreamingOptions);
Zatrzymywanie przesyłania strumieniowego audio
Aby zatrzymać odbieranie strumieni audio podczas wywołania, możesz użyć interfejsu API Zatrzymywanie przesyłania strumieniowego. Umożliwia to zatrzymanie przesyłania strumieniowego audio w dowolnym momencie wywołania. Istnieją dwa sposoby zatrzymania przesyłania strumieniowego audio;
- Wyzwalanie interfejsu API zatrzymywania przesyłania strumieniowego: użyj interfejsu API, aby zatrzymać odbieranie danych przesyłania strumieniowego audio, gdy wywołanie jest nadal aktywne.
- Automatyczne zatrzymywanie po rozłączeniu połączenia: przesyłanie strumieniowe audio automatycznie zatrzymuje się po rozłączeniu połączenia.
const stopMediaStreamingOptions: StopMediaStreamingOptions = {
operationContext: "stopMediaStreaming"
}
await answerCallResult.callConnection.getCallMedia().stopMediaStreaming(stopMediaStreamingOptions);
Obsługa strumieni audio na serwerze websocket
W tym przykładzie pokazano, jak nasłuchiwać strumieni audio przy użyciu serwera websocket.
wss.on('connection', async (ws: WebSocket) => {
console.log('Client connected');
await initWebsocket(ws);
await startConversation();
ws.on('message', async (packetData: ArrayBuffer) => {
try {
if (ws.readyState === WebSocket.OPEN) {
await processWebsocketMessageAsync(packetData);
} else {
console.warn(`ReadyState: ${ws.readyState}`);
}
} catch (error) {
console.error('Error processing WebSocket message:', error);
}
});
ws.on('close', () => {
console.log('Client disconnected');
});
});
async function processWebsocketMessageAsync(receivedBuffer: ArrayBuffer) {
const result = StreamingData.parse(receivedBuffer);
const kind = StreamingData.getStreamingKind();
// Get the streaming data kind
if (kind === StreamingDataKind.AudioData) {
const audioData = (result as AudioData);
// process your audio data
}
}
Pierwszy otrzymany pakiet zawiera metadane dotyczące strumienia, w tym ustawienia audio, takie jak kodowanie, częstotliwość próbkowania i inne szczegóły konfiguracji.
{
"kind": "AudioMetadata",
"audioMetadata": {
"subscriptionId": "89e8cb59-b991-48b0-b154-1db84f16a077",
"encoding": "PCM",
"sampleRate": 16000,
"channels": 1,
"length": 640
}
}
Po wysłaniu pakietu metadanych usługi Azure Communication Services (ACS) rozpoczną przesyłanie strumieniowe multimediów audio na serwer Protokołu WebSocket.
{
"kind": "AudioData",
"audioData": {
"timestamp": "2024-11-15T19:16:12.925Z",
"participantRawID": "8:acs:3d20e1de-0f28-41c5…",
"data": "5ADwAOMA6AD0A…",
"silent": false
}
}
Wysyłanie danych przesyłanych strumieniowo audio do usług Azure Communication Services
Jeśli dwukierunkowe przesyłanie strumieniowe jest włączone przy użyciu flagi w elemecie EnableBidirectional
MediaStreamingOptions
, możesz przesyłać strumieniowo dane audio z powrotem do usług Azure Communication Services, co odtwarza dźwięk w wywołaniu.
Gdy usługi Azure Communication Services rozpoczną przesyłanie strumieniowe dźwięku do serwera WebSocket, możesz przekazać dźwięk do usług sztucznej inteligencji. Gdy usługa sztucznej inteligencji przetworzy zawartość audio, możesz przesyłać strumieniowo dźwięk z powrotem do trwającego wywołania w usługach Azure Communication Services.
W tym przykładzie pokazano, w jaki sposób inna usługa, taka jak Azure OpenAI lub inne modele językowe oparte na głosach, przetwarza i przesyła dane audio z powrotem do wywołania.
async function receiveAudioForOutbound(data: string) {
try {
const jsonData = OutStreamingData.getStreamingDataForOutbound(data);
if (ws.readyState === WebSocket.OPEN) {
ws.send(jsonData);
} else {
console.log("socket connection is not open.");
}
} catch (e) {
console.log(e);
}
}
Możesz również kontrolować odtwarzanie dźwięku w wywołaniu podczas przesyłania strumieniowego z powrotem do usług Azure Communication Services na podstawie logiki lub przepływu biznesowego. Na przykład po wykryciu aktywności głosowej i zatrzymaniu w kolejce dźwięku możesz wysłać komunikat zatrzymania za pośrednictwem protokołu WebSocket, aby zatrzymać odtwarzanie dźwięku w wywołaniu.
async function stopAudio() {
try {
const jsonData = OutStreamingData.getStopAudioForOutbound();
if (ws.readyState === WebSocket.OPEN) {
ws.send(jsonData);
} else {
console.log("socket connection is not open.");
}
} catch (e) {
console.log(e);
}
}
Wymagania wstępne
- Aby uzyskać szczegółowe informacje, zobacz Tworzenie konta platformy Azure z aktywną subskrypcją.
- Zasób usług Azure Communication Services. Zobacz Tworzenie zasobu usług Azure Communication Services.
- Nowa aplikacja usługi internetowej utworzona przy użyciu zestawu Call Automation SDK.
- Python 3.7+.
- Serwer websocket, który może wysyłać i odbierać strumienie multimediów.
Konfigurowanie serwera websocket
Usługi Azure Communication Services wymagają, aby aplikacja serwera skonfigurowała serwer WebSocket w celu strumieniowego przesyłania dźwięku w czasie rzeczywistym. WebSocket to ustandaryzowany protokół, który zapewnia kanał komunikacji pełnodupleksowej za pośrednictwem jednego połączenia TCP.
Zapoznaj się z dokumentacją tutaj , aby dowiedzieć się więcej na temat obiektów WebSocket i sposobu ich używania.
Odbieranie i wysyłanie danych przesyłanych strumieniowo audio
Istnieje wiele sposobów rozpoczęcia odbierania strumienia audio, które można skonfigurować przy użyciu startMediaStreaming
flagi mediaStreamingOptions
w konfiguracji. Możesz również określić żądaną częstotliwość próbkowania używaną do odbierania lub wysyłania danych audio przy użyciu parametru audioFormat
. Obecnie obsługiwane formaty to mono PCM 24K i PCM 16K mono, a domyślnym formatem jest PCM 16K mono.
Aby włączyć dwukierunkowe przesyłanie strumieniowe audio, w którym wysyłasz dane audio do wywołania, możesz włączyć flagę EnableBidirectional
. Aby uzyskać więcej informacji, zapoznaj się ze specyfikacjami interfejsu API.
Uruchamianie przesyłania strumieniowego dźwięku do serwera internetowego w momencie odpowiadania na połączenie
Włącz automatyczne przesyłanie strumieniowe audio po nawiązaniu połączenia przez ustawienie flagi startMediaStreaming: true
.
To ustawienie zapewnia, że przesyłanie strumieniowe audio jest uruchamiane automatycznie natychmiast po nawiązaniu połączenia.
media_streaming_configuration = MediaStreamingOptions(
transport_url=TRANSPORT_URL,
transport_type=MediaStreamingTransportType.WEBSOCKET,
content_type=MediaStreamingContentType.AUDIO,
audio_channel_type=MediaStreamingAudioChannelType.MIXED,
start_media_streaming=True,
enable_bidirectional=True,
audio_format=AudioFormat.PCM24_K_MONO,
)
answer_call_result = call_automation_client.answer_call(
incoming_call_context=incoming_call_context,
media_streaming=media_streaming_configuration,
callback_url=callback_uri,
)
Gdy usługi Azure Communication Services odbierają adres URL serwera WebSocket, nawiązuje z nim połączenie. Po pomyślnym nawiązaniu połączenia zostanie zainicjowane przesyłanie strumieniowe.
Uruchamianie przesyłania strumieniowego dźwięku do serwera internetowego, gdy trwa wywołanie
Aby uruchomić przesyłanie strumieniowe multimediów podczas wywołania, możesz użyć interfejsu API. Aby to zrobić, ustaw startMediaStreaming
parametr na false
(czyli wartość domyślną), a później w wywołaniu możesz użyć interfejsu API uruchamiania, aby włączyć przesyłanie strumieniowe multimediów.
media_streaming_configuration = MediaStreamingOptions(
transport_url=TRANSPORT_URL,
transport_type=MediaStreamingTransportType.WEBSOCKET,
content_type=MediaStreamingContentType.AUDIO,
audio_channel_type=MediaStreamingAudioChannelType.MIXED,
start_media_streaming=False,
enable_bidirectional=True,
audio_format=AudioFormat.PCM24_K_MONO
)
answer_call_result = call_automation_client.answer_call(
incoming_call_context=incoming_call_context,
media_streaming=media_streaming_configuration,
callback_url=callback_uri
)
call_automation_client.get_call_connection(call_connection_id).start_media_streaming(
operation_context="startMediaStreamingContext"
)
Zatrzymywanie przesyłania strumieniowego audio
Aby zatrzymać odbieranie strumieni audio podczas wywołania, możesz użyć interfejsu API Zatrzymywanie przesyłania strumieniowego. Umożliwia to zatrzymanie przesyłania strumieniowego audio w dowolnym momencie wywołania. Istnieją dwa sposoby zatrzymania przesyłania strumieniowego audio;
- Wyzwalanie interfejsu API zatrzymywania przesyłania strumieniowego: użyj interfejsu API, aby zatrzymać odbieranie danych przesyłania strumieniowego audio, gdy wywołanie jest nadal aktywne.
- Automatyczne zatrzymywanie po rozłączeniu połączenia: przesyłanie strumieniowe audio automatycznie zatrzymuje się po rozłączeniu połączenia.
call_automation_client.get_call_connection(call_connection_id).stop_media_streaming(operation_context="stopMediaStreamingContext")
Obsługa strumieni audio na serwerze websocket
W tym przykładzie pokazano, jak nasłuchiwać strumieni audio przy użyciu serwera websocket.
async def handle_client(websocket):
print("Client connected")
try:
async for message in websocket:
json_object = json.loads(message)
kind = json_object["kind"]
if kind == "AudioData":
audio_data = json_object["audioData"]["data"]
# process your audio data
except websockets.exceptions.ConnectionClosedOK:
print("Client disconnected")
except websockets.exceptions.ConnectionClosedError as e:
print(f"Connection closed with error: {e}")
except Exception as e:
print(f"Unexpected error: {e}")
Pierwszy otrzymany pakiet zawiera metadane dotyczące strumienia, w tym ustawienia audio, takie jak kodowanie, częstotliwość próbkowania i inne szczegóły konfiguracji.
{
"kind": "AudioMetadata",
"audioMetadata": {
"subscriptionId": "89e8cb59-b991-48b0-b154-1db84f16a077",
"encoding": "PCM",
"sampleRate": 16000,
"channels": 1,
"length": 640
}
}
Po wysłaniu pakietu metadanych usługi Azure Communication Services (ACS) rozpoczną przesyłanie strumieniowe multimediów audio na serwer Protokołu WebSocket.
{
"kind": "AudioData",
"audioData": {
"timestamp": "2024-11-15T19:16:12.925Z",
"participantRawID": "8:acs:3d20e1de-0f28-41c5…",
"data": "5ADwAOMA6AD0A…",
"silent": false
}
}
Wysyłanie danych przesyłanych strumieniowo audio do usług Azure Communication Services
Jeśli dwukierunkowe przesyłanie strumieniowe jest włączone przy użyciu flagi w elemecie EnableBidirectional
MediaStreamingOptions
, możesz przesyłać strumieniowo dane audio z powrotem do usług Azure Communication Services, co odtwarza dźwięk w wywołaniu.
Gdy usługi Azure Communication Services rozpoczną przesyłanie strumieniowe dźwięku do serwera WebSocket, możesz przekazać dźwięk do usług sztucznej inteligencji. Gdy usługa sztucznej inteligencji przetworzy zawartość audio, możesz przesyłać strumieniowo dźwięk z powrotem do trwającego wywołania w usługach Azure Communication Services.
W tym przykładzie pokazano, w jaki sposób inna usługa, taka jak Azure OpenAI lub inne modele językowe oparte na głosach, przetwarza i przesyła dane audio z powrotem do wywołania.
async def send_data(websocket, buffer):
if websocket.open:
data = {
"Kind": "AudioData",
"AudioData": {
"Data": buffer
},
"StopAudio": None
}
# Serialize the server streaming data
serialized_data = json.dumps(data)
print(f"Out Streaming Data ---> {serialized_data}")
# Send the chunk over the WebSocket
await websocket.send(serialized_data)
Możesz również kontrolować odtwarzanie dźwięku w wywołaniu podczas przesyłania strumieniowego z powrotem do usług Azure Communication Services na podstawie logiki lub przepływu biznesowego. Na przykład po wykryciu aktywności głosowej i zatrzymaniu w kolejce dźwięku możesz wysłać komunikat zatrzymania za pośrednictwem protokołu WebSocket, aby zatrzymać odtwarzanie dźwięku w wywołaniu.
async def stop_audio(websocket):
if websocket.open:
data = {
"Kind": "StopAudio",
"AudioData": None,
"StopAudio": {}
}
# Serialize the server streaming data
serialized_data = json.dumps(data)
print(f"Out Streaming Data ---> {serialized_data}")
# Send the chunk over the WebSocket
await websocket.send(serialized_data)
Czyszczenie zasobów
Jeśli chcesz wyczyścić i usunąć subskrypcję usług Komunikacyjnych, możesz usunąć zasób lub grupę zasobów. Usunięcie grupy zasobów powoduje również usunięcie wszelkich innych skojarzonych z nią zasobów. Dowiedz się więcej o czyszczeniu zasobów.
Następne kroki
- Dowiedz się więcej na temat przesyłania strumieniowego audio.
- Dowiedz się więcej o usłudze Call Automation i jej funkcjach.
- Dowiedz się więcej o akcji Odtwarzania.
- Dowiedz się więcej o akcji Rozpoznawanie.