Aggiungere la trascrizione in tempo reale nell'applicazione

Importante

Attualmente la funzionalità descritta in questo articolo è disponibile in anteprima pubblica. Questa versione di anteprima viene fornita senza contratto di servizio, pertanto se ne sconsiglia l’uso per i carichi di lavoro in ambienti di produzione. Alcune funzionalità potrebbero non essere supportate o potrebbero presentare funzionalità limitate. Per altre informazioni, vedere le Condizioni supplementari per l'uso delle anteprime di Microsoft Azure.

Questa guida consente di comprendere meglio i diversi modi in cui è possibile usare i Servizi di comunicazione di Azure che offrono la trascrizione in tempo reale tramite gli SDK di Automazione delle chiamate.

Prerequisiti

Configurare un server WebSocket

Servizi di comunicazione di Azure richiede che l'applicazione server configuri un server WebSocket per trasmettere la trascrizione in tempo reale. WebSocket è un protocollo standardizzato che fornisce un canale di comunicazioni full duplex su una singola connessione TCP. Facoltativamente, è possibile usare i servizi di Azure WebApps di Azure che consentono di creare un'applicazione per ricevere trascrizioni tramite una connessione WebSocket. Seguire questa guida introduttiva.

Stabilire una chiamata

In questa guida introduttiva si presuppone che si abbia già familiarità con le chiamate iniziali. Per altre informazioni sull'avvio e la definizione delle chiamate, è possibile seguire la guida introduttiva. Ai fini di questa guida introduttiva, verrà eseguito il processo di avvio della trascrizione sia per le chiamate in ingresso che per quelle in uscita.

Quando si usa la trascrizione in tempo reale, sono disponibili due opzioni su quando e come avviare la trascrizione:

Opzione 1: A partire dal momento della risposta o della creazione di una chiamata

Opzione 2: Avvio della trascrizione durante una chiamata in corso

In questa esercitazione viene illustrata l'opzione 2, l'avvio della trascrizione durante una chiamata in corso. Per impostazione predefinita, "startTranscription" è impostato su false al momento della risposta o della creazione di una chiamata.

Creare una chiamata e fornire i dettagli della trascrizione

Definire le opzioni di trascrizione per ACS per sapere se avviare la trascrizione immediatamente o in un secondo momento, quali impostazioni locali trascrivere e la connessione Web socket da usare per l'invio della trascrizione.

var createCallOptions = new CreateCallOptions(callInvite, callbackUri)
{
    CallIntelligenceOptions = new CallIntelligenceOptions() { CognitiveServicesEndpoint = new Uri(cognitiveServiceEndpoint) },
    TranscriptionOptions = new TranscriptionOptions(new Uri(""), "en-US", false, TranscriptionTransport.Websocket)
};
CreateCallResult createCallResult = await callAutomationClient.CreateCallAsync(createCallOptions);

Avviare la trascrizione

Dopo aver avviato la trascrizione, è possibile effettuare una chiamata esplicita a Call Automation per avviare la trascrizione della chiamata.

// Start transcription with options
StartTranscriptionOptions options = new StartTranscriptionOptions()
{
    OperationContext = "startMediaStreamingContext",
    //Locale = "en-US",
};

await callMedia.StartTranscriptionAsync(options);

// Alternative: Start transcription without options
// await callMedia.StartTranscriptionAsync();

Ricezione del flusso di trascrizione

All'avvio della trascrizione, il WebSocket riceverà il payload dei metadati di trascrizione come primo pacchetto. Questo payload contiene i metadati delle chiamate e le impostazioni locali per la configurazione.

{
    "kind": "TranscriptionMetadata",
    "transcriptionMetadata": {
        "subscriptionId": "835be116-f750-48a4-a5a4-ab85e070e5b0",
        "locale": "en-us",
        "callConnectionId": "65c57654=f12c-4975-92a4-21668e61dd98",
        "correlationId": "65c57654=f12c-4975-92a4-21668e61dd98"
    }
}

Ricezione dei dati di trascrizione

