Partager via


Ajouter une transcription en temps réel à votre application

Important

Les fonctionnalités décrites dans cet article sont actuellement en préversion publique. Cette préversion est fournie sans contrat de niveau de service et n’est pas recommandée pour les charges de travail de production. Certaines fonctionnalités peuvent être limitées ou non prises en charge. Pour plus d’informations, consultez Conditions d’Utilisation Supplémentaires relatives aux Évaluations Microsoft Azure.

Ce guide vous aide à mieux comprendre les différentes façons d’utiliser l’offre Azure Communication Services de transcription en temps réel via les SDK Call Automation.

Prérequis

Configurer un serveur WebSocket

Azure Communication Services nécessite que votre application serveur configure un serveur WebSocket pour diffuser la transcription en temps réel. WebSocket est un protocole normalisé qui fournit un canal de communication en duplex intégral sur une seule connexion TCP. Vous pouvez éventuellement utiliser les services Azure WebApps qui vous permettent de créer une application pour recevoir des transcriptions sur une connexion WebSocket. Suivez ce guide de démarrage rapide.

Établir un appel

Dans ce guide de démarrage rapide, nous partons du principe que vous savez déjà démarrer des appels. Si vous avez besoin d’en savoir plus sur le démarrage et l’établissement d’appels, vous pouvez suivre notre guide de démarrage rapide. Pour les besoins de ce guide de démarrage rapide, nous allons suivre le processus de démarrage de la transcription pour les appels à la fois entrants et sortants.

Lorsque vous utilisez la transcription en temps réel, vous avez deux options sur le moment et la façon de démarrer la transcription :

Option 1 : démarrage au moment de la prise d’appel ou de la création d’un appel

Option 2 : démarrage de la transcription pendant un appel en cours

Dans ce tutoriel, nous montrons l’option 2, qui démarre la transcription pendant un appel en cours. Par défaut, le paramètre startTranscription est défini sur false au moment de la prise d’appel ou de la création d’un appel.

Créer un appel et fournir les détails de la transcription

Définissez le paramètre TranscriptionOptions pour informer ACS de démarrer la transcription immédiatement ou ultérieurement, des paramètres régionaux cibles de transcription et de la connexion de socket web à utiliser pour envoyer la transcription.

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

Démarrer la transcription

Une fois que vous êtes prêt à démarrer la transcription, vous pouvez effectuer un appel explicite à Call Automation pour démarrer la transcription de l’appel.

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

Réception du flux de transcription

Au démarrage de la transcription, votre serveur WebSocket reçoit la charge utile des métadonnées de transcription en tant que premier paquet. Cette charge utile contient les métadonnées d’appel et les paramètres régionaux pour la configuration.

{
    "kind": "TranscriptionMetadata",
    "transcriptionMetadata": {
        "subscriptionId": "aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e",
        "locale": "en-us",
        "callConnectionId": "65c57654=f12c-4975-92a4-21668e61dd98",
        "correlationId": "65c57654=f12c-4975-92a4-21668e61dd98"
    }
}

Réception des données de transcription

Après les métadonnées, les paquets suivants reçus par votre socket web contiennent TranscriptionData pour l’audio transcrit.

{
    "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"
    }
}

Gestion du flux de transcription dans le serveur de socket web

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

Mises à jour de votre code pour le gestionnaire 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);
        }
    }
}

Mettre à jour une transcription

Dans les cas où votre application permet aux utilisateurs de sélectionner leur langue préférée, vous pouvez également capturer la transcription dans cette langue. Pour ce faire, le SDK Call Automation vous permet de mettre à jour les paramètres régionaux de transcription.

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

Arrêter la transcription

Lorsque votre application doit cesser d’écouter la transcription, vous pouvez utiliser la demande StopTranscription pour informer Call Automation d’arrêter l’envoi de données de transcription à votre socket web.

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

await callMedia.StopTranscriptionAsync(stopOptions);

Créer un appel et fournir les détails de la transcription

Définissez le paramètre TranscriptionOptions pour informer ACS de démarrer la transcription immédiatement ou ultérieurement, des paramètres régionaux cibles de transcription et de la connexion de socket web à utiliser pour envoyer la transcription.

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

Démarrer la transcription

