你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

快速入门:服务器端音频流式处理

重要

本文中所述的功能目前以公共预览版提供。 此预览版在提供时没有附带服务级别协议,我们不建议将其用于生产工作负荷。 某些功能可能不受支持或者受限。 有关详细信息,请参阅 Microsoft Azure 预览版补充使用条款

通过 Azure 通信服务音频流式处理 API 开始使用音频流。 此快速入门假设你已经熟悉通话自动化 API,以构建自动呼叫路由解决方案。

本快速入门中所述的功能目前处于公共预览状态。

先决条件

设置 WebSocket 服务器

Azure 通信服务要求你的服务器应用程序设置 WebSocket 服务器,从而实时流式传输音频。 WebSocket 是一种标准化协议,可通过单个 TCP 连接提供全双工通信通道。

你可以参阅此处文档,了解有关 WebSocket 及其使用方法的详细信息。

收发音频流式处理数据

你可以采用多种方式开始接收音频流,具体方式可以通过 startMediaStreaming 设置中的 mediaStreamingOptions 标记进行配置。 也可以使用 audioFormat 参数指定收发音频数据所需的采样率。 目前支持的格式是 PCM 24K 单声道和 PCM 16K 单声道,默认格式为 PCM 16K 单声道。

若要启用双向音频流式处理(将音频数据发送到通话中),可以启用 EnableBidirectional 标记。 有关更多详细信息,请参阅 API 规范

在接听呼叫时开始将音频流式传输到 Web 服务器

通过设置 startMediaStreaming: true 标记建立通话时启用自动音频流式处理。

此设置可确保在通话接通后立即自动启动音频流式处理。

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

当 Azure 通信服务收到 WebSocket 服务器的 URL 后,它将建立与该服务器的连接。 成功建立连接后,系统将启动流式处理。

在通话期间开始将音频流式传输到 Web 服务器

若要在通话期间开始流式处理媒体,可以使用此 API。 为此,请将 startMediaStreaming 参数设置为 false(即默认值),之后在通话中就能使用“开始 API”启用媒体流式处理。

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

停止音频流式传输

若要在通话期间停止接收音频流,可以使用“停止流式处理 API”。 借助此 API,你可以在通话中随时停止流式处理音频。 你可以采用两种方式停止流式处理音频;

  • 触发“停止流式处理 API”:使用此 API,即可在通话期间停止接收音频流式处理数据。
  • 通话中断时自动停止:通话中断时,自动停止音频流式处理。
StopMediaStreamingOptions options = new StopMediaStreamingOptions() {
  OperationContext = "stopMediaStreamingContext"
};

await callMedia.StopMediaStreamingAsync();

处理 Websocket 服务器中的音频流

以下示例演示了如何使用 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
      }
    }
  }
}

你收到的第一个数据包包含有关流的元数据,包括音频设置,例如编码、采样率和其他配置详细信息。

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

发送元数据数据包后,Azure 通信服务 (ACS) 将会开始将音频媒体流式传输到 WebSocket 服务器。

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

将音频流式处理数据发送到 Azure 通信服务

如果使用 MediaStreamingOptions 中的 EnableBidirectional 标记启动了双向流式处理,则可以将音频数据流式传输回 Azure 通信服务,后者会在通话中播放音频。

Azure 通信服务开始将音频流式传输到 WebSocket 服务器后,你就可以将音频中继到 AI 服务。 AI 服务处理音频内容后,你可以将音频流式传输回 Azure 通信服务中正在进行的通话。

以下示例演示了 Azure OpenAI 或其他基于语音的大型语言模型等服务如何处理音频数据并将其传回通话。

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

你也可以根据自己的逻辑流或业务流,在音频流式传输回 Azure 通信服务时控制音频在通话中的播放。 例如,当系统检测到语音活动,而你想要停止排队的音频时,可以通过 WebSocket 发送停止消息,阻止音频在通话中播放。

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

先决条件

设置 WebSocket 服务器

Azure 通信服务要求你的服务器应用程序设置 WebSocket 服务器,从而实时流式传输音频。 WebSocket 是一种标准化协议,可通过单个 TCP 连接提供全双工通信通道。

你可以参阅此处文档,了解有关 WebSocket 及其使用方法的详细信息。

收发音频流式处理数据

你可以采用多种方式开始接收音频流,具体方式可以通过 startMediaStreaming 设置中的 mediaStreamingOptions 标记进行配置。 也可以使用 audioFormat 参数指定收发音频数据所需的采样率。 目前支持的格式是 PCM 24K 单声道和 PCM 16K 单声道,默认格式为 PCM 16K 单声道。

若要启用双向音频流式处理(将音频数据发送到通话中),可以启用 EnableBidirectional 标记。 有关更多详细信息,请参阅 API 规范