Dopo i metadati, i pacchetti successivi ricevuti dal Web socket saranno TranscriptionData per l'audio trascritto.

{
    "kind": "TranscriptionData",
    "transcriptionData": {
        "text": "Testing transcription.",
        "format": "display",
        "confidence": 0.695223331451416,
        "offset": 2516998782481234400,
        "words": [
            {
                "text": "testing",
                "offset": 2516998782481234400
            },
            {
                "text": "testing",
                "offset": 2516998782481234400
            }
        ],
        "participantRawID": "8:acs:",
        "resultStatus": "Final"
    }
}

Gestione del flusso di trascrizione nel server Web socket

using WebServerApi;

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();
app.UseWebSockets();
app.Map("/ws", async context =>
{
    if (context.WebSockets.IsWebSocketRequest)
    {
        using var webSocket = await context.WebSockets.AcceptWebSocketAsync();
        await HandleWebSocket.Echo(webSocket);
    }
    else
    {
        context.Response.StatusCode = StatusCodes.Status400BadRequest;
    }
});

app.Run();

Aggiornamenti del codice per il gestore WebSocket

using Azure.Communication.CallAutomation;
using System.Net.WebSockets;
using System.Text;

namespace WebServerApi
{
    public class HandleWebSocket
    {
        public static async Task Echo(WebSocket webSocket)
        {
            var buffer = new byte[1024 * 4];
            var receiveResult = await webSocket.ReceiveAsync(
                new ArraySegment(buffer), CancellationToken.None);

            while (!receiveResult.CloseStatus.HasValue)
            {
                string msg = Encoding.UTF8.GetString(buffer, 0, receiveResult.Count);
                var response = StreamingDataParser.Parse(msg);

                if (response != null)
                {
                    if (response is AudioMetadata audioMetadata)
                    {
                        Console.WriteLine("***************************************************************************************");
                        Console.WriteLine("MEDIA SUBSCRIPTION ID-->"+audioMetadata.MediaSubscriptionId);
                        Console.WriteLine("ENCODING-->"+audioMetadata.Encoding);
                        Console.WriteLine("SAMPLE RATE-->"+audioMetadata.SampleRate);
                        Console.WriteLine("CHANNELS-->"+audioMetadata.Channels);
                        Console.WriteLine("LENGTH-->"+audioMetadata.Length);
                        Console.WriteLine("***************************************************************************************");
                    }
                    if (response is AudioData audioData)
                    {
                        Console.WriteLine("***************************************************************************************");
                        Console.WriteLine("DATA-->"+audioData.Data);
                        Console.WriteLine("TIMESTAMP-->"+audioData.Timestamp);
                        Console.WriteLine("IS SILENT-->"+audioData.IsSilent);
                        Console.WriteLine("***************************************************************************************");
                    }

                    if (response is TranscriptionMetadata transcriptionMetadata)
                    {
                        Console.WriteLine("***************************************************************************************");
                        Console.WriteLine("TRANSCRIPTION SUBSCRIPTION ID-->"+transcriptionMetadata.TranscriptionSubscriptionId);
                        Console.WriteLine("LOCALE-->"+transcriptionMetadata.Locale);
                        Console.WriteLine("CALL CONNECTION ID--?"+transcriptionMetadata.CallConnectionId);
                        Console.WriteLine("CORRELATION ID-->"+transcriptionMetadata.CorrelationId);
                        Console.WriteLine("***************************************************************************************");
                    }
                    if (response is TranscriptionData transcriptionData)
                    {
                        Console.WriteLine("***************************************************************************************");
                        Console.WriteLine("TEXT-->"+transcriptionData.Text);
                        Console.WriteLine("FORMAT-->"+transcriptionData.Format);
                        Console.WriteLine("OFFSET-->"+transcriptionData.Offset);
                        Console.WriteLine("DURATION-->"+transcriptionData.Duration);
                        Console.WriteLine("PARTICIPANT-->"+transcriptionData.Participant.RawId);
                        Console.WriteLine("CONFIDENCE-->"+transcriptionData.Confidence);

                        foreach (var word in transcriptionData.Words)
                        {
                            Console.WriteLine("TEXT-->"+word.Text);
                            Console.WriteLine("OFFSET-->"+word.Offset);
                            Console.WriteLine("DURATION-->"+word.Duration);
                        }
                        Console.WriteLine("***************************************************************************************");
                    }
                }

                await webSocket.SendAsync(
                    new ArraySegment(buffer, 0, receiveResult.Count),
                    receiveResult.MessageType,
                    receiveResult.EndOfMessage,
                    CancellationToken.None);

                receiveResult = await webSocket.ReceiveAsync(
                    new ArraySegment(buffer), CancellationToken.None);
            }

            await webSocket.CloseAsync(
                receiveResult.CloseStatus.Value,
                receiveResult.CloseStatusDescription,
                CancellationToken.None);
        }
    }
}

