Краткое руководство. Потоковая передача аудио на стороне сервера
Внимание
Функции, описанные в этой статье, в настоящее время находятся в общедоступной предварительной версии. Эта предварительная версия предоставляется без соглашения об уровне обслуживания. Ее не следует использовать для производственных рабочих нагрузок. Некоторые функции могут не поддерживаться или их возможности могут быть ограничены. Дополнительные сведения см. в статье Дополнительные условия использования Предварительных версий Microsoft Azure.
Начало работы с использованием аудиопотоков с помощью API потоковой передачи звука Службы коммуникации Azure. В этом кратком руководстве предполагается, что вы уже знакомы с API автоматизации вызовов для создания решения автоматической маршрутизации вызовов.
Функции, описанные в этом кратком руководстве, в настоящее время находятся в общедоступной предварительной версии.
Необходимые компоненты
- Учетная запись Azure с активной подпиской см. в статье "Создание учетной записи бесплатно".
- Ресурс Служб коммуникации Azure. См. статью "Создание ресурса Службы коммуникации Azure".
- Новое приложение веб-службы, созданное с помощью пакета SDK службы автоматизации вызовов.
- Последняя библиотека .NET для операционной системы.
- Сервер websocket, который может отправлять и получать потоки мультимедиа.
Настройка сервера websocket
Службы коммуникации Azure требует, чтобы серверное приложение настроит сервер WebSocket для потоковой передачи звука в режиме реального времени. WebSocket — это стандартизованный протокол, предоставляющий полно дуплексный канал связи по одному TCP-подключению.
Ознакомьтесь с документацией здесь, чтобы узнать больше о WebSockets и их использовании.
Получение и отправка данных потоковой передачи звука
Существует несколько способов начать прием аудиопотока, который можно настроить с помощью флага startMediaStreaming
в настройке mediaStreamingOptions
. Можно также указать нужную частоту выборки, используемую для получения или отправки звуковых данных с помощью audioFormat
параметра. В настоящее время поддерживаются форматы PCM 24K mono и PCM 16K mono, а по умолчанию — PCM 16K mono.
Чтобы включить двунаправленную потоковую передачу звука, где вы отправляете звуковые данные в вызов, можно включить 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 получает URL-адрес сервера WebSocket, он устанавливает подключение к нему. После успешного выполнения подключения инициируется потоковая передача.
Запуск потоковой передачи звука на веб-сервер во время выполнения вызова
Чтобы начать потоковую передачу мультимедиа во время вызова, можно использовать 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
Если двунаправленная потоковая передача включена с помощью EnableBidirectional
флага, MediaStreamingOptions
вы можете передавать звуковые данные обратно в Службы коммуникации Azure, который воспроизводит звук в вызов.
После того как Службы коммуникации Azure начнет потоковую передачу звука на сервер WebSocket, вы можете передать звук в службы ИИ. После обработки звукового содержимого служба ИИ может передавать звук обратно в текущий вызов в Службы коммуникации 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 службы автоматизации вызовов.
- Пакет средств разработки Java версии 17 или более поздней.
- Apache Maven.
Настройка сервера websocket
Службы коммуникации Azure требует, чтобы серверное приложение настроит сервер WebSocket для потоковой передачи звука в режиме реального времени. WebSocket — это стандартизованный протокол, предоставляющий полно дуплексный канал связи по одному TCP-подключению.
Ознакомьтесь с документацией здесь, чтобы узнать больше о WebSockets и их использовании.
Получение и отправка данных потоковой передачи звука
Существует несколько способов начать прием аудиопотока, который можно настроить с помощью флага startMediaStreaming
в настройке mediaStreamingOptions
. Можно также указать нужную частоту выборки, используемую для получения или отправки звуковых данных с помощью audioFormat
параметра. В настоящее время поддерживаются форматы PCM 24K mono и PCM 16K mono, а по умолчанию — PCM 16K mono.
Чтобы включить двунаправленную потоковую передачу звука, где вы отправляете звуковые данные в вызов, можно включить 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 получает URL-адрес сервера WebSocket, он устанавливает подключение к нему. После успешного выполнения подключения инициируется потоковая передача.
Запуск потоковой передачи звука на веб-сервер во время выполнения вызова
Чтобы начать потоковую передачу мультимедиа во время вызова, можно использовать 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
Если двунаправленная потоковая передача включена с помощью EnableBidirectional
флага, MediaStreamingOptions
вы можете передавать звуковые данные обратно в Службы коммуникации Azure, который воспроизводит звук в вызов.
После того как Службы коммуникации Azure начнет потоковую передачу звука на сервер WebSocket, вы можете передать звук в службы ИИ. После обработки звукового содержимого служба ИИ может передавать звук обратно в текущий вызов в Службы коммуникации 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 службы автоматизации вызовов.
- установка Node.js LTS
- Сервер websocket, который может отправлять и получать потоки мультимедиа.
Настройка сервера websocket
Службы коммуникации Azure требует, чтобы серверное приложение настроит сервер WebSocket для потоковой передачи звука в режиме реального времени. WebSocket — это стандартизованный протокол, предоставляющий полно дуплексный канал связи по одному TCP-подключению.
Ознакомьтесь с документацией здесь, чтобы узнать больше о WebSockets и их использовании.
Получение и отправка данных потоковой передачи звука
Существует несколько способов начать прием аудиопотока, который можно настроить с помощью флага startMediaStreaming
в настройке mediaStreamingOptions
. Можно также указать нужную частоту выборки, используемую для получения или отправки звуковых данных с помощью audioFormat
параметра. В настоящее время поддерживаются форматы PCM 24K mono и PCM 16K mono, а по умолчанию — PCM 16K mono.
Чтобы включить двунаправленную потоковую передачу звука, где вы отправляете звуковые данные в вызов, можно включить 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 получает URL-адрес сервера WebSocket, он устанавливает подключение к нему. После успешного выполнения подключения инициируется потоковая передача.
Запуск потоковой передачи звука на веб-сервер во время выполнения вызова
Чтобы начать потоковую передачу мультимедиа во время вызова, можно использовать 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
Если двунаправленная потоковая передача включена с помощью EnableBidirectional
флага, MediaStreamingOptions
вы можете передавать звуковые данные обратно в Службы коммуникации Azure, который воспроизводит звук в вызов.
После того как Службы коммуникации Azure начнет потоковую передачу звука на сервер WebSocket, вы можете передать звук в службы ИИ. После обработки звукового содержимого служба ИИ может передавать звук обратно в текущий вызов в Службы коммуникации 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 службы автоматизации вызовов.
- Python версии 3.7 и выше.
- Сервер websocket, который может отправлять и получать потоки мультимедиа.
Настройка сервера websocket
Службы коммуникации Azure требует, чтобы серверное приложение настроит сервер WebSocket для потоковой передачи звука в режиме реального времени. WebSocket — это стандартизованный протокол, предоставляющий полно дуплексный канал связи по одному TCP-подключению.
Ознакомьтесь с документацией здесь, чтобы узнать больше о WebSockets и их использовании.
Получение и отправка данных потоковой передачи звука
Существует несколько способов начать прием аудиопотока, который можно настроить с помощью флага startMediaStreaming
в настройке mediaStreamingOptions
. Можно также указать нужную частоту выборки, используемую для получения или отправки звуковых данных с помощью audioFormat
параметра. В настоящее время поддерживаются форматы PCM 24K mono и PCM 16K mono, а по умолчанию — PCM 16K mono.
Чтобы включить двунаправленную потоковую передачу звука, где вы отправляете звуковые данные в вызов, можно включить 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 получает URL-адрес сервера WebSocket, он устанавливает подключение к нему. После успешного выполнения подключения инициируется потоковая передача.
Запуск потоковой передачи звука на веб-сервер во время выполнения вызова
Чтобы начать потоковую передачу мультимедиа во время вызова, можно использовать 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
Если двунаправленная потоковая передача включена с помощью EnableBidirectional
флага, MediaStreamingOptions
вы можете передавать звуковые данные обратно в Службы коммуникации Azure, который воспроизводит звук в вызов.
После того как Службы коммуникации Azure начнет потоковую передачу звука на сервер WebSocket, вы можете передать звук в службы ИИ. После обработки звукового содержимого служба ИИ может передавать звук обратно в текущий вызов в Службы коммуникации 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)
Очистка ресурсов
Если вы хотите отменить и удалить подписку на Службы коммуникации, можно удалить ресурс или группу ресурсов. При удалении группы ресурсов также удаляются все связанные с ней ресурсы. См. сведения об очистке ресурсов.
Следующие шаги
- Дополнительные сведения о потоковой передаче аудио.
- Дополнительные сведения об автоматизации вызовов и ее функциях.
- Узнайте больше о действии play.
- Узнайте больше о действии Распознавания.