Condividi tramite


Guida introduttiva: Streaming audio sul lato server

Importante

Attualmente la funzionalità descritta in questo articolo è disponibile in anteprima pubblica. Questa versione di anteprima viene fornita senza contratto di servizio, pertanto se ne sconsiglia l’uso per i carichi di lavoro in ambienti di produzione. Alcune funzionalità potrebbero non essere supportate o potrebbero presentare funzionalità limitate. Per altre informazioni, vedere le Condizioni supplementari per l'uso delle anteprime di Microsoft Azure.

Introduzione all'uso di flussi audio tramite Servizi di comunicazione di Azure API Streaming audio. Questo argomento di avvio rapido presuppone che si abbia già familiarità con le API di automazione delle chiamate per creare una soluzione di routing delle chiamate automatizzata.

La funzionalità descritta in questa guida introduttiva è attualmente disponibile in anteprima pubblica.

Prerequisiti

Configurare un server Websocket

Servizi di comunicazione di Azure richiede all'applicazione server di configurare un server WebSocket per trasmettere l'audio in tempo reale. WebSocket è un protocollo standardizzato che fornisce un canale di comunicazioni full duplex su una singola connessione TCP.

È possibile esaminare la documentazione qui per altre informazioni sui WebSocket e su come usarli.

Ricezione e invio di dati di streaming audio

Esistono diversi modi per iniziare a ricevere il flusso audio, che può essere configurato usando il startMediaStreaming flag nella mediaStreamingOptions configurazione. È anche possibile specificare la frequenza di campionamento desiderata usata per la ricezione o l'invio di dati audio usando il audioFormat parametro . I formati attualmente supportati sono PCM mono 24K e PCM 16K mono, con il valore predefinito PCM 16K mono.

Per abilitare lo streaming audio bidirezionale, in cui si inviano dati audio nella chiamata, è possibile abilitare il EnableBidirectional flag. Per altri dettagli, vedere le specifiche dell'API.

Avviare lo streaming audio nel server Web al momento della risposta alla chiamata

Abilitare lo streaming audio automatico quando viene stabilita la chiamata impostando il flag startMediaStreaming: true.

Questa impostazione garantisce che lo streaming audio venga avviato automaticamente non appena la chiamata è connessa.

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 Servizi di comunicazione di Azure riceve l'URL per il server WebSocket, stabilisce una connessione. Una volta stabilita la connessione, viene avviato lo streaming.

Avviare lo streaming audio nel server Web mentre è in corso una chiamata

Per avviare lo streaming multimediale durante la chiamata, è possibile usare l'API. A tale scopo, impostare il startMediaStreaming parametro su false (ovvero l'impostazione predefinita) e successivamente nella chiamata, è possibile usare l'API start per abilitare lo streaming multimediale.

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

Arrestare lo streaming audio

Per interrompere la ricezione di flussi audio durante una chiamata, è possibile usare l'API Arresta streaming. In questo modo è possibile arrestare lo streaming audio in qualsiasi punto della chiamata. Esistono due modi in cui è possibile arrestare lo streaming audio;

  • Attivazione dell'API Arresta streaming: usare l'API per interrompere la ricezione di dati di streaming audio mentre la chiamata è ancora attiva.
  • Arresto automatico alla disconnessione della chiamata: lo streaming audio si arresta automaticamente quando la chiamata viene disconnessa.
StopMediaStreamingOptions options = new StopMediaStreamingOptions() {
  OperationContext = "stopMediaStreamingContext"
};

await callMedia.StopMediaStreamingAsync();

Gestione dei flussi audio nel server Websocket

Questo esempio illustra come ascoltare i flussi audio usando il server 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
      }
    }
  }
}

Il primo pacchetto ricevuto contiene i metadati relativi al flusso, incluse le impostazioni audio, ad esempio la codifica, la frequenza di campionamento e altri dettagli di configurazione.

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

Dopo l'invio del pacchetto di metadati, Servizi di comunicazione di Azure (ACS) inizierà a trasmettere contenuti multimediali audio al server WebSocket.

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

Invio di dati di streaming audio a Servizi di comunicazione di Azure

Se lo streaming bidirezionale è abilitato usando il EnableBidirectional flag in MediaStreamingOptions, è possibile trasmettere i dati audio a Servizi di comunicazione di Azure, che riproduce l'audio nella chiamata.

Quando Servizi di comunicazione di Azure inizia lo streaming audio nel server WebSocket, è possibile inoltrare l'audio ai servizi di intelligenza artificiale. Dopo che il servizio di intelligenza artificiale elabora il contenuto audio, è possibile trasmettere l'audio alla chiamata in corso in Servizi di comunicazione di Azure.