Aggiornare la trascrizione

Per le situazioni in cui l'applicazione consente agli utenti di selezionare la lingua preferita, è anche possibile acquisire la trascrizione in tale lingua. A tale scopo, Call Automation SDK consente di aggiornare le impostazioni locali di trascrizione.

await callMedia.UpdateTranscriptionAsync("en-US-NancyNeural");

Arrestare la trascrizione

Quando l'applicazione deve interrompere l'ascolto della trascrizione, è possibile usare la richiesta StopTranscription per informare l'automazione delle chiamate di interrompere l'invio di dati di trascrizione al Web socket.

StopTranscriptionOptions stopOptions = new StopTranscriptionOptions()
{
    OperationContext = "stopTranscription"
};

await callMedia.StopTranscriptionAsync(stopOptions);

Creare una chiamata e fornire i dettagli della trascrizione

Definire le opzioni di trascrizione per ACS per sapere se avviare la trascrizione immediatamente o in un secondo momento, quali impostazioni locali trascrivere e la connessione Web socket da usare per l'invio della trascrizione.

CallInvite callInvite = new CallInvite(target, caller); 

CallIntelligenceOptions callIntelligenceOptions = new CallIntelligenceOptions()
    .setCognitiveServicesEndpoint(appConfig.getCognitiveServiceEndpoint()); 

TranscriptionOptions transcriptionOptions = new TranscriptionOptions(
    appConfig.getWebSocketUrl(), 
    TranscriptionTransport.WEBSOCKET, 
    "en-US", 
    false
); 

CreateCallOptions createCallOptions = new CreateCallOptions(callInvite, appConfig.getCallBackUri());
createCallOptions.setCallIntelligenceOptions(callIntelligenceOptions); 
createCallOptions.setTranscriptionOptions(transcriptionOptions); 

Response result = client.createCallWithResponse(createCallOptions, Context.NONE); 
return result.getValue().getCallConnectionProperties().getCallConnectionId(); 

Avviare la trascrizione

Dopo aver avviato la trascrizione, è possibile effettuare una chiamata esplicita a Call Automation per avviare la trascrizione della chiamata.

//Option 1: Start transcription with options
StartTranscriptionOptions transcriptionOptions = new StartTranscriptionOptions()
    .setOperationContext("startMediaStreamingContext"); 

client.getCallConnection(callConnectionId)
    .getCallMedia()
    .startTranscriptionWithResponse(transcriptionOptions, Context.NONE); 

// Alternative: Start transcription without options
// client.getCallConnection(callConnectionId)
//     .getCallMedia()
//     .startTranscription();

Ricezione del flusso di trascrizione

All'avvio della trascrizione, il WebSocket riceverà il payload dei metadati di trascrizione come primo pacchetto. Questo payload contiene i metadati delle chiamate e le impostazioni locali per la configurazione.

{
    "kind": "TranscriptionMetadata",
    "transcriptionMetadata": {
        "subscriptionId": "835be116-f750-48a4-a5a4-ab85e070e5b0",
        "locale": "en-us",
        "callConnectionId": "65c57654=f12c-4975-92a4-21668e61dd98",
        "correlationId": "65c57654=f12c-4975-92a4-21668e61dd98"
    }
}

