빠른 시작: 서버 쪽 오디오 스트리밍
Important
이 문서에 설명된 기능은 현재 공개 미리 보기로 제공됩니다. 이 미리 보기 버전은 서비스 수준 계약 없이 제공되며, 프로덕션 워크로드에는 권장되지 않습니다. 특정 기능이 지원되지 않거나 기능이 제한될 수 있습니다. 자세한 내용은 Microsoft Azure Preview에 대한 추가 사용 약관을 참조하세요.
Azure Communication Services 오디오 스트리밍 API를 통해 오디오 스트림 사용을 시작합니다. 이 빠른 시작에서는 자동화된 통화 라우팅 솔루션을 빌드하기 위해 통화 자동화 API에 이미 익숙하다고 가정합니다.
이 빠른 시작에서 설명하는 기능은 현재 공개 미리 보기로 제공됩니다.
필수 조건
- 활성 구독이 있는 Azure 계정은 자세한 내용은 무료로 계정 만들기를 참조 하세요.
- Azure Communication Services 리소스. Azure Communication Services 리소스 만들기를 참조하세요.
- 호출 자동화 SDK를 사용하여 만든 새 웹 서비스 애플리케이션입니다.
- 운영 체제용 최신 .NET 라이브러리.
- 미디어 스트림을 보내고 받을 수 있는 websocket 서버입니다.
websocket 서버 설정
Azure Communication Services를 사용하려면 서버 애플리케이션에서 WebSocket 서버를 설정하여 오디오를 실시간으로 스트리밍해야 합니다. WebSocket은 단일 TCP 연결을 통해 전체 이중 통신 채널을 제공하는 표준화된 프로토콜입니다.
WebSocket 및 사용 방법에 대한 자세한 내용은 여기에서 설명서를 검토할 수 있습니다.
오디오 스트리밍 데이터 수신 및 보내기
오디오 스트림 수신을 시작하는 방법에는 여러 가지가 있으며, 설정에서 mediaStreamingOptions
플래그를 startMediaStreaming
사용하여 구성할 수 있습니다. 매개 변수를 사용하여 audioFormat
오디오 데이터를 받거나 보내는 데 사용되는 원하는 샘플 속도를 지정할 수도 있습니다. 현재 지원되는 형식은 PCM 24K 모노 및 PCM 16K 모노이며, 기본값은 PCM 16K 모노입니다.
오디오 데이터를 통화로 보내는 양방향 오디오 스트리밍을 사용하도록 설정하려면 플래그를 EnableBidirectional
사용하도록 설정할 수 있습니다. 자세한 내용은 API 사양을 참조하세요.
통화에 응답할 때 웹 서버로 오디오 스트리밍 시작
플래그 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을 받으면 연결이 설정됩니다. 연결이 성공적으로 완료되면 스트리밍이 시작됩니다.
통화가 진행되는 동안 웹 서버로 오디오 스트리밍 시작
호출 중에 미디어 스트리밍을 시작하려면 API를 사용할 수 있습니다. 이렇게 하려면 매개 변수 false
를 기본값으로 설정하고 startMediaStreaming
나중에 호출에서 시작 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
}
}
메타데이터 패킷을 보낸 후 ACS(Azure Communication Services)는 오디오 미디어를 WebSocket 서버로 스트리밍하기 시작합니다.
{
"kind": "AudioData",
"audioData": {
"timestamp": "2024-11-15T19:16:12.925Z",
"participantRawID": "8:acs:3d20e1de-0f28-41c5…",
"data": "5ADwAOMA6AD0A…",
"silent": false
}
}
Azure Communication Services에 오디오 스트리밍 데이터 보내기
양방향 스트리밍이 플래그MediaStreamingOptions
를 사용하여 EnableBidirectional
사용하도록 설정된 경우 오디오 데이터를 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);
필수 조건
- 활성 구독이 있는 Azure 계정입니다. 자세한 내용은 무료 계정 만들기를 참조하세요.
- Azure Communication Services 리소스. Azure Communication Services 리소스 만들기를 참조하세요.
- 호출 자동화 SDK를 사용하여 만든 새 웹 서비스 애플리케이션입니다.
- Java 개발 키트 버전 17 이상.
- Apache Maven.
websocket 서버 설정
Azure Communication Services를 사용하려면 서버 애플리케이션에서 WebSocket 서버를 설정하여 오디오를 실시간으로 스트리밍해야 합니다. WebSocket은 단일 TCP 연결을 통해 전체 이중 통신 채널을 제공하는 표준화된 프로토콜입니다.
WebSocket 및 사용 방법에 대한 자세한 내용은 여기에서 설명서를 검토할 수 있습니다.
오디오 스트리밍 데이터 수신 및 보내기
오디오 스트림 수신을 시작하는 방법에는 여러 가지가 있으며, 설정에서 mediaStreamingOptions
플래그를 startMediaStreaming
사용하여 구성할 수 있습니다. 매개 변수를 사용하여 audioFormat
오디오 데이터를 받거나 보내는 데 사용되는 원하는 샘플 속도를 지정할 수도 있습니다. 현재 지원되는 형식은 PCM 24K 모노 및 PCM 16K 모노이며, 기본값은 PCM 16K 모노입니다.
오디오 데이터를 통화로 보내는 양방향 오디오 스트리밍을 사용하도록 설정하려면 플래그를 EnableBidirectional
사용하도록 설정할 수 있습니다. 자세한 내용은 API 사양을 참조하세요.
통화에 응답할 때 웹 서버로 오디오 스트리밍 시작
플래그 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을 받으면 연결이 설정됩니다. 연결이 성공적으로 완료되면 스트리밍이 시작됩니다.
통화가 진행되는 동안 웹 서버로 오디오 스트리밍 시작
호출 중에 미디어 스트리밍을 시작하려면 API를 사용할 수 있습니다. 이렇게 하려면 매개 변수 false
를 기본값으로 설정하고 startMediaStreaming
나중에 호출에서 시작 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
}
}
메타데이터 패킷을 보낸 후 ACS(Azure Communication Services)는 오디오 미디어를 WebSocket 서버로 스트리밍하기 시작합니다.
{
"kind": "AudioData",
"audioData": {
"timestamp": "2024-11-15T19:16:12.925Z",
"participantRawID": "8:acs:3d20e1de-0f28-41c5…",
"data": "5ADwAOMA6AD0A…",
"silent": false
}
}
Azure Communication Services에 오디오 스트리밍 데이터 보내기
양방향 스트리밍이 플래그MediaStreamingOptions
를 사용하여 EnableBidirectional
사용하도록 설정된 경우 오디오 데이터를 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 리소스 만들기를 참조하세요.
- 호출 자동화 SDK를 사용하여 만든 새 웹 서비스 애플리케이션입니다.
- Node.js LTS 설치
- 미디어 스트림을 보내고 받을 수 있는 websocket 서버입니다.
websocket 서버 설정
Azure Communication Services를 사용하려면 서버 애플리케이션에서 WebSocket 서버를 설정하여 오디오를 실시간으로 스트리밍해야 합니다. WebSocket은 단일 TCP 연결을 통해 전체 이중 통신 채널을 제공하는 표준화된 프로토콜입니다.
WebSocket 및 사용 방법에 대한 자세한 내용은 여기에서 설명서를 검토할 수 있습니다.
오디오 스트리밍 데이터 수신 및 보내기
오디오 스트림 수신을 시작하는 방법에는 여러 가지가 있으며, 설정에서 mediaStreamingOptions
플래그를 startMediaStreaming
사용하여 구성할 수 있습니다. 매개 변수를 사용하여 audioFormat
오디오 데이터를 받거나 보내는 데 사용되는 원하는 샘플 속도를 지정할 수도 있습니다. 현재 지원되는 형식은 PCM 24K 모노 및 PCM 16K 모노이며, 기본값은 PCM 16K 모노입니다.
오디오 데이터를 통화로 보내는 양방향 오디오 스트리밍을 사용하도록 설정하려면 플래그를 EnableBidirectional
사용하도록 설정할 수 있습니다. 자세한 내용은 API 사양을 참조하세요.
통화에 응답할 때 웹 서버로 오디오 스트리밍 시작
플래그 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을 받으면 연결이 설정됩니다. 연결이 성공적으로 완료되면 스트리밍이 시작됩니다.
통화가 진행되는 동안 웹 서버로 오디오 스트리밍 시작
호출 중에 미디어 스트리밍을 시작하려면 API를 사용할 수 있습니다. 이렇게 하려면 매개 변수 false
를 기본값으로 설정하고 startMediaStreaming
나중에 호출에서 시작 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
}
}
메타데이터 패킷을 보낸 후 ACS(Azure Communication Services)는 오디오 미디어를 WebSocket 서버로 스트리밍하기 시작합니다.
{
"kind": "AudioData",
"audioData": {
"timestamp": "2024-11-15T19:16:12.925Z",
"participantRawID": "8:acs:3d20e1de-0f28-41c5…",
"data": "5ADwAOMA6AD0A…",
"silent": false
}
}
Azure Communication Services에 오디오 스트리밍 데이터 보내기
양방향 스트리밍이 플래그MediaStreamingOptions
를 사용하여 EnableBidirectional
사용하도록 설정된 경우 오디오 데이터를 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 리소스 만들기를 참조하세요.
- 호출 자동화 SDK를 사용하여 만든 새 웹 서비스 애플리케이션입니다.
- Python 3.7 이상.
- 미디어 스트림을 보내고 받을 수 있는 websocket 서버입니다.
websocket 서버 설정
Azure Communication Services를 사용하려면 서버 애플리케이션에서 WebSocket 서버를 설정하여 오디오를 실시간으로 스트리밍해야 합니다. WebSocket은 단일 TCP 연결을 통해 전체 이중 통신 채널을 제공하는 표준화된 프로토콜입니다.
WebSocket 및 사용 방법에 대한 자세한 내용은 여기에서 설명서를 검토할 수 있습니다.
오디오 스트리밍 데이터 수신 및 보내기
오디오 스트림 수신을 시작하는 방법에는 여러 가지가 있으며, 설정에서 mediaStreamingOptions
플래그를 startMediaStreaming
사용하여 구성할 수 있습니다. 매개 변수를 사용하여 audioFormat
오디오 데이터를 받거나 보내는 데 사용되는 원하는 샘플 속도를 지정할 수도 있습니다. 현재 지원되는 형식은 PCM 24K 모노 및 PCM 16K 모노이며, 기본값은 PCM 16K 모노입니다.
오디오 데이터를 통화로 보내는 양방향 오디오 스트리밍을 사용하도록 설정하려면 플래그를 EnableBidirectional
사용하도록 설정할 수 있습니다. 자세한 내용은 API 사양을 참조하세요.
통화에 응답할 때 웹 서버로 오디오 스트리밍 시작
플래그 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을 받으면 연결이 설정됩니다. 연결이 성공적으로 완료되면 스트리밍이 시작됩니다.
통화가 진행되는 동안 웹 서버로 오디오 스트리밍 시작
호출 중에 미디어 스트리밍을 시작하려면 API를 사용할 수 있습니다. 이렇게 하려면 매개 변수 false
를 기본값으로 설정하고 startMediaStreaming
나중에 호출에서 시작 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
}
}
메타데이터 패킷을 보낸 후 ACS(Azure Communication Services)는 오디오 미디어를 WebSocket 서버로 스트리밍하기 시작합니다.
{
"kind": "AudioData",
"audioData": {
"timestamp": "2024-11-15T19:16:12.925Z",
"participantRawID": "8:acs:3d20e1de-0f28-41c5…",
"data": "5ADwAOMA6AD0A…",
"silent": false
}
}
Azure Communication Services에 오디오 스트리밍 데이터 보내기
양방향 스트리밍이 플래그MediaStreamingOptions
를 사용하여 EnableBidirectional
사용하도록 설정된 경우 오디오 데이터를 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 구독을 정리하고 제거하려면 리소스 또는 리소스 그룹을 삭제하면 됩니다. 리소스 그룹을 삭제하면 해당 리소스 그룹에 연결된 다른 모든 리소스가 함께 삭제됩니다. 리소스 정리에 대해 자세히 알아보세요.