Udostępnij za pośrednictwem


Szybki start: przesyłanie strumieniowe audio po stronie serwera

Rozpoczynanie pracy ze strumieniami audio za pośrednictwem interfejsu API przesyłania strumieniowego audio usług Azure Communication Services. W tym przewodniku Quickstart przyjęto, że znasz już interfejsy API do automatyzacji połączeń, by zbudować zautomatyzowane rozwiązanie do routingu połączeń.

Funkcjonalności opisane w tym przewodniku szybkiego startu są obecnie dostępne w publicznej wersji zapoznawczej.

Wymagania wstępne

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 strumieniowych danych audio

Istnieje wiele sposobów na rozpoczęcie odbierania strumienia audio, które można skonfigurować za pomocą flagi startMediaStreaming w ustawieniach mediaStreamingOptions. 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, gdzie wysyłasz dane audio do rozmowy, 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

Aby włączyć automatyczne przesyłanie strumieniowe audio po nawiązaniu połączenia, ustaw flagę startMediaStreaming: true.

To ustawienie zapewnia, że przesyłanie strumieniowe audio jest uruchamiane automatycznie natychmiast po nawiązaniu połączenia.

MediaStreamingOptions mediaStreamingOptions = new MediaStreamingOptions(MediaStreamingAudioChannel.Unmixed);
 mediaStreamingOptions.TransportUri = new Uri(websocketUri);
 mediaStreamingOptions.EnableBidirectional = true;
 mediaStreamingOptions.AudioFormat = AudioFormat.Pcm24KMono;
 mediaStreamingOptions.EnableDtmfTones = true;
  
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ć API. Aby to zrobić, ustaw parametr startMediaStreaming na false (czyli wartość domyślną), a później w wywołaniu możesz użyć interfejsu API start, aby włączyć streaming multimediów.

MediaStreamingOptions mediaStreamingOptions = new MediaStreamingOptions(MediaStreamingAudioChannel.Unmixed);
 mediaStreamingOptions.TransportUri = new Uri(websocketUri);
 mediaStreamingOptions.EnableBidirectional = true;
 mediaStreamingOptions.AudioFormat = AudioFormat.Pcm24KMono;
 mediaStreamingOptions.EnableDtmfTones = true;

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",
  OperationCallbackUri = eventCallbackUri
};

await callMedia.StartMediaStreamingAsync(options);

Zatrzymywanie przesyłania strumieniowego audio

Aby zatrzymać odbieranie strumieni audio podczas rozmowy, możesz użyć API Zatrzymania strumieniowania. Umożliwia to zatrzymanie przesyłania strumieniowego audio w dowolnym momencie rozmowy. Istnieją dwa sposoby zatrzymania przesyłania strumieniowego audio;

  • Wyzwalanie interfejsu API zatrzymywania przesyłania strumieniowego: Użyj interfejsu API, aby zatrzymać odbieranie danych audio przesyłanych strumieniowo, gdy połączenie 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",
  OperationCallbackUri = eventCallbackUri
};

await callMedia.StopMediaStreamingAsync(options);

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.

Dodatkowe nagłówki

Identyfikator korelacji i identyfikator połączenia są teraz uwzględniane w nagłówkach WebSocket, co poprawia możliwość śledzenia x-ms-call-correlation-id oraz x-ms-call-connection-id. Są one wysyłane, gdy usługi Azure Communication Services próbują nawiązać połączenie z punktem końcowym.

{
  "kind": "AudioMetadata",
  "audioMetadata": {
    "subscriptionId": "89e8cb59-b991-48b0-b154-1db84f16a077",
    "encoding": "PCM",
    "sampleRate": 16000,
    "channels": 1,
    "length": 640
  }
}

Po wysłaniu pakietu metadanych usługa Azure Communication Services (ACS) zacznie przesyłać strumieniowo multimedia audio do serwera 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 znaczniku EnableBidirectionalMediaStreamingOptions, możesz przesyłać strumieniowo dane audio z powrotem do usług Azure Communication Services, a te odtwarzają dźwięk w połączeniu.

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. Po przetworzeniu zawartości audio przez usługę sztucznej inteligencji, możesz przesyłać dźwięk z powrotem do trwającego połączenia w ramach usług Azure Communication Services.

