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

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

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

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