Compartilhar via


Início Rápido: Streaming de Áudio do Lado do servidor

Importante

A funcionalidade descrita neste artigo está atualmente em versão prévia pública. Essa versão prévia é fornecida sem um contrato de nível de serviço e não é recomendada para cargas de trabalho de produção. Alguns recursos podem não ter suporte ou podem ter restrição de recursos. Para obter mais informações, consulte Termos de Uso Complementares de Versões Prévias do Microsoft Azure.

Introdução ao uso de fluxos de áudio pela API de Streaming de Áudio dos Serviços de Comunicação do Azure. Este início rápido pressupõe que você já esteja familiarizado com as APIs de Automação de Chamadas para criar uma solução automatizada de roteamento de chamadas.

Atualmente, a funcionalidade descrita neste início rápido está em versão prévia pública.

Pré-requisitos

Configurar um servidor WebSocket

Os Serviços de Comunicação do Azure exigem que o aplicativo de servidor configure um servidor WebSocket para transmitir áudios em tempo real. O WebSocket é um protocolo padronizado que fornece um canal de comunicação full-duplex sobre uma única conexão TCP.

Você pode examinar a documentação aqui para saber mais sobre WebSockets e como usá-los.

Recebendo e enviando dados de streaming de áudio

Há várias maneiras de começar a receber o fluxo de áudio, que pode ser configurado usando o sinalizador startMediaStreaming na configuração do mediaStreamingOptions. Você também pode especificar a taxa de exemplo desejada usada para receber ou enviar dados de áudio usando o parâmetro audioFormat. Atualmente, os formatos compatíveis são PCM 24K mono e PCM 16K mono, com o padrão sendo PCM 16K mono.

Para habilitar o streaming de áudio bidirecional, em que você está enviando dados de áudio para a chamada, você pode habilitar o sinalizador EnableBidirectional. Para obter mais detalhes, consulte as especificações da API.

Inicie o streaming de áudio para o servidor Web no momento de atender a chamada

Habilite o streaming de áudio automático quando a chamada for estabelecida definindo o sinalizador startMediaStreaming: true.

Essa configuração garante que o streaming de áudio seja iniciado automaticamente assim que a chamada estiver conectada.

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);

Quando os Serviços de Comunicação do Azure recebem a URL do servidor WebSocket, ele estabelece uma conexão com ele. Depois que a conexão for feita com sucesso, o streaming será iniciado.

Inicie o streaming de áudio para o servidor Web enquanto uma chamada está em andamento

Para iniciar o streaming de mídia durante a chamada, você pode usar a API. Para fazer isso, defina o parâmetro startMediaStreaming como false (que é o padrão) e, posteriormente, na chamada, você pode usar a API inicial para habilitar o streaming de mídia.

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();

Parar a transmissão de áudio

Para parar de receber fluxos de áudio durante uma chamada, você pode usar a API Parar streaming. Isso permite que você interrompa o streaming de áudio a qualquer momento na chamada. Há duas maneiras pelas quais o streaming de áudio pode ser interrompido;

  • Disparando a API parar streaming: use a API para parar de receber dados de streaming de áudio enquanto a chamada ainda estiver ativa.
  • Interrupção automática na desconexão de chamada: o streaming de áudio é interrompido automaticamente quando a chamada é desconectada.
StopMediaStreamingOptions options = new StopMediaStreamingOptions() {
  OperationContext = "stopMediaStreamingContext"
};

await callMedia.StopMediaStreamingAsync();

Manipulando fluxos de áudio no seu servidor Websocket

Este exemplo demonstra como ouvir fluxos de áudio usando o servidor 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
      }
    }
  }
}

O primeiro pacote recebido contém metadados sobre o fluxo, incluindo configurações de áudio, como codificação, taxa de exemplo e outros detalhes de configuração.

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

Depois de enviar o pacote de metadados, os Serviços de Comunicação do Azure (ACS) começarão a transmitir mídia de áudio para o servidor WebSocket.

