次の方法で共有


クイック スタート: サーバー側音声ストリーミング

重要

この記事で説明されている機能は、現在パブリック プレビュー段階にあります。 このプレビュー バージョンはサービス レベル アグリーメントなしで提供されており、運用環境のワークロードに使用することは推奨されません。 特定の機能はサポート対象ではなく、機能が制限されることがあります。 詳しくは、Microsoft Azure プレビューの追加使用条件に関するページをご覧ください。

Azure Communication Services Media Streaming API を使用して音声ストリームの使用を開始します。 このクイックスタートでは、自動呼び出しルーティング ソリューションを構築するための Call Automation API について既に理解していることを前提としています。

このクイックスタートで説明されている機能は、現在、パブリック プレビュー段階にあります。

前提条件

Websocket サーバーを設定する

Azure Communication Services では、リアルタイムでオーディオをストリーミングする WebSocket サーバーをサーバー アプリケーションで設定する必要があります。 WebSocket は、単一の TCP 接続で全二重通信チャネルを提供する標準化されたプロトコルです。

WebSocket とその使用方法の詳細については、こちらのドキュメントを参照してください。

音声ストリーミング データの送受信

オーディオ ストリームの受信を開始するには、複数の方法があります。これは、mediaStreamingOptions セットアップで startMediaStreaming フラグを使用して構成できます。 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 Communication Services が WebSocket サーバーの URL を受信すると、そのサーバーへの接続が確立されます。 接続が正常に確立されると、ストリーミングが開始されます。

呼び出しの進行中に Web サーバーへのオーディオのストリーミングを開始する

呼び出し中にメディア ストリーミングを開始するには、API を使用できます。 これを行うには、startMediaStreaming パラメーターを false (既定値) に設定し、呼び出しの後半で start 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();

オーディオ ストリーミングを停止する

呼び出し中にオーディオ ストリームの受信を停止するには、Stop streaming API を使用します。 これにより、通話内の任意の時点で音声ストリーミングを停止できます。 音声ストリーミングを停止する方法は 2 つあります:

  • ストリーミング停止 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 Communication Services (ACS) は WebSocket サーバーへの音声メディアのストリーミングを開始します。

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

Azure Communication Services への音声ストリーミング データの送信

MediaStreamingOptionsEnableBidirectional フラグを使用して双方向ストリーミングが有効になっている場合は、音声データを Azure Communication Services にストリーミングし直し、音声を通話に再生できます。

Azure Communication Services が WebSocket サーバーへのオーディオのストリーミングを開始すると、音声を AI サービスに中継できます。 AI サービスがオーディオ コンテンツを処理した後、Azure Communication Services で進行中の呼び出しにオーディオをストリームバックできます。

この例では、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 Communication Services にストリーミング バックするときの通話でのオーディオの再生を制御することもできます。 たとえば、音声アクティビティが検出され、キューに登録されているオーディオを停止する場合は、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 Communication Services では、リアルタイムでオーディオをストリーミングする WebSocket サーバーをサーバー アプリケーションで設定する必要があります。 WebSocket は、単一の TCP 接続で全二重通信チャネルを提供する標準化されたプロトコルです。

WebSocket とその使用方法の詳細については、こちらのドキュメントを参照してください。

音声ストリーミング データの送受信

オーディオ ストリームの受信を開始するには、複数の方法があります。これは、mediaStreamingOptions セットアップで startMediaStreaming フラグを使用して構成できます。 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 Communication Services が WebSocket サーバーの URL を受信すると、そのサーバーへの接続が確立されます。 接続が正常に確立されると、ストリーミングが開始されます。

呼び出しの進行中に Web サーバーへのオーディオのストリーミングを開始する

呼び出し中にメディア ストリーミングを開始するには、API を使用できます。 これを行うには、startMediaStreaming パラメーターを false (既定値) に設定し、呼び出しの後半で start 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);     

オーディオ ストリーミングを停止する

呼び出し中にオーディオ ストリームの受信を停止するには、Stop streaming API を使用します。 これにより、通話内の任意の時点で音声ストリーミングを停止できます。 音声ストリーミングを停止する方法は 2 つあります:

  • ストリーミング停止 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 Communication Services (ACS) は WebSocket サーバーへの音声メディアのストリーミングを開始します。

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

Azure Communication Services への音声ストリーミング データの送信

MediaStreamingOptionsEnableBidirectional フラグを使用して双方向ストリーミングが有効になっている場合は、音声データを Azure Communication Services にストリーミングし直し、音声を通話に再生できます。

Azure Communication Services が WebSocket サーバーへのオーディオのストリーミングを開始すると、音声を AI サービスに中継できます。 AI サービスがオーディオ コンテンツを処理した後、Azure Communication Services で進行中の呼び出しにオーディオをストリームバックできます。

この例では、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 Communication Services にストリーミング バックするときの通話でのオーディオの再生を制御することもできます。 たとえば、音声アクティビティが検出され、キューに登録されているオーディオを停止する場合は、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 Communication Services リソース。 Azure Communication Services リソースの作成に関する記事を参照してください。
  • Call Automation SDK を使用して作成した新しい Web サービス アプリケーション。
  • Node.js LTS のインストール
  • メディア ストリームを送受信できる WebSocket サーバー。