Ricezione dei dati di trascrizione

Dopo i metadati, i pacchetti successivi ricevuti dal Web socket saranno TranscriptionData per l'audio trascritto.

{
    "kind": "TranscriptionData",
    "transcriptionData": {
        "text": "Testing transcription.",
        "format": "display",
        "confidence": 0.695223331451416,
        "offset": 2516998782481234400,
        "words": [
            {
                "text": "testing",
                "offset": 2516998782481234400
            },
            {
                "text": "testing",
                "offset": 2516998782481234400
            }
        ],
        "participantRawID": "8:acs:",
        "resultStatus": "Final"
    }
}

Gestione del flusso di trascrizione nel server Web socket

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();
        }
    }
}

Aggiornamenti del codice per il gestore WebSocket

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;
import com.azure.communication.callautomation.models.streaming.transcription.TranscriptionData;
import com.azure.communication.callautomation.models.streaming.transcription.TranscriptionMetadata;
import com.azure.communication.callautomation.models.streaming.transcription.Word;

@ServerEndpoint("/server")
public class WebSocketServer {
    @OnMessage
    public void onMessage(String message, Session session) {
        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) {
            AudioData audioData = (AudioData) data;
            System.out.println("----------------------------------------------------------------");
            System.out.println("DATA: --> " + audioData.getData());
            System.out.println("TIMESTAMP: --> " + audioData.getTimestamp());
            System.out.println("IS SILENT: --> " + audioData.isSilent());
            System.out.println("----------------------------------------------------------------");
        }

        if (data instanceof TranscriptionMetadata) {
            TranscriptionMetadata transcriptionMetadata = (TranscriptionMetadata) data;
            System.out.println("----------------------------------------------------------------");
            System.out.println("TRANSCRIPTION SUBSCRIPTION ID: --> " + transcriptionMetadata.getTranscriptionSubscriptionId());
            System.out.println("IS SILENT: --> " + transcriptionMetadata.getLocale());
            System.out.println("CALL CONNECTION ID: --> " + transcriptionMetadata.getCallConnectionId());
            System.out.println("CORRELATION ID: --> " + transcriptionMetadata.getCorrelationId());
            System.out.println("----------------------------------------------------------------");
        }

        if (data instanceof TranscriptionData) {
            TranscriptionData transcriptionData = (TranscriptionData) data;
            System.out.println("----------------------------------------------------------------");
            System.out.println("TEXT: --> " + transcriptionData.getText());
            System.out.println("FORMAT: --> " + transcriptionData.getFormat());
            System.out.println("CONFIDENCE: --> " + transcriptionData.getConfidence());
            System.out.println("OFFSET: --> " + transcriptionData.getOffset());
            System.out.println("DURATION: --> " + transcriptionData.getDuration());
            System.out.println("RESULT STATUS: --> " + transcriptionData.getResultStatus());
            for (Word word : transcriptionData.getWords()) {
                System.out.println("Text: --> " + word.getText());
                System.out.println("Offset: --> " + word.getOffset());
                System.out.println("Duration: --> " + word.getDuration());
            }
            System.out.println("----------------------------------------------------------------");
        }
    }
}

Aggiornare la trascrizione

Per le situazioni in cui l'applicazione consente agli utenti di selezionare la lingua preferita, è anche possibile acquisire la trascrizione in tale lingua. A tale scopo, Call Automation SDK consente di aggiornare le impostazioni locali di trascrizione.

client.getCallConnection(callConnectionId)
    .getCallMedia()
    .updateTranscription("en-US-NancyNeural");

Arrestare la trascrizione

Quando l'applicazione deve interrompere l'ascolto della trascrizione, è possibile usare la richiesta StopTranscription per informare l'automazione delle chiamate di interrompere l'invio di dati di trascrizione al Web socket.

// Option 1: Stop transcription with options
StopTranscriptionOptions stopTranscriptionOptions = new StopTranscriptionOptions()
    .setOperationContext("stopTranscription");