{
  "kind": "AudioData",
  "audioData": {
    "timestamp": "2024-11-15T19:16:12.925Z",
    "participantRawID": "8:acs:3d20e1de-0f28-41c5…",
    "data": "5ADwAOMA6AD0A…",
    "silent": false
  }
}

Enviar dados de streaming de áudio para os Serviços de Comunicação do Azure

Se o streaming bidirecional estiver habilitado usando o sinalizador EnableBidirectional no MediaStreamingOptions, você poderá transmitir dados de áudio de volta para os Serviços de Comunicação do Azure, que reproduz o áudio na chamada.

Depois que os Serviços de Comunicação do Azure começarem a transmitir áudio para o servidor WebSocket, você poderá retransmitir o áudio para seus serviços de IA. Depois que o serviço de IA processa o conteúdo de áudio, você pode transmitir o áudio de volta para a chamada em andamento nos Serviços de Comunicação do Azure.

O exemplo demonstra como outro serviço, como o OpenAI do Azure ou outros Modelos de Linguagem Grandes baseados em voz, processa e transmite os dados de áudio de volta para a chamada.

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);

Você também pode controlar a reprodução de áudio na chamada ao transmitir de volta para os Serviços de Comunicação do Azure, com base em sua lógica ou fluxo de negócios. Por exemplo, quando a atividade de voz é detectada e você deseja interromper o áudio enfileirado, você pode enviar uma mensagem de parada por meio do WebSocket para impedir que o áudio seja reproduzido na chamada.

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);

Pré-requisitos

Configurar um servidor WebSocket

Os Serviços de Comunicação do Azure exigem que o aplicativo de servidor configure um servidor WebSocket para transmitir áudios em tempo real. O WebSocket é um protocolo padronizado que fornece um canal de comunicação full-duplex sobre uma única conexão TCP.

Você pode examinar a documentação aqui para saber mais sobre WebSockets e como usá-los.

Recebendo e enviando dados de streaming de áudio

Há várias maneiras de começar a receber o fluxo de áudio, que pode ser configurado usando o sinalizador startMediaStreaming na configuração do mediaStreamingOptions. Você também pode especificar a taxa de exemplo desejada usada para receber ou enviar dados de áudio usando o parâmetro audioFormat. Atualmente, os formatos compatíveis são PCM 24K mono e PCM 16K mono, com o padrão sendo PCM 16K mono.

Para habilitar o streaming de áudio bidirecional, em que você está enviando dados de áudio para a chamada, você pode habilitar o sinalizador EnableBidirectional. Para obter mais detalhes, consulte as especificações da API.

Inicie o streaming de áudio para o servidor Web no momento de atender a chamada

Habilite o streaming de áudio automático quando a chamada for estabelecida definindo o sinalizador startMediaStreaming: true.

Essa configuração garante que o streaming de áudio seja iniciado automaticamente assim que a chamada estiver conectada.

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);

Quando os Serviços de Comunicação do Azure recebem a URL do servidor WebSocket, ele estabelece uma conexão com ele. Depois que a conexão for feita com sucesso, o streaming será iniciado.

Inicie o streaming de áudio para o servidor Web enquanto uma chamada está em andamento

Para iniciar o streaming de mídia durante a chamada, você pode usar a API. Para fazer isso, defina o parâmetro startMediaStreaming como false (que é o padrão) e, posteriormente, na chamada, você pode usar a API inicial para habilitar o streaming de mídia.

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);     

Parar a transmissão de áudio

Para parar de receber fluxos de áudio durante uma chamada, você pode usar a API Parar streaming. Isso permite que você interrompa o streaming de áudio a qualquer momento na chamada. Há duas maneiras pelas quais o streaming de áudio pode ser interrompido;

  • Disparando a API parar streaming: use a API para parar de receber dados de streaming de áudio enquanto a chamada ainda estiver ativa.
  • Interrupção automática na desconexão de chamada: o streaming de áudio é interrompido automaticamente quando a chamada é desconectada.
