快速入門:伺服器端音訊串流
重要
本文所述的功能目前處於公開預覽狀態。 此預覽版本沒有服務等級協定,不建議用於處理生產工作負載。 可能不支援特定功能,或可能已經限制功能。 如需詳細資訊,請參閱 Microsoft Azure 預覽版增補使用條款。
透過 Azure 通訊服務音訊串流 API 開始使用音訊串流。 本快速入門假設您已熟悉通話自動化 API 可建置自動化通話路由解決方案。
本快速入門中所述的功能目前為公開預覽版。
必要條件
- 具有作用中訂用帳戶的 Azure 帳戶,如需詳細資訊,請參閱 免費建立帳戶。
- Azure 通訊服務資源。 請參閱建立 Azure 通訊服務資源。
- 使用 呼叫自動化 SDK 建立的新 Web 服務應用程式。
- 您作業系統適用的最新 .NET 程式庫。
- Websocket 伺服器,可以傳送和接收媒體串流。
設定 WebSocket 伺服器
Azure 通訊服務需要您的伺服器應用程式設定 WebSocket 伺服器,以即時串流音訊。 WebSocket 是一種標準化通訊協定,可透過單一 TCP 連線提供全雙工通訊通道。
您可以在這裡檢閱檔,以深入瞭解 WebSocket 及其使用方式。
接收和傳送音訊串流數據
有多種方式可以開始接收音訊串流,您可以使用 startMediaStreaming
安裝程式中的旗標進行 mediaStreamingOptions
設定。 您也可以使用 audioFormat
參數指定接收或傳送音訊資料所需的取樣率。 目前支援的格式為 PCM 24K mono 和 PCM 16K mono,預設值為 PCM 16K mono。
若要啟用雙向音訊串流,您要在其中將音訊數據傳送至通話,您可以啟用 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 在呼叫仍在作用中時停止接收音訊串流數據。
- 通話中斷連線時自動停止: 當通話中斷時,音訊串流會自動停止。
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);
必要條件
- 包含使用中訂用帳戶的 Azure 帳戶。如需詳細資料,請參閱建立免費帳戶。
- Azure 通訊服務資源。 請參閱建立 Azure 通訊服務資源。
- 使用 呼叫自動化 SDK 建立的新 Web 服務應用程式。
- Java Development Kit 第 17 版或更新版本。
- Apache Maven。
設定 WebSocket 伺服器
Azure 通訊服務需要您的伺服器應用程式設定 WebSocket 伺服器,以即時串流音訊。 WebSocket 是一種標準化通訊協定,可透過單一 TCP 連線提供全雙工通訊通道。
您可以在這裡檢閱檔,以深入瞭解 WebSocket 及其使用方式。
接收和傳送音訊串流數據
有多種方式可以開始接收音訊串流,您可以使用 startMediaStreaming
安裝程式中的旗標進行 mediaStreamingOptions
設定。 您也可以使用 audioFormat
參數指定接收或傳送音訊資料所需的取樣率。 目前支援的格式為 PCM 24K mono 和 PCM 16K mono,預設值為 PCM 16K mono。
若要啟用雙向音訊串流,您要在其中將音訊數據傳送至通話,您可以啟用 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 在呼叫仍在作用中時停止接收音訊串流數據。
- 通話中斷連線時自動停止: 當通話中斷時,音訊串流會自動停止。
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();
}
}
}
必要條件
- 包含使用中訂用帳戶的 Azure 帳戶。如需詳細資料,請參閱建立免費帳戶。
- Azure 通訊服務資源。 請參閱建立 Azure 通訊服務資源。
- 使用 呼叫自動化 SDK 建立的新 Web 服務應用程式。
- Node.js LTS 安裝
- Websocket 伺服器,可以傳送和接收媒體串流。
設定 WebSocket 伺服器
Azure 通訊服務需要您的伺服器應用程式設定 WebSocket 伺服器,以即時串流音訊。 WebSocket 是一種標準化通訊協定,可透過單一 TCP 連線提供全雙工通訊通道。
您可以在這裡檢閱檔,以深入瞭解 WebSocket 及其使用方式。
接收和傳送音訊串流數據
有多種方式可以開始接收音訊串流,您可以使用 startMediaStreaming
安裝程式中的旗標進行 mediaStreamingOptions
設定。 您也可以使用 audioFormat
參數指定接收或傳送音訊資料所需的取樣率。 目前支援的格式為 PCM 24K mono 和 PCM 16K mono,預設值為 PCM 16K mono。
若要啟用雙向音訊串流,您要在其中將音訊數據傳送至通話,您可以啟用 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 在呼叫仍在作用中時停止接收音訊串流數據。
- 通話中斷連線時自動停止: 當通話中斷時,音訊串流會自動停止。
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);
}
}
必要條件
- 包含使用中訂用帳戶的 Azure 帳戶。如需詳細資料,請參閱建立免費帳戶。
- Azure 通訊服務資源。 請參閱建立 Azure 通訊服務資源。
- 使用 呼叫自動化 SDK 建立的新 Web 服務應用程式。
- Python 3.7 以上版本。
- Websocket 伺服器,可以傳送和接收媒體串流。
設定 WebSocket 伺服器
Azure 通訊服務需要您的伺服器應用程式設定 WebSocket 伺服器,以即時串流音訊。 WebSocket 是一種標準化通訊協定,可透過單一 TCP 連線提供全雙工通訊通道。
您可以在這裡檢閱檔,以深入瞭解 WebSocket 及其使用方式。
接收和傳送音訊串流數據
有多種方式可以開始接收音訊串流,您可以使用 startMediaStreaming
安裝程式中的旗標進行 mediaStreamingOptions
設定。 您也可以使用 audioFormat
參數指定接收或傳送音訊資料所需的取樣率。 目前支援的格式為 PCM 24K mono 和 PCM 16K mono,預設值為 PCM 16K mono。
若要啟用雙向音訊串流,您要在其中將音訊數據傳送至通話,您可以啟用 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 在呼叫仍在作用中時停止接收音訊串流數據。
- 通話中斷連線時自動停止: 當通話中斷時,音訊串流會自動停止。
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)
清除資源
如果您想要清除並移除通訊服務訂用帳戶,您可以刪除資源或資源群組。 刪除資源群組也會刪除與其相關聯的任何其他資源。 深入了解如何清除資源。