client.getCallConnection(callConnectionId)
    .getCallMedia()
    .stopTranscriptionWithResponse(stopTranscriptionOptions, Context.NONE);

// Alternative: Stop transcription without options
// client.getCallConnection(callConnectionId)
//     .getCallMedia()
//     .stopTranscription();

Creare una chiamata e fornire i dettagli della trascrizione

Definire le opzioni di trascrizione per ACS per sapere se avviare la trascrizione immediatamente o in un secondo momento, quali impostazioni locali trascrivere e la connessione Web socket da usare per l'invio della trascrizione.

const transcriptionOptions = {
    transportUrl: "",
    transportType: "websocket",
    locale: "en-US",
    startTranscription: false
};

const options = {
    callIntelligenceOptions: {
        cognitiveServicesEndpoint: process.env.COGNITIVE_SERVICES_ENDPOINT
    },
    transcriptionOptions: transcriptionOptions
};

console.log("Placing outbound call...");
acsClient.createCall(callInvite, process.env.CALLBACK_URI + "/api/callbacks", options);

Avviare la trascrizione

Dopo aver avviato la trascrizione, è possibile effettuare una chiamata esplicita a Call Automation per avviare la trascrizione della chiamata.

const startTranscriptionOptions = {
    locale: "en-AU",
    operationContext: "startTranscriptionContext"
};

// Start transcription with options
await callMedia.startTranscription(startTranscriptionOptions);

// Alternative: Start transcription without options
// await callMedia.startTranscription();

Ricezione del flusso di trascrizione

All'avvio della trascrizione, il WebSocket riceverà il payload dei metadati di trascrizione come primo pacchetto. Questo payload contiene i metadati delle chiamate e le impostazioni locali per la configurazione.

{
    "kind": "TranscriptionMetadata",
    "transcriptionMetadata": {
        "subscriptionId": "835be116-f750-48a4-a5a4-ab85e070e5b0",
        "locale": "en-us",
        "callConnectionId": "65c57654=f12c-4975-92a4-21668e61dd98",
        "correlationId": "65c57654=f12c-4975-92a4-21668e61dd98"
    }
}

Ricezione dei dati di trascrizione

Dopo i metadati, i pacchetti successivi ricevuti dal Web socket saranno TranscriptionData per l'audio trascritto.

{
    "kind": "TranscriptionData",
    "transcriptionData": {
        "text": "Testing transcription.",
        "format": "display",
        "confidence": 0.695223331451416,
        "offset": 2516998782481234400,
        "words": [
            {
                "text": "testing",
                "offset": 2516998782481234400
            },
            {
                "text": "testing",
                "offset": 2516998782481234400
            }
        ],
        "participantRawID": "8:acs:",
        "resultStatus": "Final"
    }
}

Gestione del flusso di trascrizione nel server Web socket

import WebSocket from 'ws';
import { streamingData } from '@azure/communication-call-automation/src/util/streamingDataParser';

const wss = new WebSocket.Server({ port: 8081 });

wss.on('connection', (ws) => {
    console.log('Client connected');

    ws.on('message', (packetData) => {
        const decoder = new TextDecoder();
        const stringJson = decoder.decode(packetData);
        console.log("STRING JSON => " + stringJson);

        const 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((word) => {
                console.log(word.text);
                console.log(word.duration);
                console.log(word.offset);
            });
        }
    });

    ws.on('close', () => {
        console.log('Client disconnected');
    });
});

console.log('WebSocket server running on port 8081');

Aggiornare la trascrizione

Per le situazioni in cui l'applicazione consente agli utenti di selezionare la lingua preferita, è anche possibile acquisire la trascrizione in tale lingua. A tale scopo, Call Automation SDK consente di aggiornare le impostazioni locali di trascrizione.

await callMedia.updateTranscription("en-US-NancyNeural");

Arrestare la trascrizione

Quando l'applicazione deve interrompere l'ascolto della trascrizione, è possibile usare la richiesta StopTranscription per informare l'automazione delle chiamate di interrompere l'invio di dati di trascrizione al Web socket.