L'esempio illustra come un altro servizio, ad esempio Azure OpenAI o altri modelli di linguaggio Large basati su voce, elabora e trasmette i dati audio alla chiamata.

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

È anche possibile controllare la riproduzione dell'audio nella chiamata quando si esegue il flusso verso Servizi di comunicazione di Azure, in base alla logica o al flusso di business. Ad esempio, quando viene rilevata un'attività vocale e si vuole arrestare l'audio in coda, è possibile inviare un messaggio di arresto tramite WebSocket per interrompere la riproduzione dell'audio nella chiamata.

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

Prerequisiti

Configurare un server Websocket

Servizi di comunicazione di Azure richiede all'applicazione server di configurare un server WebSocket per trasmettere l'audio in tempo reale. WebSocket è un protocollo standardizzato che fornisce un canale di comunicazioni full duplex su una singola connessione TCP.

È possibile esaminare la documentazione qui per altre informazioni sui WebSocket e su come usarli.

Ricezione e invio di dati di streaming audio

Esistono diversi modi per iniziare a ricevere il flusso audio, che può essere configurato usando il startMediaStreaming flag nella mediaStreamingOptions configurazione. È anche possibile specificare la frequenza di campionamento desiderata usata per la ricezione o l'invio di dati audio usando il audioFormat parametro . I formati attualmente supportati sono PCM mono 24K e PCM 16K mono, con il valore predefinito PCM 16K mono.

Per abilitare lo streaming audio bidirezionale, in cui si inviano dati audio nella chiamata, è possibile abilitare il EnableBidirectional flag. Per altri dettagli, vedere le specifiche dell'API.

Avviare lo streaming audio nel server Web al momento della risposta alla chiamata

Abilitare lo streaming audio automatico quando viene stabilita la chiamata impostando il flag startMediaStreaming: true.

Questa impostazione garantisce che lo streaming audio venga avviato automaticamente non appena la chiamata è connessa.

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 Servizi di comunicazione di Azure riceve l'URL per il server WebSocket, stabilisce una connessione. Una volta stabilita la connessione, viene avviato lo streaming.

Avviare lo streaming audio nel server Web mentre è in corso una chiamata

Per avviare lo streaming multimediale durante la chiamata, è possibile usare l'API. A tale scopo, impostare il startMediaStreaming parametro su false (ovvero l'impostazione predefinita) e successivamente nella chiamata, è possibile usare l'API start per abilitare lo streaming multimediale.

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

Arrestare lo streaming audio

Per interrompere la ricezione di flussi audio durante una chiamata, è possibile usare l'API Arresta streaming. In questo modo è possibile arrestare lo streaming audio in qualsiasi punto della chiamata. Esistono due modi in cui è possibile arrestare lo streaming audio;

  • Attivazione dell'API Arresta streaming: usare l'API per interrompere la ricezione di dati di streaming audio mentre la chiamata è ancora attiva.
  • Arresto automatico alla disconnessione della chiamata: lo streaming audio si arresta automaticamente quando la chiamata viene disconnessa.
StopMediaStreamingOptions stopMediaStreamingOptions = new StopMediaStreamingOptions()
    .setOperationContext("stopMediaStreamingContext");
callConnection.getCallMedia().stopMediaStreamingWithResponse(stopMediaStreamingOptions, Context.NONE);

Gestione dei flussi audio nel server Websocket

Questo esempio illustra come ascoltare i flussi audio usando il server 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());
  }
}

Il primo pacchetto ricevuto contiene i metadati relativi al flusso, incluse le impostazioni audio, ad esempio la codifica, la frequenza di campionamento e altri dettagli di configurazione.

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

Dopo l'invio del pacchetto di metadati, Servizi di comunicazione di Azure (ACS) inizierà a trasmettere contenuti multimediali audio al server WebSocket.

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

Invio di dati di streaming audio a Servizi di comunicazione di Azure

Se lo streaming bidirezionale è abilitato usando il EnableBidirectional flag in MediaStreamingOptions, è possibile trasmettere i dati audio a Servizi di comunicazione di Azure, che riproduce l'audio nella chiamata.

Quando Servizi di comunicazione di Azure inizia lo streaming audio nel server WebSocket, è possibile inoltrare l'audio ai servizi di intelligenza artificiale. Dopo che il servizio di intelligenza artificiale elabora il contenuto audio, è possibile trasmettere l'audio alla chiamata in corso in Servizi di comunicazione di Azure.

L'esempio illustra come un altro servizio, ad esempio Azure OpenAI o altri modelli di linguaggio Large basati su voce, elabora e trasmette i dati audio alla chiamata.

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