W przykładzie pokazano, jak inna usługa, taka jak Azure OpenAI lub inne duże modele językowe oparte na głosie, przetwarza i przesyła dane audio z powrotem do połączenia.

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 podczas rozmowy, strumieniowo przesyłając go z powrotem do usług Azure Communication Services zgodnie z logiką lub procesem biznesowym. Na przykład, gdy zostanie wykryta aktywność głosowa i chcesz zatrzymać odtwarzanie dźwięku, który jest w kolejce, możesz wysłać komunikat zatrzymania za pośrednictwem protokołu WebSocket, aby zapobiec odtwarzaniu dźwięku podczas rozmowy.

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

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 strumieniowych danych audio

Istnieje wiele sposobów na rozpoczęcie odbierania strumienia audio, które można skonfigurować za pomocą flagi startMediaStreaming w ustawieniach mediaStreamingOptions. 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, gdzie wysyłasz dane audio do rozmowy, 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

Aby włączyć automatyczne przesyłanie strumieniowe audio po nawiązaniu połączenia, ustaw flagę 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ć API. Aby to zrobić, ustaw parametr startMediaStreaming na false (czyli wartość domyślną), a później w wywołaniu możesz użyć interfejsu API start, aby włączyć streaming multimediów.

MediaStreamingOptions mediaStreamingOptions = new MediaStreamingOptions(MediaStreamingAudioChannel.UNMIXED);
mediaStreamingOptions.setTransportUrl(appConfig.getTransportUrl());
mediaStreamingOptions.setStartMediaStreaming(true);
mediaStreamingOptions.setEnableDtmfTones(true); // Allow receiving DTMF tones
mediaStreamingOptions.setEnableBidirectional(true);
mediaStreamingOptions.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 mediaStreamingOptions = new StartMediaStreamingOptions();
mediaStreamingOptions.setOperationContext("StartMediaStreamingContext");

client.getCallConnection(callConnectionId)
      .getCallMedia()
      .startMediaStreamingWithResponse(mediaStreamingOptions, Context.NONE);    

Zatrzymywanie przesyłania strumieniowego audio

Aby zatrzymać odbieranie strumieni audio podczas rozmowy, możesz użyć API Zatrzymania strumieniowania. Umożliwia to zatrzymanie przesyłania strumieniowego audio w dowolnym momencie rozmowy. Istnieją dwa sposoby zatrzymania przesyłania strumieniowego audio;

  • Wyzwalanie interfejsu API zatrzymywania przesyłania strumieniowego: Użyj interfejsu API, aby zatrzymać odbieranie danych audio przesyłanych strumieniowo, gdy połączenie jest nadal aktywne.
  • Automatyczne zatrzymywanie po rozłączeniu połączenia: przesyłanie strumieniowe audio automatycznie zatrzymuje się po rozłączeniu połączenia.
StopMediaStreamingOptions stopOptions = new StopMediaStreamingOptions();
stopOptions.setOperationContext("StopMediaStreamingContext");