在接听呼叫时开始将音频流式传输到 Web 服务器

通过设置 startMediaStreaming: true 标记建立通话时启用自动音频流式处理。

此设置可确保在通话接通后立即自动启动音频流式处理。

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

当 Azure 通信服务收到 WebSocket 服务器的 URL 后,它将建立与该服务器的连接。 成功建立连接后,系统将启动流式处理。

在通话期间开始将音频流式传输到 Web 服务器

若要在通话期间开始流式处理媒体,可以使用此 API。 为此,请将 startMediaStreaming 参数设置为 false(即默认值),之后在通话中就能使用“开始 API”启用媒体流式处理。

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

停止音频流式传输

若要在通话期间停止接收音频流,可以使用“停止流式处理 API”。 借助此 API,你可以在通话中随时停止流式处理音频。 你可以采用两种方式停止流式处理音频;

  • 触发“停止流式处理 API”:使用此 API,即可在通话期间停止接收音频流式处理数据。
  • 通话中断时自动停止:通话中断时,自动停止音频流式处理。
StopMediaStreamingOptions stopMediaStreamingOptions = new StopMediaStreamingOptions()
    .setOperationContext("stopMediaStreamingContext");
callConnection.getCallMedia().stopMediaStreamingWithResponse(stopMediaStreamingOptions, Context.NONE);

处理 Websocket 服务器中的音频流

以下示例演示了如何使用 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());
  }
}

你收到的第一个数据包包含有关流的元数据,包括音频设置,例如编码、采样率和其他配置详细信息。

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

发送元数据数据包后,Azure 通信服务 (ACS) 将会开始将音频媒体流式传输到 WebSocket 服务器。

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

将音频流式处理数据发送到 Azure 通信服务

如果使用 MediaStreamingOptions 中的 EnableBidirectional 标记启动了双向流式处理,则可以将音频数据流式传输回 Azure 通信服务,后者会在通话中播放音频。

Azure 通信服务开始将音频流式传输到 WebSocket 服务器后,你就可以将音频中继到 AI 服务。 AI 服务处理音频内容后,你可以将音频流式传输回 Azure 通信服务中正在进行的通话。

以下示例演示了 Azure OpenAI 或其他基于语音的大型语言模型等服务如何处理音频数据并将其传回通话。

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

你也可以根据自己的逻辑流或业务流,在音频流式传输回 Azure 通信服务时控制音频在通话中的播放。 例如,当系统检测到语音活动,而你想要停止排队的音频时,可以通过 WebSocket 发送停止消息,阻止音频在通话中播放。

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

先决条件

设置 WebSocket 服务器

Azure 通信服务要求你的服务器应用程序设置 WebSocket 服务器,从而实时流式传输音频。 WebSocket 是一种标准化协议,可通过单个 TCP 连接提供全双工通信通道。

你可以参阅此处文档,了解有关 WebSocket 及其使用方法的详细信息。

收发音频流式处理数据

你可以采用多种方式开始接收音频流,具体方式可以通过 startMediaStreaming 设置中的 mediaStreamingOptions 标记进行配置。 也可以使用 audioFormat 参数指定收发音频数据所需的采样率。 目前支持的格式是 PCM 24K 单声道和 PCM 16K 单声道,默认格式为 PCM 16K 单声道。

若要启用双向音频流式处理(将音频数据发送到通话中),可以启用 EnableBidirectional 标记。 有关更多详细信息,请参阅 API 规范

在接听呼叫时开始将音频流式传输到 Web 服务器

通过设置 startMediaStreaming: true 标记建立通话时启用自动音频流式处理。

此设置可确保在通话接通后立即自动启动音频流式处理。

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

当 Azure 通信服务收到 WebSocket 服务器的 URL 后,它将建立与该服务器的连接。 成功建立连接后,系统将启动流式处理。

在通话期间开始将音频流式传输到 Web 服务器

若要在通话期间开始流式处理媒体,可以使用此 API。 为此,请将 startMediaStreaming 参数设置为 false(即默认值),之后在通话中就能使用“开始 API”启用媒体流式处理。

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

停止音频流式传输

若要在通话期间停止接收音频流,可以使用“停止流式处理 API”。 借助此 API,你可以在通话中随时停止流式处理音频。 你可以采用两种方式停止流式处理音频;

  • 触发“停止流式处理 API”:使用此 API,即可在通话期间停止接收音频流式处理数据。
  • 通话中断时自动停止:通话中断时,自动停止音频流式处理。
const stopMediaStreamingOptions: StopMediaStreamingOptions = {
	operationContext: "stopMediaStreaming"
}
await answerCallResult.callConnection.getCallMedia().stopMediaStreaming(stopMediaStreamingOptions);