Websocket サーバーを設定する

Azure Communication Services では、リアルタイムでオーディオをストリーミングする WebSocket サーバーをサーバー アプリケーションで設定する必要があります。 WebSocket は、単一の TCP 接続で全二重通信チャネルを提供する標準化されたプロトコルです。

WebSocket とその使用方法の詳細については、こちらのドキュメントを参照してください。

音声ストリーミング データの送受信

オーディオ ストリームの受信を開始するには、複数の方法があります。これは、mediaStreamingOptions セットアップで startMediaStreaming フラグを使用して構成できます。 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 Communication Services が WebSocket サーバーの URL を受信すると、そのサーバーへの接続が確立されます。 接続が正常に確立されると、ストリーミングが開始されます。

呼び出しの進行中に Web サーバーへのオーディオのストリーミングを開始する

呼び出し中にメディア ストリーミングを開始するには、API を使用できます。 これを行うには、startMediaStreaming パラメーターを false (既定値) に設定し、呼び出しの後半で start 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);

オーディオ ストリーミングを停止する

呼び出し中にオーディオ ストリームの受信を停止するには、Stop streaming API を使用します。 これにより、通話内の任意の時点で音声ストリーミングを停止できます。 音声ストリーミングを停止する方法は 2 つあります:

  • ストリーミング停止 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 Communication Services (ACS) は WebSocket サーバーへの音声メディアのストリーミングを開始します。

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

Azure Communication Services への音声ストリーミング データの送信

MediaStreamingOptionsEnableBidirectional フラグを使用して双方向ストリーミングが有効になっている場合は、音声データを Azure Communication Services にストリーミングし直し、音声を通話に再生できます。

Azure Communication Services が WebSocket サーバーへのオーディオのストリーミングを開始すると、音声を AI サービスに中継できます。 AI サービスがオーディオ コンテンツを処理した後、Azure Communication Services で進行中の呼び出しにオーディオをストリームバックできます。

この例では、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 Communication Services にストリーミング バックするときの通話でのオーディオの再生を制御することもできます。 たとえば、音声アクティビティが検出され、キューに登録されているオーディオを停止する場合は、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 Communication Services リソース。 Azure Communication Services リソースの作成に関する記事を参照してください。
  • Call Automation SDK を使用して作成した新しい Web サービス アプリケーション。
  • Python 3.7 以降。
  • メディア ストリームを送受信できる WebSocket サーバー。

Websocket サーバーを設定する

Azure Communication Services では、リアルタイムでオーディオをストリーミングする WebSocket サーバーをサーバー アプリケーションで設定する必要があります。 WebSocket は、単一の TCP 接続で全二重通信チャネルを提供する標準化されたプロトコルです。

WebSocket とその使用方法の詳細については、こちらのドキュメントを参照してください。

音声ストリーミング データの送受信

オーディオ ストリームの受信を開始するには、複数の方法があります。これは、mediaStreamingOptions セットアップで startMediaStreaming フラグを使用して構成できます。 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 Communication Services が WebSocket サーバーの URL を受信すると、そのサーバーへの接続が確立されます。 接続が正常に確立されると、ストリーミングが開始されます。

呼び出しの進行中に Web サーバーへのオーディオのストリーミングを開始する

呼び出し中にメディア ストリーミングを開始するには、API を使用できます。 これを行うには、startMediaStreaming パラメーターを false (既定値) に設定し、呼び出しの後半で start 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"
)

オーディオ ストリーミングを停止する

呼び出し中にオーディオ ストリームの受信を停止するには、Stop streaming API を使用します。 これにより、通話内の任意の時点で音声ストリーミングを停止できます。 音声ストリーミングを停止する方法は 2 つあります:

  • ストリーミング停止 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 Communication Services (ACS) は WebSocket サーバーへの音声メディアのストリーミングを開始します。

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

Azure Communication Services への音声ストリーミング データの送信

MediaStreamingOptionsEnableBidirectional フラグを使用して双方向ストリーミングが有効になっている場合は、音声データを Azure Communication Services にストリーミングし直し、音声を通話に再生できます。

Azure Communication Services が WebSocket サーバーへのオーディオのストリーミングを開始すると、音声を AI サービスに中継できます。 AI サービスがオーディオ コンテンツを処理した後、Azure Communication Services で進行中の呼び出しにオーディオをストリームバックできます。

この例では、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 Communication Services にストリーミング バックするときの通話でのオーディオの再生を制御することもできます。 たとえば、音声アクティビティが検出され、キューに登録されているオーディオを停止する場合は、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)

リソースをクリーンアップする

Communication Services サブスクリプションをクリーンアップして解除する場合は、リソースまたはリソース グループを削除できます。 リソース グループを削除すると、それに関連付けられている他のリソースも削除されます。 詳細については、リソースのクリーンアップに関する記事を参照してください。

次のステップ