StopMediaStreamingOptions stopMediaStreamingOptions = new StopMediaStreamingOptions()
    .setOperationContext("stopMediaStreamingContext");
callConnection.getCallMedia().stopMediaStreamingWithResponse(stopMediaStreamingOptions, Context.NONE);

Manipulando fluxos de áudio no seu servidor Websocket

Este exemplo demonstra como ouvir fluxos de áudio usando o servidor 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());
  }
}

O primeiro pacote recebido contém metadados sobre o fluxo, incluindo configurações de áudio, como codificação, taxa de exemplo e outros detalhes de configuração.

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

Depois de enviar o pacote de metadados, os Serviços de Comunicação do Azure (ACS) começarão a transmitir mídia de áudio para o servidor WebSocket.

{
  "kind": "AudioData",
  "audioData": {
    "timestamp": "2024-11-15T19:16:12.925Z",
    "participantRawID": "8:acs:3d20e1de-0f28-41c5…",
    "data": "5ADwAOMA6AD0A…",
    "silent": false
  }
}

Enviar dados de streaming de áudio para os Serviços de Comunicação do Azure

Se o streaming bidirecional estiver habilitado usando o sinalizador EnableBidirectional no MediaStreamingOptions, você poderá transmitir dados de áudio de volta para os Serviços de Comunicação do Azure, que reproduz o áudio na chamada.

Depois que os Serviços de Comunicação do Azure começarem a transmitir áudio para o servidor WebSocket, você poderá retransmitir o áudio para seus serviços de IA. Depois que o serviço de IA processa o conteúdo de áudio, você pode transmitir o áudio de volta para a chamada em andamento nos Serviços de Comunicação do Azure.

O exemplo demonstra como outro serviço, como o OpenAI do Azure ou outros Modelos de Linguagem Grandes baseados em voz, processa e transmite os dados de áudio de volta para a chamada.

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();
        }
    }
}

Você também pode controlar a reprodução de áudio na chamada ao transmitir de volta para os Serviços de Comunicação do Azure, com base em sua lógica ou fluxo de negócios. Por exemplo, quando a atividade de voz é detectada e você deseja interromper o áudio enfileirado, você pode enviar uma mensagem de parada por meio do WebSocket para impedir que o áudio seja reproduzido na chamada.

private void stopAudio(Session session) {
    if (session.isOpen()) {
        try {
            var serializedData = OutStreamingData.getStopAudioForOutbound();
            session.getAsyncRemote().sendText(serializedData);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Pré-requisitos

Configurar um servidor WebSocket

Os Serviços de Comunicação do Azure exigem que o aplicativo de servidor configure um servidor WebSocket para transmitir áudios em tempo real. O WebSocket é um protocolo padronizado que fornece um canal de comunicação full-duplex sobre uma única conexão TCP.

Você pode examinar a documentação aqui para saber mais sobre WebSockets e como usá-los.

Recebendo e enviando dados de streaming de áudio

Há várias maneiras de começar a receber o fluxo de áudio, que pode ser configurado usando o sinalizador startMediaStreaming na configuração do mediaStreamingOptions. Você também pode especificar a taxa de exemplo desejada usada para receber ou enviar dados de áudio usando o parâmetro audioFormat. Atualmente, os formatos compatíveis são PCM 24K mono e PCM 16K mono, com o padrão sendo PCM 16K mono.

Para habilitar o streaming de áudio bidirecional, em que você está enviando dados de áudio para a chamada, você pode habilitar o sinalizador EnableBidirectional. Para obter mais detalhes, consulte as especificações da API.

Inicie o streaming de áudio para o servidor Web no momento de atender a chamada

Habilite o streaming de áudio automático quando a chamada for estabelecida definindo o sinalizador startMediaStreaming: true.

Essa configuração garante que o streaming de áudio seja iniciado automaticamente assim que a chamada estiver conectada.

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);

Quando os Serviços de Comunicação do Azure recebem a URL do servidor WebSocket, ele estabelece uma conexão com ele. Depois que a conexão for feita com sucesso, o streaming será iniciado.

Inicie o streaming de áudio para o servidor Web enquanto uma chamada está em andamento

Para iniciar o streaming de mídia durante a chamada, você pode usar a API. Para fazer isso, defina o parâmetro startMediaStreaming como false (que é o padrão) e, posteriormente, na chamada, você pode usar a API inicial para habilitar o streaming de mídia.

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);

Parar a transmissão de áudio

Para parar de receber fluxos de áudio durante uma chamada, você pode usar a API Parar streaming. Isso permite que você interrompa o streaming de áudio a qualquer momento na chamada. Há duas maneiras pelas quais o streaming de áudio pode ser interrompido;

  • Disparando a API parar streaming: use a API para parar de receber dados de streaming de áudio enquanto a chamada ainda estiver ativa.
  • Interrupção automática na desconexão de chamada: o streaming de áudio é interrompido automaticamente quando a chamada é desconectada.
const stopMediaStreamingOptions: StopMediaStreamingOptions = {
	operationContext: "stopMediaStreaming"
}
await answerCallResult.callConnection.getCallMedia().stopMediaStreaming(stopMediaStreamingOptions);

Manipulando fluxos de áudio no seu servidor Websocket

Este exemplo demonstra como ouvir fluxos de áudio usando o servidor 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  
	}
}