È anche possibile controllare la riproduzione dell'audio nella chiamata quando si esegue il flusso verso Servizi di comunicazione di Azure, in base alla logica o al flusso di business. Ad esempio, quando viene rilevata un'attività vocale e si vuole arrestare l'audio in coda, è possibile inviare un messaggio di arresto tramite WebSocket per interrompere la riproduzione dell'audio nella chiamata.

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

Prerequisiti

Configurare un server Websocket

Servizi di comunicazione di Azure richiede all'applicazione server di configurare un server WebSocket per trasmettere l'audio in tempo reale. WebSocket è un protocollo standardizzato che fornisce un canale di comunicazioni full duplex su una singola connessione TCP.

È possibile esaminare la documentazione qui per altre informazioni sui WebSocket e su come usarli.

Ricezione e invio di dati di streaming audio

Esistono diversi modi per iniziare a ricevere il flusso audio, che può essere configurato usando il startMediaStreaming flag nella mediaStreamingOptions configurazione. È anche possibile specificare la frequenza di campionamento desiderata usata per la ricezione o l'invio di dati audio usando il audioFormat parametro . I formati attualmente supportati sono PCM mono 24K e PCM 16K mono, con il valore predefinito PCM 16K mono.

Per abilitare lo streaming audio bidirezionale, in cui si inviano dati audio nella chiamata, è possibile abilitare il EnableBidirectional flag. Per altri dettagli, vedere le specifiche dell'API.

Avviare lo streaming audio nel server Web al momento della risposta alla chiamata

Abilitare lo streaming audio automatico quando viene stabilita la chiamata impostando il flag startMediaStreaming: true.

Questa impostazione garantisce che lo streaming audio venga avviato automaticamente non appena la chiamata è connessa.

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 Servizi di comunicazione di Azure riceve l'URL per il server WebSocket, stabilisce una connessione. Una volta stabilita la connessione, viene avviato lo streaming.

Avviare lo streaming audio nel server Web mentre è in corso una chiamata

Per avviare lo streaming multimediale durante la chiamata, è possibile usare l'API. A tale scopo, impostare il startMediaStreaming parametro su false (ovvero l'impostazione predefinita) e successivamente nella chiamata, è possibile usare l'API start per abilitare lo streaming multimediale.

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

Arrestare lo streaming audio

Per interrompere la ricezione di flussi audio durante una chiamata, è possibile usare l'API Arresta streaming. In questo modo è possibile arrestare lo streaming audio in qualsiasi punto della chiamata. Esistono due modi in cui è possibile arrestare lo streaming audio;

  • Attivazione dell'API Arresta streaming: usare l'API per interrompere la ricezione di dati di streaming audio mentre la chiamata è ancora attiva.
  • Arresto automatico alla disconnessione della chiamata: lo streaming audio si arresta automaticamente quando la chiamata viene disconnessa.
const stopMediaStreamingOptions: StopMediaStreamingOptions = {
	operationContext: "stopMediaStreaming"
}
await answerCallResult.callConnection.getCallMedia().stopMediaStreaming(stopMediaStreamingOptions);

Gestione dei flussi audio nel server Websocket

Questo esempio illustra come ascoltare i flussi audio usando il server 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  
	}
}

Il primo pacchetto ricevuto contiene i metadati relativi al flusso, incluse le impostazioni audio, ad esempio la codifica, la frequenza di campionamento e altri dettagli di configurazione.

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

Dopo l'invio del pacchetto di metadati, Servizi di comunicazione di Azure (ACS) inizierà a trasmettere contenuti multimediali audio al server WebSocket.

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

Invio di dati di streaming audio a Servizi di comunicazione di Azure

Se lo streaming bidirezionale è abilitato usando il EnableBidirectional flag in MediaStreamingOptions, è possibile trasmettere i dati audio a Servizi di comunicazione di Azure, che riproduce l'audio nella chiamata.

Quando Servizi di comunicazione di Azure inizia lo streaming audio nel server WebSocket, è possibile inoltrare l'audio ai servizi di intelligenza artificiale. Dopo che il servizio di intelligenza artificiale elabora il contenuto audio, è possibile trasmettere l'audio alla chiamata in corso in Servizi di comunicazione di Azure.

L'esempio illustra come un altro servizio, ad esempio Azure OpenAI o altri modelli di linguaggio Large basati su voce, elabora e trasmette i dati audio alla chiamata.

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

È anche possibile controllare la riproduzione dell'audio nella chiamata quando si esegue il flusso verso Servizi di comunicazione di Azure, in base alla logica o al flusso di business. Ad esempio, quando viene rilevata un'attività vocale e si vuole arrestare l'audio in coda, è possibile inviare un messaggio di arresto tramite WebSocket per interrompere la riproduzione dell'audio nella chiamata.

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

