Compartir a través de


Inicio rápido: Streaming de audio del lado servidor

Importante

La funcionalidad descrita en este artículo se encuentra actualmente en versión preliminar pública. Esta versión preliminar se ofrece sin un Acuerdo de Nivel de Servicio y no se recomienda para cargas de trabajo de producción. Es posible que algunas características no sean compatibles o que tengan sus funcionalidades limitadas. Para más información, consulte Términos de uso complementarios de las Versiones Preliminares de Microsoft Azure.

Introducción al uso de secuencias de audio a través de la API de Streaming de audio de Azure Communication Services. En este inicio rápido se da por supuesto que ya está familiarizado con las API de Automatización de llamadas para crear una solución de enrutamiento de llamadas automatizada.

La funcionalidad que se describe en este inicio rápido se encuentra actualmente en versión preliminar pública.

Requisitos previos

Configuración de un servidor websocket

Azure Communication Services requiere que la aplicación de servidor configure un servidor WebSocket para transmitir audio en tiempo real. WebSocket es un protocolo estandarizado que proporciona un canal de comunicación dúplex completo a través de una única conexión TCP.

Aquí puede revisar la documentación para más información sobre WebSockets y cómo se usan.

Recepción y envío de datos de streaming de audio

Hay varias maneras de empezar a recibir la secuencia de audio, que se pueden configurar mediante la marca startMediaStreaming en la configuración de mediaStreamingOptions. También puede especificar la frecuencia de muestreo deseada que se usa para recibir o enviar datos de audio mediante el parámetro audioFormat. Actualmente, los formatos admitidos son mono PCM 24K y mono PCM 16K, que es el predeterminado.

Para habilitar el streaming de audio bidireccional, donde va a enviar datos de audio a la llamada, puede habilitar la marca EnableBidirectional. Para detalles, consulte las especificaciones de API.

Inicio del streaming de audio al servidor web en el momento de responder a la llamada

Habilite el streaming de audio automático cuando se establezca la llamada estableciendo la marca startMediaStreaming: true.

Este valor garantiza que el streaming de audio se inicie automáticamente en cuanto se conecte la llamada.

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

Cuando Azure Communication Services recibe la dirección URL del servidor WebSocket, crea una conexión. Una vez que se realiza correctamente la conexión, se inicia el streaming.

Inicio del streaming de audio al servidor web mientras hay una llamada en curso

Para iniciar el streaming multimedia durante la llamada, puede usar la API. Para ello, establezca el parámetrostartMediaStreaming en false (que es el valor predeterminado) y, más adelante, en la llamada, puede usar la API de inicio para habilitar el streaming multimedia.

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

Detener el streaming de audio

Para dejar de recibir secuencias de audio durante una llamada, puede usar la API Detener streaming. Esto le permite detener el streaming de audio en cualquier punto de la llamada. Hay dos maneras de detener el streaming de audio;

  • Desencadenamiento de la API Detener streaming: use la API para dejar de recibir datos de streaming de audio mientras la llamada sigue activa.
  • Detención automática al desconectar la llamada: el streaming de audio se detiene automáticamente cuando la llamada se desconecta.
StopMediaStreamingOptions options = new StopMediaStreamingOptions() {
  OperationContext = "stopMediaStreamingContext"
};

await callMedia.StopMediaStreamingAsync();

Control de secuencias de audio en el servidor de websocket

En el ejemplo siguiente se muestra cómo escuchar secuencias de audio mediante el servidor de 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
      }
    }
  }
}

El primer paquete que recibe contiene metadatos sobre la secuencia, incluidos valores de audio, como la codificación, la frecuencia de muestreo y otros detalles de configuración.

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

Después de enviar el paquete de metadatos, Azure Communication Services (ACS) comenzará a transmitir contenido multimedia de audio al servidor de WebSocket.

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

Envío de datos de streaming de audio a Azure Communication Services

Si el streaming bidireccional está habilitado mediante la marca EnableBidirectional en MediaStreamingOptions, puede volver a transmitir datos de audio a Azure Communication Services, que reproduce el audio en la llamada.

Una vez que Azure Communication Services comienza a transmitir audio al servidor WebSocket, puede retransmitir el audio a los servicios de IA. Después de que el servicio de IA procese el contenido de audio, puede volver a transmitir el audio a la llamada en curso en Azure Communication Services.