处理 Websocket 服务器中的音频流

以下示例演示了如何使用 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  
	}
}

你收到的第一个数据包包含有关流的元数据,包括音频设置,例如编码、采样率和其他配置详细信息。

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

发送元数据数据包后,Azure 通信服务 (ACS) 将会开始将音频媒体流式传输到 WebSocket 服务器。

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

将音频流式处理数据发送到 Azure 通信服务

如果使用 MediaStreamingOptions 中的 EnableBidirectional 标记启动了双向流式处理,则可以将音频数据流式传输回 Azure 通信服务,后者会在通话中播放音频。

Azure 通信服务开始将音频流式传输到 WebSocket 服务器后,你就可以将音频中继到 AI 服务。 AI 服务处理音频内容后,你可以将音频流式传输回 Azure 通信服务中正在进行的通话。

以下示例演示了 Azure OpenAI 或其他基于语音的大型语言模型等服务如何处理音频数据并将其传回通话。

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

你也可以根据自己的逻辑流或业务流,在音频流式传输回 Azure 通信服务时控制音频在通话中的播放。 例如,当系统检测到语音活动,而你想要停止排队的音频时,可以通过 WebSocket 发送停止消息,阻止音频在通话中播放。

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

先决条件

设置 WebSocket 服务器

Azure 通信服务要求你的服务器应用程序设置 WebSocket 服务器,从而实时流式传输音频。 WebSocket 是一种标准化协议,可通过单个 TCP 连接提供全双工通信通道。

你可以参阅此处文档,了解有关 WebSocket 及其使用方法的详细信息。

收发音频流式处理数据

你可以采用多种方式开始接收音频流,具体方式可以通过 startMediaStreaming 设置中的 mediaStreamingOptions 标记进行配置。 也可以使用 audioFormat 参数指定收发音频数据所需的采样率。 目前支持的格式是 PCM 24K 单声道和 PCM 16K 单声道,默认格式为 PCM 16K 单声道。

若要启用双向音频流式处理(将音频数据发送到通话中),可以启用 EnableBidirectional 标记。 有关更多详细信息,请参阅 API 规范

在接听呼叫时开始将音频流式传输到 Web 服务器

通过设置 startMediaStreaming: true 标记建立通话时启用自动音频流式处理。

此设置可确保在通话接通后立即自动启动音频流式处理。

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

当 Azure 通信服务收到 WebSocket 服务器的 URL 后,它将建立与该服务器的连接。 成功建立连接后,系统将启动流式处理。

在通话期间开始将音频流式传输到 Web 服务器

若要在通话期间开始流式处理媒体,可以使用此 API。 为此,请将 startMediaStreaming 参数设置为 false(即默认值),之后在通话中就能使用“开始 API”启用媒体流式处理。

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

停止音频流式传输

若要在通话期间停止接收音频流,可以使用“停止流式处理 API”。 借助此 API,你可以在通话中随时停止流式处理音频。 你可以采用两种方式停止流式处理音频;

  • 触发“停止流式处理 API”:使用此 API,即可在通话期间停止接收音频流式处理数据。
  • 通话中断时自动停止:通话中断时,自动停止音频流式处理。
call_automation_client.get_call_connection(call_connection_id).stop_media_streaming(operation_context="stopMediaStreamingContext") 

处理 Websocket 服务器中的音频流

以下示例演示了如何使用 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}")

你收到的第一个数据包包含有关流的元数据,包括音频设置,例如编码、采样率和其他配置详细信息。

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

发送元数据数据包后,Azure 通信服务 (ACS) 将会开始将音频媒体流式传输到 WebSocket 服务器。

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

将音频流式处理数据发送到 Azure 通信服务

如果使用 MediaStreamingOptions 中的 EnableBidirectional 标记启动了双向流式处理,则可以将音频数据流式传输回 Azure 通信服务,后者会在通话中播放音频。

Azure 通信服务开始将音频流式传输到 WebSocket 服务器后,你就可以将音频中继到 AI 服务。 AI 服务处理音频内容后,你可以将音频流式传输回 Azure 通信服务中正在进行的通话。

以下示例演示了 Azure OpenAI 或其他基于语音的大型语言模型等服务如何处理音频数据并将其传回通话。

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)

你也可以根据自己的逻辑流或业务流,在音频流式传输回 Azure 通信服务时控制音频在通话中的播放。 例如,当系统检测到语音活动,而你想要停止排队的音频时,可以通过 WebSocket 发送停止消息,阻止音频在通话中播放。

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)

清理资源

如果想要清理并删除通信服务订阅,可以删除资源或资源组。 删除资源组同时也会删除与之相关联的任何其他资源。 了解有关清理资源的详细信息。

后续步骤