Une fois que vous êtes prêt à démarrer la transcription, vous pouvez effectuer un appel explicite à Call Automation pour démarrer la transcription de l’appel.

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

Réception du flux de transcription

Au démarrage de la transcription, votre serveur WebSocket reçoit la charge utile des métadonnées de transcription en tant que premier paquet. Cette charge utile contient les métadonnées d’appel et les paramètres régionaux pour la configuration.

{
    "kind": "TranscriptionMetadata",
    "transcriptionMetadata": {
        "subscriptionId": "aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e",
        "locale": "en-us",
        "callConnectionId": "65c57654=f12c-4975-92a4-21668e61dd98",
        "correlationId": "65c57654=f12c-4975-92a4-21668e61dd98"
    }
}

Réception des données de transcription

Après les métadonnées, les paquets suivants reçus par votre socket web contiennent TranscriptionData pour l’audio transcrit.

{
    "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"
    }
}

Gestion du flux de transcription dans le serveur de socket web

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

Mises à jour de votre code pour le gestionnaire 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("----------------------------------------------------------------");
        }
    }
}

Mettre à jour une transcription

Dans les cas où votre application permet aux utilisateurs de sélectionner leur langue préférée, vous pouvez également capturer la transcription dans cette langue. Pour ce faire, le SDK Call Automation vous permet de mettre à jour les paramètres régionaux de transcription.

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

Arrêter la transcription

Lorsque votre application doit cesser d’écouter la transcription, vous pouvez utiliser la demande StopTranscription pour informer Call Automation d’arrêter l’envoi de données de transcription à votre socket web.

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

Créer un appel et fournir les détails de la transcription

Définissez le paramètre TranscriptionOptions pour informer ACS de démarrer la transcription immédiatement ou ultérieurement, des paramètres régionaux cibles de transcription et de la connexion de socket web à utiliser pour envoyer la transcription.

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

Démarrer la transcription

Une fois que vous êtes prêt à démarrer la transcription, vous pouvez effectuer un appel explicite à Call Automation pour démarrer la transcription de l’appel.

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

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

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

Réception du flux de transcription

Au démarrage de la transcription, votre serveur WebSocket reçoit la charge utile des métadonnées de transcription en tant que premier paquet. Cette charge utile contient les métadonnées d’appel et les paramètres régionaux pour la configuration.

{
    "kind": "TranscriptionMetadata",
    "transcriptionMetadata": {
        "subscriptionId": "aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e",
        "locale": "en-us",
        "callConnectionId": "65c57654=f12c-4975-92a4-21668e61dd98",
        "correlationId": "65c57654=f12c-4975-92a4-21668e61dd98"
    }
}

Réception des données de transcription

Après les métadonnées, les paquets suivants reçus par votre socket web contiennent TranscriptionData pour l’audio transcrit.

{
    "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"
    }
}

Gestion du flux de transcription dans le serveur de socket web

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');

Mettre à jour une transcription

Dans les cas où votre application permet aux utilisateurs de sélectionner leur langue préférée, vous pouvez également capturer la transcription dans cette langue. Pour ce faire, le SDK Call Automation vous permet de mettre à jour les paramètres régionaux de transcription.

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

Arrêter la transcription

Lorsque votre application doit cesser d’écouter la transcription, vous pouvez utiliser la demande StopTranscription pour informer Call Automation d’arrêter l’envoi de données de transcription à votre socket web.

const stopTranscriptionOptions = {
    operationContext: "stopTranscriptionContext"
};

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

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

Créer un appel et fournir les détails de la transcription

Définissez le paramètre TranscriptionOptions pour informer ACS de démarrer la transcription immédiatement ou ultérieurement, des paramètres régionaux cibles de transcription et de la connexion de socket web à utiliser pour envoyer la transcription.

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
)

Démarrer la transcription

Une fois que vous êtes prêt à démarrer la transcription, vous pouvez effectuer un appel explicite à Call Automation pour démarrer la transcription de l’appel.

# 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")

Réception du flux de transcription

Au démarrage de la transcription, votre serveur WebSocket reçoit la charge utile des métadonnées de transcription en tant que premier paquet. Cette charge utile contient les métadonnées d’appel et les paramètres régionaux pour la configuration.

