Início Rápido: Streaming de Áudio do Lado do servidor
Importante
A funcionalidade descrita neste artigo está atualmente em versão prévia pública. Essa versão prévia é fornecida sem um contrato de nível de serviço e não é recomendada para cargas de trabalho de produção. Alguns recursos podem não ter suporte ou podem ter restrição de recursos. Para obter mais informações, consulte Termos de Uso Complementares de Versões Prévias do Microsoft Azure.
Introdução ao uso de fluxos de áudio pela API de Streaming de Áudio dos Serviços de Comunicação do Azure. Este início rápido pressupõe que você já esteja familiarizado com as APIs de Automação de Chamadas para criar uma solução automatizada de roteamento de chamadas.
Atualmente, a funcionalidade descrita neste início rápido está em versão prévia pública.
Pré-requisitos
- Uma conta do Azure com uma assinatura ativa, para obter detalhes, consulte Criar uma conta gratuitamente.
- Um recurso dos Serviços de Comunicação do Azure. Veja Criar um recurso dos Serviços de Comunicação do Azure.
- Um novo aplicativo de serviço Web criado usando o SDK de Automação de Chamadas.
- A versão mais recente da biblioteca .NET para seu sistema operacional.
- Um servidor WebSocket que pode receber fluxos de mídia.
Configurar um servidor WebSocket
Os Serviços de Comunicação do Azure exigem que o aplicativo de servidor configure um servidor WebSocket para transmitir áudios em tempo real. O WebSocket é um protocolo padronizado que fornece um canal de comunicação full-duplex sobre uma única conexão TCP. Opcionalmente, é possível usar os Aplicativos Web do Azure dos serviços do Azure para criar um aplicativo que receba fluxos de áudio sobre uma conexão WebSocket. Siga este início rápido.
Estabelecer uma chamada
Estabelecer uma chamada e fornecer detalhes de streaming
MediaStreamingOptions mediaStreamingOptions = new MediaStreamingOptions(
new Uri("<WEBSOCKET URL>"),
MediaStreamingContent.Audio,
MediaStreamingAudioChannel.Mixed,
MediaStreamingTransport.Websocket,
false);
var createCallOptions = new CreateCallOptions(callInvite, callbackUri)
{
CallIntelligenceOptions = new CallIntelligenceOptions() { CognitiveServicesEndpoint = new Uri(cognitiveServiceEndpoint) },
MediaStreamingOptions = mediaStreamingOptions,
};
CreateCallResult createCallResult = await callAutomationClient.CreateCallAsync(createCallOptions);
Iniciar o streaming de áudio
Como iniciar o streaming de áudio:
StartMediaStreamingOptions options = new StartMediaStreamingOptions()
{
OperationCallbackUri = new Uri(callbackUriHost),
OperationContext = "startMediaStreamingContext"
};
await callMedia.StartMediaStreamingAsync(options);
Quando os Serviços de Comunicação do Azure recebem a URL do seu servidor WebSocket, ele cria uma conexão com ele. Quando os Serviços de Comunicação do Azure se conectarem com sucesso ao seu servidor WebSocket e o streaming for iniciado, ele enviará o primeiro pacote de dados contendo metadados sobre os pacotes de mídia recebidos.
O pacote de metadados terá esta aparência:
{
"kind": <string> // What kind of data this is, e.g. AudioMetadata, AudioData.
"audioMetadata": {
"subscriptionId": <string>, // unique identifier for a subscription request
"encoding":<string>, // PCM only supported
"sampleRate": <int>, // 16000 default
"channels": <int>, // 1 default
"length": <int> // 640 default
}
}
Parar a transmissão de áudio
Como interromper o streaming de áudio
StopMediaStreamingOptions stopOptions = new StopMediaStreamingOptions()
{
OperationCallbackUri = new Uri(callbackUriHost)
};
await callMedia.StopMediaStreamingAsync(stopOptions);
Manipulando fluxos de áudio no seu servidor Websocket
O exemplo a seguir demonstra como ouvir fluxos de áudio usando seu servidor Websocket.
HttpListener httpListener = new HttpListener();
httpListener.Prefixes.Add("http://localhost:80/");
httpListener.Start();
while (true)
{
HttpListenerContext httpListenerContext = await httpListener.GetContextAsync();
if (httpListenerContext.Request.IsWebSocketRequest)
{
WebSocketContext websocketContext;
try
{
websocketContext = await httpListenerContext.AcceptWebSocketAsync(subProtocol: null);
}
catch (Exception ex)
{
return;
}
WebSocket webSocket = websocketContext.WebSocket;
try
{
while (webSocket.State == WebSocketState.Open || webSocket.State == WebSocketState.CloseSent)
{
byte[] receiveBuffer = new byte[2048];
var cancellationToken = new CancellationTokenSource(TimeSpan.FromSeconds(60)).Token;
WebSocketReceiveResult receiveResult = await webSocket.ReceiveAsync(new ArraySegment<byte>(receiveBuffer), cancellationToken);
if (receiveResult.MessageType != WebSocketMessageType.Close)
{
var data = Encoding.UTF8.GetString(receiveBuffer).TrimEnd('\0');
try
{
var eventData = JsonConvert.DeserializeObject<AudioBaseClass>(data);
if (eventData != null)
{
if(eventData.kind == "AudioMetadata")
{
//Process audio metadata
}
else if(eventData.kind == "AudioData")
{
//Process audio data
var byteArray = eventData.audioData.data;
//use audio byteArray as you want
}
}
}
catch { }
}
}
}
catch (Exception ex) { }
}
}
Pré-requisitos
- Conta do Azure com uma assinatura ativa, para obter detalhes, veja Criar uma conta gratuitamente.
- Um recurso dos Serviços de Comunicação do Azure. Veja Criar um recurso dos Serviços de Comunicação do Azure.
- Um novo aplicativo de serviço Web criado usando o SDK de Automação de Chamadas.
- Java Development Kit versão 8 ou superior.
- Apache Maven.
Configurar um servidor WebSocket
Os Serviços de Comunicação do Azure exigem que o aplicativo de servidor configure um servidor WebSocket para transmitir áudios em tempo real. O WebSocket é um protocolo padronizado que fornece um canal de comunicação full-duplex sobre uma única conexão TCP. Opcionalmente, é possível usar os Aplicativos Web do Azure dos serviços do Azure para criar um aplicativo que receba fluxos de áudio sobre uma conexão WebSocket. Siga este início rápido.
Estabelecer uma chamada
Estabelecer uma chamada e fornecer detalhes de streaming
CallInvite callInvite = new CallInvite(target, caller);
CallIntelligenceOptions callIntelligenceOptions = new CallIntelligenceOptions().setCognitiveServicesEndpoint(appConfig.getCognitiveServiceEndpoint());
MediaStreamingOptions mediaStreamingOptions = new MediaStreamingOptions(appConfig.getWebSocketUrl(), MediaStreamingTransport.WEBSOCKET, MediaStreamingContentType.AUDIO, MediaStreamingAudioChannel.UNMIXED);
mediaStreamingOptions.setStartMediaStreaming(false);
CreateCallOptions createCallOptions = new CreateCallOptions(callInvite, appConfig.getCallBackUri());
createCallOptions.setCallIntelligenceOptions(callIntelligenceOptions);
createCallOptions.setMediaStreamingOptions(mediaStreamingOptions);
Response<CreateCallResult> result = client.createCallWithResponse(createCallOptions, Context.NONE);
return result.getValue().getCallConnectionProperties().getCallConnectionId();
Iniciar o streaming de áudio
Como iniciar o streaming de áudio:
StartMediaStreamingOptions startOptions = new StartMediaStreamingOptions()
.setOperationContext("startMediaStreamingContext")
.setOperationCallbackUrl(appConfig.getBasecallbackuri());
client.getCallConnection(callConnectionId)
.getCallMedia()
.startMediaStreamingWithResponse(startOptions, Context.NONE);
Quando os Serviços de Comunicação do Azure recebem a URL do seu servidor WebSocket, ele cria uma conexão com ele. Quando os Serviços de Comunicação do Azure se conectarem com sucesso ao seu servidor WebSocket e o streaming for iniciado, ele enviará o primeiro pacote de dados contendo metadados sobre os pacotes de mídia recebidos.
O pacote de metadados terá esta aparência:
{
"kind": <string> // What kind of data this is, e.g. AudioMetadata, AudioData.
"audioMetadata": {
"subscriptionId": <string>, // unique identifier for a subscription request
"encoding":<string>, // PCM only supported
"sampleRate": <int>, // 16000 default
"channels": <int>, // 1 default
"length": <int> // 640 default
}
}
Parar a transmissão de áudio
Como interromper o streaming de áudio
StopMediaStreamingOptions stopOptions = new StopMediaStreamingOptions()
.setOperationCallbackUrl(appConfig.getBasecallbackuri());
client.getCallConnection(callConnectionId)
.getCallMedia()
.stopMediaStreamingWithResponse(stopOptions, Context.NONE);
Lidar com fluxos de mídia no servidor WebSocket
O exemplo abaixo demonstra como ouvir o fluxo de mídia usando o servidor WebSocket. Haverá dois arquivos que precisam ser executados: App.java e WebSocketServer.java
package com.example;
import org.glassfish.tyrus.server.Server;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class App {
public static void main(String[] args) {
Server server = new Server("localhost", 8081, "/ws", null, WebSocketServer.class);
try {
server.start();
System.out.println("Web socket running on port 8081...");
System.out.println("wss://localhost:8081/ws/server");
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
reader.readLine();
} catch (Exception e) {
e.printStackTrace();
} finally {
server.stop();
}
}
}
package com.example;
import javax.websocket.OnMessage;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import com.azure.communication.callautomation.models.streaming.StreamingData;
import com.azure.communication.callautomation.models.streaming.StreamingDataParser;
import com.azure.communication.callautomation.models.streaming.media.AudioData;
import com.azure.communication.callautomation.models.streaming.media.AudioMetadata;
@ServerEndpoint("/server")
public class WebSocketServer {
@OnMessage
public void onMessage(String message, Session session) {
// System.out.println("Received message: " + message);
StreamingData data = StreamingDataParser.parse(message);
if (data instanceof AudioMetadata) {
AudioMetadata audioMetaData = (AudioMetadata) data;
System.out.println("----------------------------------------------------------------");
System.out.println("SUBSCRIPTION ID:-->" + audioMetaData.getMediaSubscriptionId());
System.out.println("ENCODING:-->" + audioMetaData.getEncoding());
System.out.println("SAMPLE RATE:-->" + audioMetaData.getSampleRate());
System.out.println("CHANNELS:-->" + audioMetaData.getChannels());
System.out.println("LENGTH:-->" + audioMetaData.getLength());
System.out.println("----------------------------------------------------------------");
}
if (data instanceof AudioData) {
System.out.println("----------------------------------------------------------------");
AudioData audioData = (AudioData) data;
System.out.println("DATA:-->" + audioData.getData());
System.out.println("TIMESTAMP:-->" + audioData.getTimestamp());
// System.out.println("PARTICIPANT:-->" + audioData.getParticipant().getRawId()
// != null
// ? audioData.getParticipant().getRawId()
// : "");
System.out.println("IS SILENT:-->" + audioData.isSilent());
System.out.println("----------------------------------------------------------------");
}
}
}
Pré-requisitos
- Conta do Azure com uma assinatura ativa, para obter detalhes, veja Criar uma conta gratuitamente.
- Um recurso dos Serviços de Comunicação do Azure. Veja Criar um recurso dos Serviços de Comunicação do Azure.
- Um novo aplicativo de serviço Web criado usando o SDK de Automação de Chamadas.
- Instalação do LTS do Node.js.
- Um servidor WebSocket que pode receber fluxos de mídia.
Configurar um servidor WebSocket
Os Serviços de Comunicação do Azure exigem que o aplicativo de servidor configure um servidor WebSocket para transmitir áudios em tempo real. O WebSocket é um protocolo padronizado que fornece um canal de comunicação full-duplex sobre uma única conexão TCP. Opcionalmente, é possível usar os Aplicativos Web do Azure dos serviços do Azure para criar um aplicativo que receba fluxos de áudio sobre uma conexão WebSocket. Siga este início rápido.
Estabelecer uma chamada
Estabelecer uma chamada e fornecer detalhes de streaming
const mediaStreamingOptions: MediaStreamingOptions = {
transportUrl: "<WEBSOCKET URL>",
transportType: "websocket",
contentType: "audio",
audioChannelType: "unmixed",
startMediaStreaming: false
}
const options: CreateCallOptions = {
callIntelligenceOptions: { cognitiveServicesEndpoint: process.env.COGNITIVE_SERVICES_ENDPOINT },
mediaStreamingOptions: mediaStreamingOptions
};
Iniciar o streaming de áudio
Como iniciar o streaming de áudio:
const streamingOptions: StartMediaStreamingOptions = {
operationContext: "startMediaStreamingContext",
operationCallbackUrl: process.env.CALLBACK_URI + "/api/callbacks"
}
await callMedia.startMediaStreaming(streamingOptions);
Quando os Serviços de Comunicação do Azure recebem a URL do seu servidor WebSocket, ele cria uma conexão com ele. Quando os Serviços de Comunicação do Azure se conectarem com sucesso ao seu servidor WebSocket e o streaming for iniciado, ele enviará o primeiro pacote de dados contendo metadados sobre os pacotes de mídia recebidos.
O pacote de metadados terá esta aparência:
{
"kind": <string> // What kind of data this is, e.g. AudioMetadata, AudioData.
"audioMetadata": {
"subscriptionId": <string>, // unique identifier for a subscription request
"encoding":<string>, // PCM only supported
"sampleRate": <int>, // 16000 default
"channels": <int>, // 1 default
"length": <int> // 640 default
}
}
Parar a transmissão de áudio
Como interromper o streaming de áudio
const stopMediaStreamingOptions: StopMediaStreamingOptions = {
operationCallbackUrl: process.env.CALLBACK_URI + "/api/callbacks"
}
await callMedia.stopMediaStreaming(stopMediaStreamingOptions);
Manipulando fluxos de áudio no seu servidor Websocket
O exemplo a seguir demonstra como ouvir fluxos de áudio usando seu servidor Websocket.
import WebSocket from 'ws';
import { streamingData } from '@azure/communication-call-automation/src/utli/streamingDataParser'
const wss = new WebSocket.Server({ port: 8081 });
wss.on('connection', (ws: WebSocket) => {
console.log('Client connected');
ws.on('message', (packetData: ArrayBuffer) => {
const decoder = new TextDecoder();
const stringJson = decoder.decode(packetData);
console.log("STRING JSON=>--" + stringJson)
//var response = streamingData(stringJson);
var response = streamingData(packetData);
if ('locale' in response) {
console.log("Transcription Metadata")
console.log(response.callConnectionId);
console.log(response.correlationId);
console.log(response.locale);
console.log(response.subscriptionId);
}
if ('text' in response) {
console.log("Transcription Data")
console.log(response.text);
console.log(response.format);
console.log(response.confidence);
console.log(response.offset);
console.log(response.duration);
console.log(response.resultStatus);
if ('phoneNumber' in response.participant) {
console.log(response.participant.phoneNumber);
}
response.words.forEach(element => {
console.log(element.text)
console.log(element.duration)
console.log(element.offset)
});
}
});
ws.on('close', () => {
console.log('Client disconnected');
});
});
// function processData(data: ArrayBuffer) {
// const byteArray = new Uint8Array(data);
// }
console.log('WebSocket server running on port 8081');
Pré-requisitos
- Conta do Azure com uma assinatura ativa, para obter detalhes, veja Criar uma conta gratuitamente.
- Um recurso dos Serviços de Comunicação do Azure. Veja Criar um recurso dos Serviços de Comunicação do Azure.
- Um novo aplicativo de serviço Web criado usando o SDK de Automação de Chamadas.
- Python 3.7+.
- Um servidor WebSocket que pode receber fluxos de mídia.
Configurar um servidor WebSocket
Os Serviços de Comunicação do Azure exigem que o aplicativo de servidor configure um servidor WebSocket para transmitir áudios em tempo real. O WebSocket é um protocolo padronizado que fornece um canal de comunicação full-duplex sobre uma única conexão TCP. Opcionalmente, é possível usar os Aplicativos Web do Azure dos serviços do Azure para criar um aplicativo que receba fluxos de áudio sobre uma conexão WebSocket. Siga este início rápido.
Estabelecer uma chamada
Estabelecer uma chamada e fornecer detalhes de streaming
media_streaming_options = MediaStreamingOptions(
transport_url="wss://e063-2409-40c2-4004-eced-9487-4dfb-b0e4-10fb.ngrok-free.app",
transport_type=MediaStreamingTransportType.WEBSOCKET,
content_type=MediaStreamingContentType.AUDIO,
audio_channel_type=MediaStreamingAudioChannelType.UNMIXED,
start_media_streaming=False
)
call_connection_properties = call_automation_client.create_call(target_participant,
CALLBACK_EVENTS_URI,
cognitive_services_endpoint=COGNITIVE_SERVICES_ENDPOINT,
source_caller_id_number=source_caller,
media_streaming=media_streaming_options
)
Iniciar o streaming de áudio
Como iniciar o streaming de áudio:
call_connection_client.start_media_streaming()
Quando os Serviços de Comunicação do Azure recebem a URL do seu servidor WebSocket, ele cria uma conexão com ele. Quando os Serviços de Comunicação do Azure se conectarem com sucesso ao seu servidor WebSocket e o streaming for iniciado, ele enviará o primeiro pacote de dados contendo metadados sobre os pacotes de mídia recebidos.
O pacote de metadados terá esta aparência:
{
"kind": <string> // What kind of data this is, e.g. AudioMetadata, AudioData.
"audioMetadata": {
"subscriptionId": <string>, // unique identifier for a subscription request
"encoding":<string>, // PCM only supported
"sampleRate": <int>, // 16000 default
"channels": <int>, // 1 default
"length": <int> // 640 default
}
}
Parar a transmissão de áudio
Como interromper o streaming de áudio
call_connection_client.stop_media_streaming()
Manipulando fluxos de áudio no seu servidor Websocket
O exemplo a seguir demonstra como ouvir fluxos de áudio usando seu servidor Websocket.
import asyncio
import json
import websockets
async def handle_client(websocket, path):
print("Client connected")
try:
async for message in websocket:
print(message)
packet_data = json.loads(message)
packet_data = message.encode('utf-8')
print("Packet DATA:-->",packet_data)
except websockets.exceptions.ConnectionClosedOK:
print("Client disconnected")
start_server = websockets.serve(handle_client, "localhost", 8081)
print('WebSocket server running on port 8081')
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()
Esquema de streaming de áudio
Depois de enviar o pacote de metadados, os Serviços de Comunicação do Azure iniciarão a transmissão de mídia de áudio no seu servidor WebSocket. Veja abaixo um exemplo do objeto de mídia que o servidor receberá.
{
"kind": <string>, // What kind of data this is, e.g. AudioMetadata, AudioData.
"audioData":{
"data": <string>, // Base64 Encoded audio buffer data
"timestamp": <string>, // In ISO 8601 format (yyyy-mm-ddThh:mm:ssZ)
"participantRawID": <string>,
"silent": <boolean> // Indicates if the received audio buffer contains only silence.
}
}
Limpar os recursos
Se quiser limpar e remover uma assinatura dos Serviços de Comunicação, exclua o recurso ou o grupo de recursos. Excluir o grupo de recursos também exclui todos os recursos associados a ele. Saiba mais sobre como limpar recursos.
Próximas etapas
- Saiba mais sobre Streaming de Áudio.
- Saiba mais sobre a Automação de Chamadas e seus recursos.
- Saiba mais sobre Ação de reprodução.
- Saiba mais sobre Reconhecer ação.