const stopTranscriptionOptions = {
    operationContext: "stopTranscriptionContext"
};

// Stop transcription with options
await callMedia.stopTranscription(stopTranscriptionOptions);

// Alternative: Stop transcription without options
// await callMedia.stopTranscription();

Creare una chiamata e fornire i dettagli della trascrizione

Definire le opzioni di trascrizione per ACS per sapere se avviare la trascrizione immediatamente o in un secondo momento, quali impostazioni locali trascrivere e la connessione Web socket da usare per l'invio della trascrizione.

transcription_options = TranscriptionOptions(
    transport_url=" ",
    transport_type=TranscriptionTransportType.WEBSOCKET,
    locale="en-US",
    start_transcription=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,
    transcription=transcription_options
)

Avviare la trascrizione

Dopo aver avviato la trascrizione, è possibile effettuare una chiamata esplicita a Call Automation per avviare la trascrizione della chiamata.

# Start transcription without options
call_connection_client.start_transcription()

# Option 1: Start transcription with locale and operation context
# call_connection_client.start_transcription(locale="en-AU", operation_context="startTranscriptionContext")

# Option 2: Start transcription with operation context
# call_connection_client.start_transcription(operation_context="startTranscriptionContext")

Ricezione del flusso di trascrizione

All'avvio della trascrizione, il WebSocket riceverà il payload dei metadati di trascrizione come primo pacchetto. Questo payload contiene i metadati delle chiamate e le impostazioni locali per la configurazione.

{
    "kind": "TranscriptionMetadata",
    "transcriptionMetadata": {
        "subscriptionId": "835be116-f750-48a4-a5a4-ab85e070e5b0",
        "locale": "en-us",
        "callConnectionId": "65c57654=f12c-4975-92a4-21668e61dd98",
        "correlationId": "65c57654=f12c-4975-92a4-21668e61dd98"
    }
}

Ricezione dei dati di trascrizione

Dopo i metadati, i pacchetti successivi ricevuti dal Web socket saranno TranscriptionData per l'audio trascritto.

{
    "kind": "TranscriptionData",
    "transcriptionData": {
        "text": "Testing transcription.",
        "format": "display",
        "confidence": 0.695223331451416,
        "offset": 2516998782481234400,
        "words": [
            {
                "text": "testing",
                "offset": 2516998782481234400
            },
            {
                "text": "testing",
                "offset": 2516998782481234400
            }
        ],
        "participantRawID": "8:acs:",
        "resultStatus": "Final"
    }
}

Gestione del flusso di trascrizione nel server Web socket

import asyncio
import json
import websockets
from azure.communication.callautomation._shared.models import identifier_from_raw_id

async def handle_client(websocket, path):
    print("Client connected")
    try:
        async for message in websocket:
            json_object = json.loads(message)
            kind = json_object['kind']
            if kind == 'TranscriptionMetadata':
                print("Transcription metadata")
                print("-------------------------")
                print("Subscription ID:", json_object['transcriptionMetadata']['subscriptionId'])
                print("Locale:", json_object['transcriptionMetadata']['locale'])
                print("Call Connection ID:", json_object['transcriptionMetadata']['callConnectionId'])
                print("Correlation ID:", json_object['transcriptionMetadata']['correlationId'])
            if kind == 'TranscriptionData':
                participant = identifier_from_raw_id(json_object['transcriptionData']['participantRawID'])
                word_data_list = json_object['transcriptionData']['words']
                print("Transcription data")
                print("-------------------------")
                print("Text:", json_object['transcriptionData']['text'])
                print("Format:", json_object['transcriptionData']['format'])
                print("Confidence:", json_object['transcriptionData']['confidence'])
                print("Offset:", json_object['transcriptionData']['offset'])
                print("Duration:", json_object['transcriptionData']['duration'])
                print("Participant:", participant.raw_id)
                print("Result Status:", json_object['transcriptionData']['resultStatus'])
                for word in word_data_list:
                    print("Word:", word['text'])
                    print("Offset:", word['offset'])
                    print("Duration:", word['duration'])
            
    except websockets.exceptions.ConnectionClosedOK:
        print("Client disconnected")
    except websockets.exceptions.ConnectionClosedError as e:
        print("Connection closed with error: %s", e)
    except Exception as e:
        print("Unexpected error: %s", e)

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()

