Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Начало работы с использованием аудиопотоков с помощью 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
.
Этот параметр гарантирует, что потоковая передача звука запускается автоматически после подключения вызова.
MediaStreamingOptions mediaStreamingOptions = new MediaStreamingOptions(MediaStreamingAudioChannel.Unmixed);
mediaStreamingOptions.TransportUri = new Uri(websocketUri);
mediaStreamingOptions.EnableBidirectional = true;
mediaStreamingOptions.AudioFormat = AudioFormat.Pcm24KMono;
mediaStreamingOptions.EnableDtmfTones = true;
var options = new AnswerCallOptions(incomingCallContext, callbackUri) {
MediaStreamingOptions = mediaStreamingOptions,
};
AnswerCallResult answerCallResult = await client.AnswerCallAsync(options);
Когда Службы коммуникации Azure получает URL-адрес сервера WebSocket, он устанавливает подключение к нему. После успешного выполнения подключения инициируется потоковая передача.
Запуск потоковой передачи звука на веб-сервер во время выполнения вызова
Чтобы начать потоковую передачу мультимедиа во время вызова, можно использовать API. Чтобы сделать это, задайте startMediaStreaming
параметр false
(который является значением по умолчанию), а затем в вызове можно использовать начальный API для включения потоковой передачи мультимедиа.
MediaStreamingOptions mediaStreamingOptions = new MediaStreamingOptions(MediaStreamingAudioChannel.Unmixed);
mediaStreamingOptions.TransportUri = new Uri(websocketUri);
mediaStreamingOptions.EnableBidirectional = true;
mediaStreamingOptions.AudioFormat = AudioFormat.Pcm24KMono;
mediaStreamingOptions.EnableDtmfTones = true;
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",
OperationCallbackUri = eventCallbackUri
};
await callMedia.StartMediaStreamingAsync(options);
Остановка потоковой передачи звука
Чтобы остановить прием аудиопотоков во время вызова, можно использовать API остановки потоковой передачи. Это позволяет остановить потоковую передачу звука в любой момент в вызове. Существует два способа остановки потоковой передачи звука;
- Активация API остановки потоковой передачи: используйте API для остановки получения данных потоковой передачи звука, пока вызов по-прежнему активен.
- Автоматическая остановка при отключении звонка: потоковая передача звука автоматически останавливается при отключении звонка.
StopMediaStreamingOptions options = new StopMediaStreamingOptions() {
OperationContext = "stopMediaStreamingContext",
OperationCallbackUri = eventCallbackUri
};
await callMedia.StopMediaStreamingAsync(options);
Обработка аудиопотоков на сервере 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
}
}
}
}
Первый полученный пакет содержит метаданные о потоке, включая параметры звука, такие как кодировка, частота выборок и другие сведения о конфигурации.
Дополнительные заголовки
Идентификатор корреляции и идентификатор подключения вызова теперь включены в заголовки WebSocket для повышения отслеживаемости x-ms-call-correlation-id
и x-ms-call-connection-id
. Они отправляются, когда Службы коммуникации Azure пытаются подключиться к конечной точке.
{
"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(MediaStreamingAudioChannel.UNMIXED);
mediaStreamingOptions.setTransportUrl(appConfig.getTransportUrl());
mediaStreamingOptions.setStartMediaStreaming(true);
mediaStreamingOptions.setEnableDtmfTones(true); // Allow receiving DTMF tones
mediaStreamingOptions.setEnableBidirectional(true);
mediaStreamingOptions.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 mediaStreamingOptions = new StartMediaStreamingOptions();
mediaStreamingOptions.setOperationContext("StartMediaStreamingContext");
client.getCallConnection(callConnectionId)
.getCallMedia()
.startMediaStreamingWithResponse(mediaStreamingOptions, Context.NONE);
Остановка потоковой передачи звука
Чтобы остановить прием аудиопотоков во время вызова, можно использовать API остановки потоковой передачи. Это позволяет остановить потоковую передачу звука в любой момент в вызове. Существует два способа остановки потоковой передачи звука;
- Активация API остановки потоковой передачи: используйте API для остановки получения данных потоковой передачи звука, пока вызов по-прежнему активен.
- Автоматическая остановка при отключении звонка: потоковая передача звука автоматически останавливается при отключении звонка.
StopMediaStreamingOptions stopOptions = new StopMediaStreamingOptions();
stopOptions.setOperationContext("StopMediaStreamingContext");
client.getCallConnection(callConnectionId)
.getCallMedia()
.stopMediaStreamingWithResponse(stopOptions, 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());
}
}
Первый полученный пакет содержит метаданные о потоке, включая параметры звука, такие как кодировка, частота выборок и другие сведения о конфигурации.
Дополнительные заголовки
Идентификатор корреляции и идентификатор подключения вызова теперь включены в заголовки WebSocket для повышения отслеживаемости x-ms-call-correlation-id
и x-ms-call-connection-id
. Они отправляются, когда Службы коммуникации Azure пытаются подключиться к конечной точке.
{
"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
.
Этот параметр гарантирует, что потоковая передача звука запускается автоматически после подключения вызова.
const mediaStreamingOptions = {
transportUrl: "wss://YOUR_WEBSOCKET_URL",
transportType: "websocket",
contentType: "audio",
audioChannelType: "mixed",
startMediaStreaming: true,
enableDtmfTones: true,
enableBidirectional: true,
audioFormat: "Pcm24KMono"
};
const answerCallOptions = {
mediaStreamingOptions: mediaStreamingOptions
};
answerCallResult = await acsClient.answerCall(
incomingCallContext,
callbackUri,
answerCallOptions
);
Когда Службы коммуникации Azure получает URL-адрес сервера WebSocket, он устанавливает подключение к нему. После успешного выполнения подключения инициируется потоковая передача.
Запуск потоковой передачи звука на веб-сервер во время выполнения вызова
Чтобы начать потоковую передачу мультимедиа во время вызова, можно использовать API. Чтобы сделать это, задайте startMediaStreaming
параметр false
(который является значением по умолчанию), а затем в вызове можно использовать начальный API для включения потоковой передачи мультимедиа.
const mediaStreamingOptions: MediaStreamingOptions = {
transportUrl: "wss://YOUR_WEBSOCKET_URL",
transportType: "websocket",
contentType: "audio",
audioChannelType: "unmixed",
startMediaStreaming: false,
enableDtmfTones: true,
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
}
}
Первый полученный пакет содержит метаданные о потоке, включая параметры звука, такие как кодировка, частота выборок и другие сведения о конфигурации.
Дополнительные заголовки
Идентификатор корреляции и идентификатор подключения вызова теперь включены в заголовки WebSocket для повышения отслеживаемости x-ms-call-correlation-id
и x-ms-call-connection-id
. Они отправляются, когда Службы коммуникации Azure пытаются подключиться к конечной точке.
{
"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_options = MediaStreamingOptions(
transport_url=WEBSOCKET_URI_HOST,
transport_type=StreamingTransportType.WEBSOCKET,
content_type=MediaStreamingContentType.AUDIO,
audio_channel_type=MediaStreamingAudioChannelType.MIXED,
start_media_streaming=True,
enable_bidirectional=True,
enable_dtmf_tones=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_options = MediaStreamingOptions(
transport_url=WEBSOCKET_URI_HOST,
transport_type=StreamingTransportType.WEBSOCKET,
content_type=MediaStreamingContentType.AUDIO,
audio_channel_type=MediaStreamingAudioChannelType.MIXED,
start_media_streaming=True,
enable_bidirectional=True,
enable_dtmf_tones=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}")
Первый полученный пакет содержит метаданные о потоке, включая параметры звука, такие как кодировка, частота выборок и другие сведения о конфигурации.
Дополнительные заголовки
Идентификатор корреляции и идентификатор подключения вызова теперь включены в заголовки WebSocket для повышения отслеживаемости x-ms-call-correlation-id
и x-ms-call-connection-id
. Они отправляются, когда Службы коммуникации Azure пытаются подключиться к конечной точке.
{
"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)
Очистка ресурсов
Если вы хотите отменить и удалить подписку на Службы коммуникации, можно удалить ресурс или группу ресурсов. При удалении группы ресурсов также удаляются все связанные с ней ресурсы. См. сведения об очистке ресурсов.
Следующие шаги
- Узнать больше о потоковой передаче аудио.
- Дополнительные сведения об автоматизации вызовов и ее функциях.
- Узнайте больше об игровом действии .
- Узнайте больше о действии Распознавания.