{
    "kind": "TranscriptionMetadata",
    "transcriptionMetadata": {
        "subscriptionId": "aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e",
        "locale": "en-us",
        "callConnectionId": "65c57654=f12c-4975-92a4-21668e61dd98",
        "correlationId": "65c57654=f12c-4975-92a4-21668e61dd98"
    }
}

Réception des données de transcription

Après les métadonnées, les paquets suivants reçus par votre serveur WebSocket contiennent TranscriptionData pour l’audio transcrit.

{
    "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"
    }
}

Gestion du flux de transcription dans le serveur de socket web

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

Mettre à jour une transcription

Dans les cas où votre application permet aux utilisateurs de sélectionner leur langue préférée, vous pouvez également capturer la transcription dans cette langue. Pour ce faire, le SDK Call Automation vous permet de mettre à jour les paramètres régionaux de transcription.

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

Arrêter la transcription

Lorsque votre application doit cesser d’écouter la transcription, vous pouvez utiliser la demande StopTranscription pour informer Call Automation d’arrêter l’envoi de données de transcription à votre socket web.

# Stop transcription without options
call_connection_client.stop_transcription()

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

Codes d’événement

Événement code subcode Message
TranscriptionStarted 200 0 Action réalisée avec succès.
TranscriptionStopped 200 0 Action réalisée avec succès.
TranscriptionUpdated 200 0 Action réalisée avec succès.
TranscriptionFailed 400 8581 Échec de l’action, StreamUrl n’est pas valide.
TrasncriptionFailed 400 8565 L’action a échoué en raison d’une demande incorrecte adressée à Cognitive Services. Vérifiez vos paramètres d’entrée.
TranscriptionFailed 400 8565 L’action a échoué en raison de l’expiration d’une demande adressée à Cognitive Services. Réessayez ultérieurement ou recherchez les problèmes liés au service.
TranscriptionFailed 400 8605 Le modèle de reconnaissance vocale personnalisée pour la transcription n’est pas pris en charge.
TranscriptionFailed 400 8523 Demande non valide, les paramètres régionaux sont manquants.
TranscriptionFailed 400 8523 Demande non valide, seuls les paramètres régionaux qui contiennent des informations de région sont pris en charge.
TranscriptionFailed 405 8520 La fonctionnalité de transcription n’est pas prise en charge pour l’instant.
TranscriptionFailed 405 8520 UpdateTranscription n’est pas pris en charge pour la connexion créée avec l’interface Connect.
TranscriptionFailed 400 8528 L’action n’est pas valide, l’appel est déjà terminé.
TranscriptionFailed 405 8520 La fonctionnalité de mise à jour de la transcription n’est pas prise en charge pour l’instant.
TranscriptionFailed 405 8522 Demande non autorisée lorsque l’URL de transcription n’est pas définie lors de la configuration de l’appel.
TranscriptionFailed 405 8522 Demande non autorisée lorsque la configuration de Cognitive Service n’est pas définie lors de la configuration de l’appel.
TranscriptionFailed 400 8501 L’action n’est pas valide lorsque l’appel n’est pas dans l’état Établi.
TranscriptionFailed 401 8565 L’action a échoué en raison d’une erreur d’authentification à Cognitive Services. Vérifiez votre entrée d’autorisation et vérifiez qu’elle est correcte.
TranscriptionFailed 403 8565 L’action a échoué en raison d’une demande interdite à Cognitive Services. Vérifiez l’état de votre abonnement et vérifiez qu’il est actif.
TranscriptionFailed 429 8565 L’action a échoué, le nombre de demandes a dépassé le nombre de demandes simultanées autorisées pour l’abonnement Cognitive Services.
TranscriptionFailed 500 8578 L’action a échoué, impossible d’établir la connexion WebSocket.
TranscriptionFailed 500 8580 L’action a échoué, le service de transcription a été arrêté.
TranscriptionFailed 500 8579 L’action a échoué, la transcription a été annulée.
TranscriptionFailed 500 9999 Erreur interne du serveur inconnue.

Problèmes connus

  • Pour les appels 1:1 avec les utilisateurs ACS utilisant les SDK client, startTranscription = True n’est actuellement pas pris en charge.