O primeiro pacote recebido contém metadados sobre o fluxo, incluindo configurações de áudio, como codificação, taxa de exemplo e outros detalhes de configuração.

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

Depois de enviar o pacote de metadados, os Serviços de Comunicação do Azure (ACS) começarão a transmitir mídia de áudio para o servidor WebSocket.

{
  "kind": "AudioData",
  "audioData": {
    "timestamp": "2024-11-15T19:16:12.925Z",
    "participantRawID": "8:acs:3d20e1de-0f28-41c5…",
    "data": "5ADwAOMA6AD0A…",
    "silent": false
  }
}

Enviar dados de streaming de áudio para os Serviços de Comunicação do Azure

Se o streaming bidirecional estiver habilitado usando o sinalizador EnableBidirectional no MediaStreamingOptions, você poderá transmitir dados de áudio de volta para os Serviços de Comunicação do Azure, que reproduz o áudio na chamada.

Depois que os Serviços de Comunicação do Azure começarem a transmitir áudio para o servidor WebSocket, você poderá retransmitir o áudio para seus serviços de IA. Depois que o serviço de IA processa o conteúdo de áudio, você pode transmitir o áudio de volta para a chamada em andamento nos Serviços de Comunicação do Azure.

O exemplo demonstra como outro serviço, como o OpenAI do Azure ou outros Modelos de Linguagem Grandes baseados em voz, processa e transmite os dados de áudio de volta para a chamada.

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);
    }
}

Você também pode controlar a reprodução de áudio na chamada ao transmitir de volta para os Serviços de Comunicação do Azure, com base em sua lógica ou fluxo de negócios. Por exemplo, quando a atividade de voz é detectada e você deseja interromper o áudio enfileirado, você pode enviar uma mensagem de parada por meio do WebSocket para impedir que o áudio seja reproduzido na chamada.

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);
	}
}

Pré-requisitos

Configurar um servidor WebSocket

Os Serviços de Comunicação do Azure exigem que o aplicativo de servidor configure um servidor WebSocket para transmitir áudios em tempo real. O WebSocket é um protocolo padronizado que fornece um canal de comunicação full-duplex sobre uma única conexão TCP.

Você pode examinar a documentação aqui para saber mais sobre WebSockets e como usá-los.

Recebendo e enviando dados de streaming de áudio

Há várias maneiras de começar a receber o fluxo de áudio, que pode ser configurado usando o sinalizador startMediaStreaming na configuração do mediaStreamingOptions. Você também pode especificar a taxa de exemplo desejada usada para receber ou enviar dados de áudio usando o parâmetro audioFormat. Atualmente, os formatos compatíveis são PCM 24K mono e PCM 16K mono, com o padrão sendo PCM 16K mono.