client.getCallConnection(callConnectionId)
      .getCallMedia()
      .stopMediaStreamingWithResponse(stopOptions, 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.

Dodatkowe nagłówki

Identyfikator korelacji i identyfikator połączenia są teraz uwzględniane w nagłówkach WebSocket, co poprawia możliwość śledzenia x-ms-call-correlation-id oraz x-ms-call-connection-id. Są one wysyłane, gdy usługi Azure Communication Services próbują nawiązać połączenie z punktem końcowym.

{
  "kind": "AudioMetadata",
  "audioMetadata": {
    "subscriptionId": "89e8cb59-b991-48b0-b154-1db84f16a077",
    "encoding": "PCM",
    "sampleRate": 16000,
    "channels": 1,
    "length": 640
  }
}

Po wysłaniu pakietu metadanych usługa Azure Communication Services (ACS) zacznie przesyłać strumieniowo multimedia audio do serwera 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 znaczniku EnableBidirectionalMediaStreamingOptions, możesz przesyłać strumieniowo dane audio z powrotem do usług Azure Communication Services, a te odtwarzają dźwięk w połączeniu.

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. Po przetworzeniu zawartości audio przez usługę sztucznej inteligencji, możesz przesyłać dźwięk z powrotem do trwającego połączenia w ramach usług Azure Communication Services.

W przykładzie pokazano, jak inna usługa, taka jak Azure OpenAI lub inne duże modele językowe oparte na głosie, przetwarza i przesyła dane audio z powrotem do połączenia.

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 podczas rozmowy, strumieniowo przesyłając go z powrotem do usług Azure Communication Services zgodnie z logiką lub procesem biznesowym. Na przykład, gdy zostanie wykryta aktywność głosowa i chcesz zatrzymać odtwarzanie dźwięku, który jest w kolejce, możesz wysłać komunikat zatrzymania za pośrednictwem protokołu WebSocket, aby zapobiec odtwarzaniu dźwięku podczas rozmowy.

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

  • 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 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 strumieniowych danych audio

Istnieje wiele sposobów na rozpoczęcie odbierania strumienia audio, które można skonfigurować za pomocą flagi startMediaStreaming w ustawieniach mediaStreamingOptions. 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, gdzie wysyłasz dane audio do rozmowy, 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

Aby włączyć automatyczne przesyłanie strumieniowe audio po nawiązaniu połączenia, ustaw flagę startMediaStreaming: true.

To ustawienie zapewnia, że przesyłanie strumieniowe audio jest uruchamiane automatycznie natychmiast po nawiązaniu połączenia.

const mediaStreamingOptions = {
    transportUrl: "wss://YOUR_WEBSOCKET_URL", 
    transportType: "websocket",               
    contentType: "audio",                     
    audioChannelType: "mixed",                
    startMediaStreaming: true,
    enableDtmfTones: true,           
    enableBidirectional: true,                
    audioFormat: "Pcm24KMono"                 
};

const answerCallOptions = {
    mediaStreamingOptions: mediaStreamingOptions
};

answerCallResult = await acsClient.answerCall(
    incomingCallContext,
    callbackUri,
    answerCallOptions
);

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ć API. Aby to zrobić, ustaw parametr startMediaStreaming na false (czyli wartość domyślną), a później w wywołaniu możesz użyć interfejsu API start, aby włączyć streaming multimediów.

const mediaStreamingOptions: MediaStreamingOptions = {
	transportUrl:  "wss://YOUR_WEBSOCKET_URL",
	transportType: "websocket",
	contentType: "audio",
	audioChannelType: "unmixed",
	startMediaStreaming: false,
	enableDtmfTones: true,
	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 rozmowy, możesz użyć API Zatrzymania strumieniowania. Umożliwia to zatrzymanie przesyłania strumieniowego audio w dowolnym momencie rozmowy. Istnieją dwa sposoby zatrzymania przesyłania strumieniowego audio;

  • Wyzwalanie interfejsu API zatrzymywania przesyłania strumieniowego: Użyj interfejsu API, aby zatrzymać odbieranie danych audio przesyłanych strumieniowo, gdy połączenie 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.

Dodatkowe nagłówki

Identyfikator korelacji i identyfikator połączenia są teraz uwzględniane w nagłówkach WebSocket, co poprawia możliwość śledzenia x-ms-call-correlation-id oraz x-ms-call-connection-id. Są one wysyłane, gdy usługi Azure Communication Services próbują nawiązać połączenie z punktem końcowym.

{
  "kind": "AudioMetadata",
  "audioMetadata": {
    "subscriptionId": "89e8cb59-b991-48b0-b154-1db84f16a077",
    "encoding": "PCM",
    "sampleRate": 16000,
    "channels": 1,
    "length": 640
  }
}

Po wysłaniu pakietu metadanych usługa Azure Communication Services (ACS) zacznie przesyłać strumieniowo multimedia audio do serwera 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 znaczniku EnableBidirectionalMediaStreamingOptions, możesz przesyłać strumieniowo dane audio z powrotem do usług Azure Communication Services, a te odtwarzają dźwięk w połączeniu.

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. Po przetworzeniu zawartości audio przez usługę sztucznej inteligencji, możesz przesyłać dźwięk z powrotem do trwającego połączenia w ramach usług Azure Communication Services.

W przykładzie pokazano, jak inna usługa, taka jak Azure OpenAI lub inne duże modele językowe oparte na głosie, przetwarza i przesyła dane audio z powrotem do połączenia.

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 podczas rozmowy, strumieniowo przesyłając go z powrotem do usług Azure Communication Services zgodnie z logiką lub procesem biznesowym. Na przykład, gdy zostanie wykryta aktywność głosowa i chcesz zatrzymać odtwarzanie dźwięku, który jest w kolejce, możesz wysłać komunikat zatrzymania za pośrednictwem protokołu WebSocket, aby zapobiec odtwarzaniu dźwięku podczas rozmowy.

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

  • 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 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 strumieniowych danych audio

Istnieje wiele sposobów na rozpoczęcie odbierania strumienia audio, które można skonfigurować za pomocą flagi startMediaStreaming w ustawieniach mediaStreamingOptions. 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, gdzie wysyłasz dane audio do rozmowy, 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

Aby włączyć automatyczne przesyłanie strumieniowe audio po nawiązaniu połączenia, ustaw flagę startMediaStreaming: true.

To ustawienie zapewnia, że przesyłanie strumieniowe audio jest uruchamiane automatycznie natychmiast po nawiązaniu połączenia.

media_streaming_options = MediaStreamingOptions(
    transport_url=WEBSOCKET_URI_HOST,
    transport_type=StreamingTransportType.WEBSOCKET,
    content_type=MediaStreamingContentType.AUDIO,
    audio_channel_type=MediaStreamingAudioChannelType.MIXED,
    start_media_streaming=True,
    enable_bidirectional=True,
    enable_dtmf_tones=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ć API. Aby to zrobić, ustaw parametr startMediaStreaming na false (czyli wartość domyślną), a później w wywołaniu możesz użyć interfejsu API start, aby włączyć streaming multimediów.

media_streaming_options = MediaStreamingOptions(
    transport_url=WEBSOCKET_URI_HOST,
    transport_type=StreamingTransportType.WEBSOCKET,
    content_type=MediaStreamingContentType.AUDIO,
    audio_channel_type=MediaStreamingAudioChannelType.MIXED,
    start_media_streaming=True,
    enable_bidirectional=True,
    enable_dtmf_tones=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 rozmowy, możesz użyć API Zatrzymania strumieniowania. Umożliwia to zatrzymanie przesyłania strumieniowego audio w dowolnym momencie rozmowy. Istnieją dwa sposoby zatrzymania przesyłania strumieniowego audio;

  • Wyzwalanie interfejsu API zatrzymywania przesyłania strumieniowego: Użyj interfejsu API, aby zatrzymać odbieranie danych audio przesyłanych strumieniowo, gdy połączenie 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.

Dodatkowe nagłówki

Identyfikator korelacji i identyfikator połączenia są teraz uwzględniane w nagłówkach WebSocket, co poprawia możliwość śledzenia x-ms-call-correlation-id oraz x-ms-call-connection-id. Są one wysyłane, gdy usługi Azure Communication Services próbują nawiązać połączenie z punktem końcowym.

{
  "kind": "AudioMetadata",
  "audioMetadata": {
    "subscriptionId": "89e8cb59-b991-48b0-b154-1db84f16a077",
    "encoding": "PCM",
    "sampleRate": 16000,
    "channels": 1,
    "length": 640
  }
}

Po wysłaniu pakietu metadanych usługa Azure Communication Services (ACS) zacznie przesyłać strumieniowo multimedia audio do serwera 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 znaczniku EnableBidirectionalMediaStreamingOptions, możesz przesyłać strumieniowo dane audio z powrotem do usług Azure Communication Services, a te odtwarzają dźwięk w połączeniu.

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. Po przetworzeniu zawartości audio przez usługę sztucznej inteligencji, możesz przesyłać dźwięk z powrotem do trwającego połączenia w ramach usług Azure Communication Services.

W przykładzie pokazano, jak inna usługa, taka jak Azure OpenAI lub inne duże modele językowe oparte na głosie, przetwarza i przesyła dane audio z powrotem do połączenia.

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 podczas rozmowy, strumieniowo przesyłając go z powrotem do usług Azure Communication Services zgodnie z logiką lub procesem biznesowym. Na przykład, gdy zostanie wykryta aktywność głosowa i chcesz zatrzymać odtwarzanie dźwięku, który jest w kolejce, możesz wysłać komunikat zatrzymania za pośrednictwem protokołu WebSocket, aby zapobiec odtwarzaniu dźwięku podczas rozmowy.

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