Hızlı Başlangıç: Sunucu Tarafı Ses Akışı
Önemli
Bu makalede açıklanan işlevsellik şu anda genel önizleme aşamasındadır. Bu önizleme sürümü hizmet düzeyi sözleşmesi olmadan sağlanır ve üretim iş yükleri için bu sürümü önermeyiz. Bazı özellikler desteklenmiyor olabileceği gibi özellikleri sınırlandırılmış da olabilir. Daha fazla bilgi için bkz. Microsoft Azure Önizlemeleri Ek Kullanım Koşulları.
Azure İletişim Hizmetleri Ses Akışı API'sini kullanarak ses akışlarını kullanmaya başlayın. Bu hızlı başlangıçta, otomatik çağrı yönlendirme çözümü oluşturmak için Çağrı Otomasyonu API'lerini zaten bildiğiniz varsayılır.
Bu hızlı başlangıçta açıklanan işlevsellik şu anda genel önizleme aşamasındadır.
Önkoşullar
- Etkin aboneliği olan bir Azure hesabı, ayrıntılar için bkz . Ücretsiz hesap oluşturma.
- bir Azure İletişim Hizmetleri kaynağı. Bkz. Azure İletişim Hizmetleri kaynağı oluşturma.
- Çağrı Otomasyonu SDK'sı kullanılarak oluşturulan yeni bir web hizmeti uygulaması.
- İşletim sisteminiz için en son .NET kitaplığı .
- Medya akışlarını alabilen bir websocket sunucusu.
Websocket sunucusu ayarlama
Azure İletişim Hizmetleri, sunucu uygulamanızın gerçek zamanlı olarak ses akışı yapmak için bir WebSocket sunucusu ayarlamasını gerektirir. WebSocket, tek bir TCP bağlantısı üzerinden tam çift yönlü iletişim kanalı sağlayan standartlaştırılmış bir protokoldür. İsteğe bağlı olarak, websocket bağlantısı üzerinden ses akışları almak için bir uygulama oluşturmanıza olanak tanıyan Azure Hizmetleri Azure WebApps'i kullanabilirsiniz. Bu hızlı başlangıcı izleyin.
Arama oluşturma
Arama oluşturma ve akış ayrıntıları sağlama
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);
Ses akışını başlatma
Ses akışını başlatma:
StartMediaStreamingOptions options = new StartMediaStreamingOptions()
{
OperationCallbackUri = new Uri(callbackUriHost),
OperationContext = "startMediaStreamingContext"
};
await callMedia.StartMediaStreamingAsync(options);
Azure İletişim Hizmetleri WebSocket sunucunuzun URL'sini aldığında, bu sunucuya bir bağlantı oluşturur. Azure İletişim Hizmetleri WebSocket sunucunuza başarıyla bağlandıktan ve akış başlatıldıktan sonra, gelen medya paketleriyle ilgili meta verileri içeren ilk veri paketi aracılığıyla gönderilir.
Meta veri paketi şöyle görünür:
{
"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
}
}
Ses akışını durdurma
Ses akışını durdurma
StopMediaStreamingOptions stopOptions = new StopMediaStreamingOptions()
{
OperationCallbackUri = new Uri(callbackUriHost)
};
await callMedia.StopMediaStreamingAsync(stopOptions);
Websocket sunucunuzdaki ses akışlarını işleme
Aşağıdaki örnekte, websocket sunucunuzu kullanarak ses akışlarını dinleme işlemi gösterilmektedir.
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) { }
}
}
Önkoşullar
- Etkin aboneliği olan Azure hesabı, ayrıntılar için bkz . Ücretsiz hesap oluşturma.
- bir Azure İletişim Hizmetleri kaynağı. Bkz. Azure İletişim Hizmetleri kaynağı oluşturma.
- Çağrı Otomasyonu SDK'sı kullanılarak oluşturulan yeni bir web hizmeti uygulaması.
- Java Development Kit sürüm 8 veya üzeri.
- Apache Maven.
Websocket sunucusu ayarlama
Azure İletişim Hizmetleri, sunucu uygulamanızın gerçek zamanlı olarak ses akışı yapmak için bir WebSocket sunucusu ayarlamasını gerektirir. WebSocket, tek bir TCP bağlantısı üzerinden tam çift yönlü iletişim kanalı sağlayan standartlaştırılmış bir protokoldür. İsteğe bağlı olarak, websocket bağlantısı üzerinden ses akışları almak için bir uygulama oluşturmanıza olanak tanıyan Azure Hizmetleri Azure WebApps'i kullanabilirsiniz. Bu hızlı başlangıcı izleyin.
Arama oluşturma
Arama oluşturma ve akış ayrıntıları sağlama
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();
Ses akışını başlatma
Ses akışını başlatma:
StartMediaStreamingOptions startOptions = new StartMediaStreamingOptions()
.setOperationContext("startMediaStreamingContext")
.setOperationCallbackUrl(appConfig.getBasecallbackuri());
client.getCallConnection(callConnectionId)
.getCallMedia()
.startMediaStreamingWithResponse(startOptions, Context.NONE);
Azure İletişim Hizmetleri WebSocket sunucunuzun URL'sini aldığında, bu sunucuya bir bağlantı oluşturur. Azure İletişim Hizmetleri WebSocket sunucunuza başarıyla bağlandıktan ve akış başlatıldıktan sonra, gelen medya paketleriyle ilgili meta verileri içeren ilk veri paketi aracılığıyla gönderilir.
Meta veri paketi şöyle görünür:
{
"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
}
}
Ses akışını durdurma
Ses akışını durdurma
StopMediaStreamingOptions stopOptions = new StopMediaStreamingOptions()
.setOperationCallbackUrl(appConfig.getBasecallbackuri());
client.getCallConnection(callConnectionId)
.getCallMedia()
.stopMediaStreamingWithResponse(stopOptions, Context.NONE);
Websocket sunucunuzda medya akışlarını işleme
Aşağıdaki örnekte, websocket sunucunuzu kullanarak medya akışını dinleme işlemi gösterilmektedir. Çalıştırılması gereken iki dosya olacaktır: App.java ve 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("----------------------------------------------------------------");
}
}
}
Önkoşullar
- Etkin aboneliği olan Azure hesabı, ayrıntılar için bkz . Ücretsiz hesap oluşturma.
- bir Azure İletişim Hizmetleri kaynağı. Bkz. Azure İletişim Hizmetleri kaynağı oluşturma.
- Çağrı Otomasyonu SDK'sı kullanılarak oluşturulan yeni bir web hizmeti uygulaması.
- LTS yüklemesini Node.js
- Medya akışlarını alabilen bir websocket sunucusu.
Websocket sunucusu ayarlama
Azure İletişim Hizmetleri, sunucu uygulamanızın gerçek zamanlı olarak ses akışı yapmak için bir WebSocket sunucusu ayarlamasını gerektirir. WebSocket, tek bir TCP bağlantısı üzerinden tam çift yönlü iletişim kanalı sağlayan standartlaştırılmış bir protokoldür. İsteğe bağlı olarak, websocket bağlantısı üzerinden ses akışları almak için bir uygulama oluşturmanıza olanak tanıyan Azure Hizmetleri Azure WebApps'i kullanabilirsiniz. Bu hızlı başlangıcı izleyin.
Arama oluşturma
Arama oluşturma ve akış ayrıntıları sağlama
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
};
Ses akışını başlatma
Ses akışını başlatma:
const streamingOptions: StartMediaStreamingOptions = {
operationContext: "startMediaStreamingContext",
operationCallbackUrl: process.env.CALLBACK_URI + "/api/callbacks"
}
await callMedia.startMediaStreaming(streamingOptions);
Azure İletişim Hizmetleri WebSocket sunucunuzun URL'sini aldığında, bu sunucuya bir bağlantı oluşturur. Azure İletişim Hizmetleri WebSocket sunucunuza başarıyla bağlandıktan ve akış başlatıldıktan sonra, gelen medya paketleriyle ilgili meta verileri içeren ilk veri paketi aracılığıyla gönderilir.
Meta veri paketi şöyle görünür:
{
"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
}
}
Ses akışını durdurma
Ses akışını durdurma
const stopMediaStreamingOptions: StopMediaStreamingOptions = {
operationCallbackUrl: process.env.CALLBACK_URI + "/api/callbacks"
}
await callMedia.stopMediaStreaming(stopMediaStreamingOptions);
Websocket sunucunuzdaki ses akışlarını işleme
Aşağıdaki örnekte, websocket sunucunuzu kullanarak ses akışlarını dinleme işlemi gösterilmektedir.
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');
Önkoşullar
- Etkin aboneliği olan Azure hesabı, ayrıntılar için bkz . Ücretsiz hesap oluşturma.
- bir Azure İletişim Hizmetleri kaynağı. Bkz. Azure İletişim Hizmetleri kaynağı oluşturma.
- Çağrı Otomasyonu SDK'sı kullanılarak oluşturulan yeni bir web hizmeti uygulaması.
- Python 3.7+.
- Medya akışlarını alabilen bir websocket sunucusu.
Websocket sunucusu ayarlama
Azure İletişim Hizmetleri, sunucu uygulamanızın gerçek zamanlı olarak ses akışı yapmak için bir WebSocket sunucusu ayarlamasını gerektirir. WebSocket, tek bir TCP bağlantısı üzerinden tam çift yönlü iletişim kanalı sağlayan standartlaştırılmış bir protokoldür. İsteğe bağlı olarak, websocket bağlantısı üzerinden ses akışları almak için bir uygulama oluşturmanıza olanak tanıyan Azure Hizmetleri Azure WebApps'i kullanabilirsiniz. Bu hızlı başlangıcı izleyin.
Arama oluşturma
Arama oluşturma ve akış ayrıntıları sağlama
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
)
Ses akışını başlatma
Ses akışını başlatma:
call_connection_client.start_media_streaming()
Azure İletişim Hizmetleri WebSocket sunucunuzun URL'sini aldığında, bu sunucuya bir bağlantı oluşturur. Azure İletişim Hizmetleri WebSocket sunucunuza başarıyla bağlandıktan ve akış başlatıldıktan sonra, gelen medya paketleriyle ilgili meta verileri içeren ilk veri paketi aracılığıyla gönderilir.
Meta veri paketi şöyle görünür:
{
"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
}
}
Ses akışını durdurma
Ses akışını durdurma
call_connection_client.stop_media_streaming()
Websocket sunucunuzdaki ses akışlarını işleme
Aşağıdaki örnekte, websocket sunucunuzu kullanarak ses akışlarını dinleme işlemi gösterilmektedir.
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()
Ses akış şeması
Meta veri paketi aracılığıyla gönderdikten sonra Azure İletişim Hizmetleri WebSocket sunucunuza ses medyası akışı yapmaya başlar. Aşağıda, sunucunuzun alacağı medya nesnesinin nasıl göründüğüne ilişkin bir örnek verilmiştir.
{
"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.
}
}
Kaynakları temizleme
İletişim Hizmetleri aboneliğini temizlemek ve kaldırmak istiyorsanız, kaynağı veya kaynak grubunu silebilirsiniz. Kaynak grubunun silinmesi, kaynak grubuyla ilişkili diğer tüm kaynakları da siler. Kaynakları temizleme hakkında daha fazla bilgi edinin.
Sonraki adımlar
- Ses Akışı hakkında daha fazla bilgi edinin.
- Çağrı Otomasyonu ve özellikleri hakkında daha fazla bilgi edinin.
- Yürütme eylemi hakkında daha fazla bilgi edinin.
- Eylemi tanıma hakkında daha fazla bilgi edinin.