Aggiornare la trascrizione

Per le situazioni in cui l'applicazione consente agli utenti di selezionare la lingua preferita, è anche possibile acquisire la trascrizione in tale lingua. A tale scopo, Call Automation SDK consente di aggiornare le impostazioni locali di trascrizione.

await call_connection_client.update_transcription(locale="en-US-NancyNeural")

Arrestare la trascrizione

Quando l'applicazione deve interrompere l'ascolto della trascrizione, è possibile usare la richiesta StopTranscription per informare l'automazione delle chiamate di interrompere l'invio di dati di trascrizione al Web socket.

# Stop transcription without options
call_connection_client.stop_transcription()

# Alternative: Stop transcription with operation context
# call_connection_client.stop_transcription(operation_context="stopTranscriptionContext")

Codici evento

Event codice sottocodice Message
TranscriptionStarted 200 0 Azione completata correttamente.
TranscriptionStopped 200 0 Azione completata correttamente.
TranscriptionUpdated 200 0 Azione completata correttamente.
TranscriptionFailed 400 8581 Azione non riuscita. StreamUrl non valido.
TrasncriptionFailed 400 8565 Azione non riuscita a causa di una richiesta non valida a Servizi cognitivi. Controllare i parametri di input.
TranscriptionFailed 400 8565 Azione non riuscita a causa del timeout di una richiesta a Servizi cognitivi. Riprovare più tardi o verificare la presenza di eventuali problemi con il servizio.
TranscriptionFailed 400 8605 Il modello di riconoscimento vocale personalizzato per la trascrizione non è supportato.
TranscriptionFailed 400 8523 Richiesta non valida. Impostazioni locali mancanti.
TranscriptionFailed 400 8523 Richiesta non valida. Sono supportate solo le impostazioni locali che contengono informazioni sull'area.
TranscriptionFailed 405 8520 La funzionalità di trascrizione non è attualmente supportata.
TranscriptionFailed 405 8520 UpdateTranscription non è supportato per la connessione creata con l'interfaccia Connect.
TranscriptionFailed 400 8528 Azione non valida, chiamata già terminata.
TranscriptionFailed 405 8520 L'aggiornamento della funzionalità di trascrizione non è attualmente supportato.
TranscriptionFailed 405 8522 Richiesta non consentita quando l'URL di trascrizione non è impostato durante l'installazione della chiamata.
TranscriptionFailed 405 8522 Richiesta non consentita quando la configurazione del servizio cognitivo non è impostata durante l'installazione delle chiamate.
TranscriptionFailed 400 8501 L'azione non è valida quando la chiamata non è in stato Stabilito.
TranscriptionFailed 401 8565 Azione non riuscita a causa di un errore di autenticazione di Servizi cognitivi. Controllare l'input di autorizzazione e verificare che sia corretto.
TranscriptionFailed 403 8565 Azione non riuscita a causa di una richiesta non consentita a Servizi cognitivi. Controllare lo stato della sottoscrizione e assicurarsi che sia attivo.
TranscriptionFailed 429 8565 Azione non riuscita, le richieste hanno superato il numero di richieste simultanee consentite per la sottoscrizione dei servizi cognitivi.
TranscriptionFailed 500 8578 Azione non riuscita. Non è possibile stabilire la connessione WebSocket.
TranscriptionFailed 500 8580 Azione non riuscita. Il servizio di trascrizione è stato arrestato.
TranscriptionFailed 500 8579 Azione non riuscita. La trascrizione è stata annullata.
TranscriptionFailed 500 9999 Errore interno sconosciuto del server.

Problemi noti

  • Per le chiamate 1:1 con utenti ACS che usano gli SDK client startTranscription = True non è attualmente supportato.