Para habilitar o streaming de áudio bidirecional, em que você está enviando dados de áudio para a chamada, você pode habilitar o sinalizador EnableBidirectional. Para obter mais detalhes, consulte as especificações da API.

Inicie o streaming de áudio para o servidor Web no momento de atender a chamada

Habilite o streaming de áudio automático quando a chamada for estabelecida definindo o sinalizador startMediaStreaming: true.

Essa configuração garante que o streaming de áudio seja iniciado automaticamente assim que a chamada estiver conectada.

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,
)

Quando os Serviços de Comunicação do Azure recebem a URL do servidor WebSocket, ele estabelece uma conexão com ele. Depois que a conexão for feita com sucesso, o streaming será iniciado.

Inicie o streaming de áudio para o servidor Web enquanto uma chamada está em andamento

Para iniciar o streaming de mídia durante a chamada, você pode usar a API. Para fazer isso, defina o parâmetro startMediaStreaming como false (que é o padrão) e, posteriormente, na chamada, você pode usar a API inicial para habilitar o streaming de mídia.

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"
)

Parar a transmissão de áudio

Para parar de receber fluxos de áudio durante uma chamada, você pode usar a API Parar streaming. Isso permite que você interrompa o streaming de áudio a qualquer momento na chamada. Há duas maneiras pelas quais o streaming de áudio pode ser interrompido;

  • Disparando a API parar streaming: use a API para parar de receber dados de streaming de áudio enquanto a chamada ainda estiver ativa.
  • Interrupção automática na desconexão de chamada: o streaming de áudio é interrompido automaticamente quando a chamada é desconectada.
call_automation_client.get_call_connection(call_connection_id).stop_media_streaming(operation_context="stopMediaStreamingContext") 

Manipulando fluxos de áudio no seu servidor Websocket

Este exemplo demonstra como ouvir fluxos de áudio usando o servidor 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}")

O primeiro pacote recebido contém metadados sobre o fluxo, incluindo configurações de áudio, como codificação, taxa de exemplo e outros detalhes de configuração.

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

Depois de enviar o pacote de metadados, os Serviços de Comunicação do Azure (ACS) começarão a transmitir mídia de áudio para o servidor WebSocket.

{
  "kind": "AudioData",
  "audioData": {
    "timestamp": "2024-11-15T19:16:12.925Z",
    "participantRawID": "8:acs:3d20e1de-0f28-41c5…",
    "data": "5ADwAOMA6AD0A…",
    "silent": false
  }
}

Enviar dados de streaming de áudio para os Serviços de Comunicação do Azure

Se o streaming bidirecional estiver habilitado usando o sinalizador EnableBidirectional no MediaStreamingOptions, você poderá transmitir dados de áudio de volta para os Serviços de Comunicação do Azure, que reproduz o áudio na chamada.

Depois que os Serviços de Comunicação do Azure começarem a transmitir áudio para o servidor WebSocket, você poderá retransmitir o áudio para seus serviços de IA. Depois que o serviço de IA processa o conteúdo de áudio, você pode transmitir o áudio de volta para a chamada em andamento nos Serviços de Comunicação do Azure.

O exemplo demonstra como outro serviço, como o OpenAI do Azure ou outros Modelos de Linguagem Grandes baseados em voz, processa e transmite os dados de áudio de volta para a chamada.

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)

Você também pode controlar a reprodução de áudio na chamada ao transmitir de volta para os Serviços de Comunicação do Azure, com base em sua lógica ou fluxo de negócios. Por exemplo, quando a atividade de voz é detectada e você deseja interromper o áudio enfileirado, você pode enviar uma mensagem de parada por meio do WebSocket para impedir que o áudio seja reproduzido na chamada.

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)

Limpar os recursos

Se quiser limpar e remover uma assinatura dos Serviços de Comunicação, exclua o recurso ou o grupo de recursos. Excluir o grupo de recursos também exclui todos os recursos associados a ele. Saiba mais sobre como limpar recursos.

Próximas etapas