En el ejemplo se muestra cómo otro servicio, como Azure OpenAI u otros modelos de lenguaje grande basados en voz, procesa y transmite los datos de audio de nuevo a la llamada.

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

También puede controlar la reproducción de audio en la llamada cuando vuelva a transmitir a Azure Communication Services, en función de la lógica o el flujo de negocio. Por ejemplo, cuando se detecta actividad de voz y quiere detener el audio en cola, puede enviar un mensaje de detención mediante WebSocket para impedir que el audio se reproduzca en la llamada.

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

Requisitos previos

Configuración de un servidor websocket

Azure Communication Services requiere que la aplicación de servidor configure un servidor WebSocket para transmitir audio en tiempo real. WebSocket es un protocolo estandarizado que proporciona un canal de comunicación dúplex completo a través de una única conexión TCP.

Aquí puede revisar la documentación para más información sobre WebSockets y cómo se usan.

Recepción y envío de datos de streaming de audio

Hay varias maneras de empezar a recibir la secuencia de audio, que se pueden configurar mediante la marca startMediaStreaming en la configuración de mediaStreamingOptions. También puede especificar la frecuencia de muestreo deseada que se usa para recibir o enviar datos de audio mediante el parámetro audioFormat. Actualmente, los formatos admitidos son mono PCM 24K y mono PCM 16K, que es el predeterminado.

Para habilitar el streaming de audio bidireccional, donde va a enviar datos de audio a la llamada, puede habilitar la marca EnableBidirectional. Para detalles, consulte las especificaciones de API.

Inicio del streaming de audio al servidor web en el momento de responder a la llamada

Habilite el streaming de audio automático cuando se establezca la llamada estableciendo la marca startMediaStreaming: true.

Este valor garantiza que el streaming de audio se inicie automáticamente en cuanto se conecte la llamada.

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

Cuando Azure Communication Services recibe la dirección URL del servidor WebSocket, crea una conexión. Una vez que se realiza correctamente la conexión, se inicia el streaming.

Inicio del streaming de audio al servidor web mientras hay una llamada en curso

Para iniciar el streaming multimedia durante la llamada, puede usar la API. Para ello, establezca el parámetrostartMediaStreaming en false (que es el valor predeterminado) y, más adelante, en la llamada, puede usar la API de inicio para habilitar el streaming multimedia.

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

Detener el streaming de audio

Para dejar de recibir secuencias de audio durante una llamada, puede usar la API Detener streaming. Esto le permite detener el streaming de audio en cualquier punto de la llamada. Hay dos maneras de detener el streaming de audio;

  • Desencadenamiento de la API Detener streaming: use la API para dejar de recibir datos de streaming de audio mientras la llamada sigue activa.
  • Detención automática al desconectar la llamada: el streaming de audio se detiene automáticamente cuando la llamada se desconecta.
StopMediaStreamingOptions stopMediaStreamingOptions = new StopMediaStreamingOptions()
    .setOperationContext("stopMediaStreamingContext");
callConnection.getCallMedia().stopMediaStreamingWithResponse(stopMediaStreamingOptions, Context.NONE);

Control de secuencias de audio en el servidor de websocket

En el ejemplo siguiente se muestra cómo escuchar secuencias de audio mediante el servidor de 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());
  }
}

El primer paquete que recibe contiene metadatos sobre la secuencia, incluidos valores de audio, como la codificación, la frecuencia de muestreo y otros detalles de configuración.

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

Después de enviar el paquete de metadatos, Azure Communication Services (ACS) comenzará a transmitir contenido multimedia de audio al servidor de WebSocket.

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

Envío de datos de streaming de audio a Azure Communication Services

Si el streaming bidireccional está habilitado mediante la marca EnableBidirectional en MediaStreamingOptions, puede volver a transmitir datos de audio a Azure Communication Services, que reproduce el audio en la llamada.

Una vez que Azure Communication Services comienza a transmitir audio al servidor WebSocket, puede retransmitir el audio a los servicios de IA. Después de que el servicio de IA procese el contenido de audio, puede volver a transmitir el audio a la llamada en curso en Azure Communication Services.

En el ejemplo se muestra cómo otro servicio, como Azure OpenAI u otros modelos de lenguaje grande basados en voz, procesa y transmite los datos de audio de nuevo a la llamada.

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