Prerequisiti

Configurare un server Websocket

Servizi di comunicazione di Azure richiede all'applicazione server di configurare un server WebSocket per trasmettere l'audio in tempo reale. WebSocket è un protocollo standardizzato che fornisce un canale di comunicazioni full duplex su una singola connessione TCP.

È possibile esaminare la documentazione qui per altre informazioni sui WebSocket e su come usarli.

Ricezione e invio di dati di streaming audio

Esistono diversi modi per iniziare a ricevere il flusso audio, che può essere configurato usando il startMediaStreaming flag nella mediaStreamingOptions configurazione. È anche possibile specificare la frequenza di campionamento desiderata usata per la ricezione o l'invio di dati audio usando il audioFormat parametro . I formati attualmente supportati sono PCM mono 24K e PCM 16K mono, con il valore predefinito PCM 16K mono.

Per abilitare lo streaming audio bidirezionale, in cui si inviano dati audio nella chiamata, è possibile abilitare il EnableBidirectional flag. Per altri dettagli, vedere le specifiche dell'API.

Avviare lo streaming audio nel server Web al momento della risposta alla chiamata

Abilitare lo streaming audio automatico quando viene stabilita la chiamata impostando il flag startMediaStreaming: true.

Questa impostazione garantisce che lo streaming audio venga avviato automaticamente non appena la chiamata è connessa.

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 Servizi di comunicazione di Azure riceve l'URL per il server WebSocket, stabilisce una connessione. Una volta stabilita la connessione, viene avviato lo streaming.

Avviare lo streaming audio nel server Web mentre è in corso una chiamata

Per avviare lo streaming multimediale durante la chiamata, è possibile usare l'API. A tale scopo, impostare il startMediaStreaming parametro su false (ovvero l'impostazione predefinita) e successivamente nella chiamata, è possibile usare l'API start per abilitare lo streaming multimediale.

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

Arrestare lo streaming audio

Per interrompere la ricezione di flussi audio durante una chiamata, è possibile usare l'API Arresta streaming. In questo modo è possibile arrestare lo streaming audio in qualsiasi punto della chiamata. Esistono due modi in cui è possibile arrestare lo streaming audio;

  • Attivazione dell'API Arresta streaming: usare l'API per interrompere la ricezione di dati di streaming audio mentre la chiamata è ancora attiva.
  • Arresto automatico alla disconnessione della chiamata: lo streaming audio si arresta automaticamente quando la chiamata viene disconnessa.
call_automation_client.get_call_connection(call_connection_id).stop_media_streaming(operation_context="stopMediaStreamingContext") 

Gestione dei flussi audio nel server Websocket

Questo esempio illustra come ascoltare i flussi audio usando il server 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}")

Il primo pacchetto ricevuto contiene i metadati relativi al flusso, incluse le impostazioni audio, ad esempio la codifica, la frequenza di campionamento e altri dettagli di configurazione.

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

Dopo l'invio del pacchetto di metadati, Servizi di comunicazione di Azure (ACS) inizierà a trasmettere contenuti multimediali audio al server WebSocket.

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

Invio di dati di streaming audio a Servizi di comunicazione di Azure

Se lo streaming bidirezionale è abilitato usando il EnableBidirectional flag in MediaStreamingOptions, è possibile trasmettere i dati audio a Servizi di comunicazione di Azure, che riproduce l'audio nella chiamata.

Quando Servizi di comunicazione di Azure inizia lo streaming audio nel server WebSocket, è possibile inoltrare l'audio ai servizi di intelligenza artificiale. Dopo che il servizio di intelligenza artificiale elabora il contenuto audio, è possibile trasmettere l'audio alla chiamata in corso in Servizi di comunicazione di Azure.

L'esempio illustra come un altro servizio, ad esempio Azure OpenAI o altri modelli di linguaggio Large basati su voce, elabora e trasmette i dati audio alla chiamata.

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)

È anche possibile controllare la riproduzione dell'audio nella chiamata quando si esegue il flusso verso Servizi di comunicazione di Azure, in base alla logica o al flusso di business. Ad esempio, quando viene rilevata un'attività vocale e si vuole arrestare l'audio in coda, è possibile inviare un messaggio di arresto tramite WebSocket per interrompere la riproduzione dell'audio nella chiamata.

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)

Pulire le risorse

Se si vuole pulire e rimuovere una sottoscrizione a Servizi di comunicazione, è possibile eliminare la risorsa o il gruppo di risorse. L'eliminazione del gruppo di risorse comporta anche l'eliminazione di tutte le altre risorse associate. Altre informazioni sulla pulizia delle risorse.

Passaggi successivi