También puede controlar la reproducción de audio en la llamada cuando vuelva a transmitir a Azure Communication Services, en función de la lógica o el flujo de negocio. Por ejemplo, cuando se detecta actividad de voz y quiere detener el audio en cola, puede enviar un mensaje de detención mediante WebSocket para impedir que el audio se reproduzca en la llamada.

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

Requisitos previos

Configuración de un servidor websocket

Azure Communication Services requiere que la aplicación de servidor configure un servidor WebSocket para transmitir audio en tiempo real. WebSocket es un protocolo estandarizado que proporciona un canal de comunicación dúplex completo a través de una única conexión TCP.

Aquí puede revisar la documentación para más información sobre WebSockets y cómo se usan.

Recepción y envío de datos de streaming de audio

Hay varias maneras de empezar a recibir la secuencia de audio, que se pueden configurar mediante la marca startMediaStreaming en la configuración de mediaStreamingOptions. También puede especificar la frecuencia de muestreo deseada que se usa para recibir o enviar datos de audio mediante el parámetro audioFormat. Actualmente, los formatos admitidos son mono PCM 24K y mono PCM 16K, que es el predeterminado.

Para habilitar el streaming de audio bidireccional, donde va a enviar datos de audio a la llamada, puede habilitar la marca EnableBidirectional. Para detalles, consulte las especificaciones de API.

Inicio del streaming de audio al servidor web en el momento de responder a la llamada

Habilite el streaming de audio automático cuando se establezca la llamada estableciendo la marca startMediaStreaming: true.

Este valor garantiza que el streaming de audio se inicie automáticamente en cuanto se conecte la llamada.

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

Cuando Azure Communication Services recibe la dirección URL del servidor WebSocket, crea una conexión. Una vez que se realiza correctamente la conexión, se inicia el streaming.

Inicio del streaming de audio al servidor web mientras hay una llamada en curso

Para iniciar el streaming multimedia durante la llamada, puede usar la API. Para ello, establezca el parámetrostartMediaStreaming en false (que es el valor predeterminado) y, más adelante, en la llamada, puede usar la API de inicio para habilitar el streaming multimedia.

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

Detener el streaming de audio

Para dejar de recibir secuencias de audio durante una llamada, puede usar la API Detener streaming. Esto le permite detener el streaming de audio en cualquier punto de la llamada. Hay dos maneras de detener el streaming de audio;

  • Desencadenamiento de la API Detener streaming: use la API para dejar de recibir datos de streaming de audio mientras la llamada sigue activa.
  • Detención automática al desconectar la llamada: el streaming de audio se detiene automáticamente cuando la llamada se desconecta.
const stopMediaStreamingOptions: StopMediaStreamingOptions = {
	operationContext: "stopMediaStreaming"
}
await answerCallResult.callConnection.getCallMedia().stopMediaStreaming(stopMediaStreamingOptions);

Control de secuencias de audio en el servidor de websocket

En el ejemplo siguiente se muestra cómo escuchar secuencias de audio mediante el servidor de 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  
	}
}

El primer paquete que recibe contiene metadatos sobre la secuencia, incluidos valores de audio, como la codificación, la frecuencia de muestreo y otros detalles de configuración.

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

Después de enviar el paquete de metadatos, Azure Communication Services (ACS) comenzará a transmitir contenido multimedia de audio al servidor de WebSocket.

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

Envío de datos de streaming de audio a Azure Communication Services

Si el streaming bidireccional está habilitado mediante la marca EnableBidirectional en MediaStreamingOptions, puede volver a transmitir datos de audio a Azure Communication Services, que reproduce el audio en la llamada.

Una vez que Azure Communication Services comienza a transmitir audio al servidor WebSocket, puede retransmitir el audio a los servicios de IA. Después de que el servicio de IA procese el contenido de audio, puede volver a transmitir el audio a la llamada en curso en Azure Communication Services.

En el ejemplo se muestra cómo otro servicio, como Azure OpenAI u otros modelos de lenguaje grande basados en voz, procesa y transmite los datos de audio de nuevo a la llamada.

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

También puede controlar la reproducción de audio en la llamada cuando vuelva a transmitir a Azure Communication Services, en función de la lógica o el flujo de negocio. Por ejemplo, cuando se detecta actividad de voz y quiere detener el audio en cola, puede enviar un mensaje de detención mediante WebSocket para impedir que el audio se reproduzca en la llamada.

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

Requisitos previos

Configuración de un servidor websocket

Azure Communication Services requiere que la aplicación de servidor configure un servidor WebSocket para transmitir audio en tiempo real. WebSocket es un protocolo estandarizado que proporciona un canal de comunicación dúplex completo a través de una única conexión TCP.

Aquí puede revisar la documentación para más información sobre WebSockets y cómo se usan.

Recepción y envío de datos de streaming de audio

Hay varias maneras de empezar a recibir la secuencia de audio, que se pueden configurar mediante la marca startMediaStreaming en la configuración de mediaStreamingOptions. También puede especificar la frecuencia de muestreo deseada que se usa para recibir o enviar datos de audio mediante el parámetro audioFormat. Actualmente, los formatos admitidos son mono PCM 24K y mono PCM 16K, que es el predeterminado.

Para habilitar el streaming de audio bidireccional, donde va a enviar datos de audio a la llamada, puede habilitar la marca EnableBidirectional. Para detalles, consulte las especificaciones de API.

Inicio del streaming de audio al servidor web en el momento de responder a la llamada

Habilite el streaming de audio automático cuando se establezca la llamada estableciendo la marca startMediaStreaming: true.

Este valor garantiza que el streaming de audio se inicie automáticamente en cuanto se conecte la llamada.

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

Cuando Azure Communication Services recibe la dirección URL del servidor WebSocket, crea una conexión. Una vez que se realiza correctamente la conexión, se inicia el streaming.

Inicio del streaming de audio al servidor web mientras hay una llamada en curso

Para iniciar el streaming multimedia durante la llamada, puede usar la API. Para ello, establezca el parámetrostartMediaStreaming en false (que es el valor predeterminado) y, más adelante, en la llamada, puede usar la API de inicio para habilitar el streaming multimedia.

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

Detener el streaming de audio

Para dejar de recibir secuencias de audio durante una llamada, puede usar la API Detener streaming. Esto le permite detener el streaming de audio en cualquier punto de la llamada. Hay dos maneras de detener el streaming de audio;

  • Desencadenamiento de la API Detener streaming: use la API para dejar de recibir datos de streaming de audio mientras la llamada sigue activa.
  • Detención automática al desconectar la llamada: el streaming de audio se detiene automáticamente cuando la llamada se desconecta.
call_automation_client.get_call_connection(call_connection_id).stop_media_streaming(operation_context="stopMediaStreamingContext") 

Control de secuencias de audio en el servidor de websocket

En el ejemplo siguiente se muestra cómo escuchar secuencias de audio mediante el servidor de 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}")

El primer paquete que recibe contiene metadatos sobre la secuencia, incluidos valores de audio, como la codificación, la frecuencia de muestreo y otros detalles de configuración.

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

Después de enviar el paquete de metadatos, Azure Communication Services (ACS) comenzará a transmitir contenido multimedia de audio al servidor de WebSocket.

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

Envío de datos de streaming de audio a Azure Communication Services

Si el streaming bidireccional está habilitado mediante la marca EnableBidirectional en MediaStreamingOptions, puede volver a transmitir datos de audio a Azure Communication Services, que reproduce el audio en la llamada.

Una vez que Azure Communication Services comienza a transmitir audio al servidor WebSocket, puede retransmitir el audio a los servicios de IA. Después de que el servicio de IA procese el contenido de audio, puede volver a transmitir el audio a la llamada en curso en Azure Communication Services.

En el ejemplo se muestra cómo otro servicio, como Azure OpenAI u otros modelos de lenguaje grande basados en voz, procesa y transmite los datos de audio de nuevo a la llamada.

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)

También puede controlar la reproducción de audio en la llamada cuando vuelva a transmitir a Azure Communication Services, en función de la lógica o el flujo de negocio. Por ejemplo, cuando se detecta actividad de voz y quiere detener el audio en cola, puede enviar un mensaje de detención mediante WebSocket para impedir que el audio se reproduzca en la llamada.

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)

Limpieza de recursos

Si quiere limpiar y quitar una suscripción a Communication Services, puede eliminar el recurso o grupo de recursos. Al eliminar el grupo de recursos, también se elimina cualquier otro recurso que esté asociado a él. Obtenga más información sobre la limpieza de recursos.

Pasos siguientes