Lägga till transkription i realtid i ditt program

Viktigt!

Funktioner som beskrivs i den här artikeln är för närvarande i offentlig förhandsversion. Den här förhandsversionen tillhandahålls utan ett serviceavtal och vi rekommenderar det inte för produktionsarbetsbelastningar. Vissa funktioner kanske inte stöds eller kan vara begränsade. Mer information finns i Kompletterande villkor för användning av Microsoft Azure-förhandsversioner.

Den här guiden hjälper dig att bättre förstå de olika sätt som du kan använda Azure Communication Services-erbjudanden för transkription i realtid via Call Automation SDK:er.

Förutsättningar

Konfigurera en WebSocket Server

Azure Communication Services kräver att serverprogrammet konfigurerar en WebSocket-server för att strömma transkription i realtid. WebSocket är ett standardiserat protokoll som tillhandahåller en kommunikationskanal med full duplex över en enda TCP-anslutning. Du kan också använda Azure-tjänster Azure WebApps som gör att du kan skapa ett program för att ta emot avskrifter via en websocket-anslutning. Följ den här snabbstarten.

Upprätta ett anrop

I den här snabbstarten antar vi att du redan är bekant med att starta anrop. Om du behöver lära dig mer om att starta och upprätta anrop kan du följa vår snabbstart. I den här snabbstarten går vi igenom processen med att starta transkription för både inkommande samtal och utgående samtal.

När du arbetar med transkription i realtid har du ett par alternativ för när och hur du startar transkription:

Alternativ 1 – Startar vid tidpunkten för att besvara eller skapa ett samtal

Alternativ 2 – Påbörja transkription under ett pågående samtal

I den här självstudien demonstrerar vi alternativ 2 och påbörjar transkription under ett pågående anrop. Som standard är "startTranscription" inställt på false vid tidpunkten för att besvara eller skapa ett anrop.

Skapa ett anrop och ange transkriptionsinformationen

Definiera TranscriptionOptions för ACS för att veta om du vill starta transkriptionen direkt eller vid ett senare tillfälle, vilket språk som ska transkriberas i och webbanslutningen som ska användas för att skicka avskriften.

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

Starta transkription

När du är redo att starta transkriptionen kan du göra ett explicit anrop till Call Automation för att börja transkribera samtalet.

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

Ta emot transkriptionsström

När transkriptionen startar får din websocket transkriptionsmetadatanyttolasten som det första paketet. Den här nyttolasten innehåller anropsmetadata och nationella inställningar för konfigurationen.

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

Ta emot transkriptionsdata

Efter metadata kommer nästa paket som din webbsocket tar emot att vara TranscriptionData för det transkriberade ljudet.

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

Hantera transkriptionsström på webbsocketservern

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

Uppdateringar av koden för websocket-hanteraren

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

Uppdatera transkription

I situationer där ditt program gör det möjligt för användare att välja önskat språk kanske du också vill samla in transkriptionen på det språket. Det gör du genom att anropa Automation SDK så att du kan uppdatera transkriptionsspråket.

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

Stoppa transkription

När programmet måste sluta lyssna efter transkriptionen kan du använda StopTranscription-begäran för att meddela Call Automation om att sluta skicka avskriftsdata till din webbsocket.

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

await callMedia.StopTranscriptionAsync(stopOptions);

Skapa ett anrop och ange transkriptionsinformationen

Definiera TranscriptionOptions för ACS för att veta om du vill starta transkriptionen direkt eller vid ett senare tillfälle, vilket språk som ska transkriberas i och webbanslutningen som ska användas för att skicka avskriften.

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

Starta transkription

När du är redo att starta transkriptionen kan du göra ett explicit anrop till Call Automation för att börja transkribera samtalet.

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

Ta emot transkriptionsström

När transkriptionen startar får din websocket transkriptionsmetadatanyttolasten som det första paketet. Den här nyttolasten innehåller anropsmetadata och nationella inställningar för konfigurationen.

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

Ta emot transkriptionsdata

Efter metadata kommer nästa paket som din webbsocket tar emot att vara TranscriptionData för det transkriberade ljudet.

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

Hantera transkriptionsström på webbsocketservern

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

Uppdateringar av koden för websocket-hanteraren

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

Uppdatera transkription

I situationer där ditt program gör det möjligt för användare att välja önskat språk kanske du också vill samla in transkriptionen på det språket. Det gör du genom att anropa Automation SDK så att du kan uppdatera transkriptionsspråket.

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

Stoppa transkription

När programmet måste sluta lyssna efter transkriptionen kan du använda StopTranscription-begäran för att meddela Call Automation om att sluta skicka avskriftsdata till din webbsocket.

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

Skapa ett anrop och ange transkriptionsinformationen

Definiera TranscriptionOptions för ACS för att veta om transkriptionen ska startas direkt eller vid ett senare tillfälle, vilket språk du ska transkribera i och den webbanslutning som ska användas för att skicka avskriften.

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

Starta transkription

När du är redo att starta transkriptionen kan du göra ett explicit anrop till Samtalsautomation för att börja transkribera samtalet.

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

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

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

Ta emot transkriptionsström

När transkriptionen startar får din websocket transkriptionsmetadatanyttolasten som det första paketet. Den här nyttolasten innehåller anropsmetadata och nationella inställningar för konfigurationen.

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

Ta emot transkriptionsdata

Efter metadata kommer nästa paket som din webbsocket tar emot att vara TranscriptionData för det transkriberade ljudet.

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

Hantera transkriptionsström på webbsocketservern

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

Uppdatera transkription

I situationer där ditt program gör det möjligt för användare att välja önskat språk kanske du också vill samla in transkriptionen på det språket. Det gör du genom att anropa Automation SDK så att du kan uppdatera transkriptionsspråket.

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

Stoppa transkription

När programmet måste sluta lyssna efter transkriptionen kan du använda StopTranscription-begäran för att meddela Call Automation om att sluta skicka avskriftsdata till din webbsocket.

const stopTranscriptionOptions = {
    operationContext: "stopTranscriptionContext"
};

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

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

Skapa ett anrop och ange transkriptionsinformationen

Definiera TranscriptionOptions för ACS för att veta om transkriptionen ska startas direkt eller vid ett senare tillfälle, vilket språk du ska transkribera i och den webbanslutning som ska användas för att skicka avskriften.

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
)

Starta transkription

När du är redo att starta transkriptionen kan du göra ett explicit anrop till Samtalsautomation för att börja transkribera samtalet.

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

Ta emot transkriptionsström

När transkriptionen startar får din websocket transkriptionsmetadatanyttolasten som det första paketet. Den här nyttolasten innehåller anropsmetadata och nationella inställningar för konfigurationen.

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

Ta emot transkriptionsdata

Efter metadata kommer nästa paket som din websocket tar emot att vara TranscriptionData för det transkriberade ljudet.

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

Hantera transkriptionsström på webbsocketservern

import asyncio
import json
import websockets

from azure.communication.callautomation.streaming.models import (
    TranscriptionMetadata, TranscriptionData, WordData, TextFormat, ResultStatus
)
from azure.communication.callautomation.streaming.streaming_data_parser import StreamingDataParser

async def handle_client(websocket, path):
    print("Client connected")
    try:
        async for message in websocket:
            print(message)
            result = StreamingDataParser.parse(message)
            
            if isinstance(result, TranscriptionMetadata):
                print("Parsed data is metadata")
                print("-------------------------")
                print("Subscription ID:", result.subscriptionId)
                print("Locale:", result.locale)
                print("Call Connection ID:", result.callConnectionId)
                print("Correlation ID:", result.correlationId)
            
            elif isinstance(result, TranscriptionData):
                print("Parsed data is transcription data")
                print("-------------------------")
                print("Text:", result.text)
                print("Format:", result.format)
                print("Confidence:", result.confidence)
                print("Offset:", result.offset)
                print("Duration:", result.duration)
                print("Participant:", result.participant.raw_id)
                print("Result Status:", result.resultStatus)
                for word in result.words:
                    print("Word:", word.text)
                    print("Offset:", word.offset)
                    print("Duration:", word.duration)

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

Uppdatera transkription

I situationer där ditt program gör det möjligt för användare att välja önskat språk kanske du också vill samla in transkriptionen på det språket. Det gör du genom att anropa Automation SDK så att du kan uppdatera transkriptionsspråket.

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

Stoppa transkription

När programmet måste sluta lyssna efter transkriptionen kan du använda StopTranscription-begäran för att meddela Call Automation om att sluta skicka avskriftsdata till din webbsocket.

# Stop transcription without options
call_connection_client.stop_transcription()

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

Händelsekoder

Event kod underkod Meddelande
TranskriptionStartad 200 0 Åtgärden har slutförts.
Transkriptioner toppade 200 0 Åtgärden har slutförts.
TranscriptionUpdated 200 0 Åtgärden har slutförts.
TranscriptionFailed 400 8581 Åtgärden misslyckades, StreamUrl är inte giltig.
TrasncriptionFailed 400 8565 Åtgärden misslyckades på grund av en felaktig begäran till Cognitive Services. Kontrollera dina indataparametrar.
TranscriptionFailed 400 8565 Åtgärden misslyckades på grund av en begäran om tidsgräns för Cognitive Services. Försök igen senare eller kontrollera om det finns några problem med tjänsten.
TranscriptionFailed 400 8605 Anpassad taligenkänningsmodell för transkription stöds inte.
TranscriptionFailed 400 8523 Ogiltig begäran, nationella inställningar saknas.
TranscriptionFailed 400 8523 Ogiltig begäran, endast nationella inställningar som innehåller regioninformation stöds.
TranscriptionFailed 405 8520 Transkriptionsfunktioner stöds inte just nu.
TranscriptionFailed 405 8520 UpdateTranscription stöds inte för anslutning som skapats med Connect-gränssnittet.
TranscriptionFailed 400 8528 Åtgärden är ogiltig, samtalet har redan avslutats.
TranscriptionFailed 405 8520 Funktionen för uppdateringsavskrift stöds inte just nu.
TranscriptionFailed 405 8522 Begäran tillåts inte när transkriptions-URL:en inte har angetts under anropskonfigurationen.
TranscriptionFailed 405 8522 Begäran tillåts inte när Cognitive Service Configuration inte har angetts under anropskonfigurationen.
TranscriptionFailed 400 8501 Åtgärden är ogiltig när anropet inte är i etablerat tillstånd.
TranscriptionFailed 401 8565 Åtgärden misslyckades på grund av ett Cognitive Services-autentiseringsfel. Kontrollera dina auktoriseringsindata och se till att de är korrekta.
TranscriptionFailed 403 8565 Åtgärden misslyckades på grund av en förbjuden begäran till Cognitive Services. Kontrollera din prenumerationsstatus och se till att den är aktiv.
TranscriptionFailed 429 8565 Åtgärden misslyckades, begäranden överskred antalet tillåtna samtidiga begäranden för cognitive services-prenumerationen.
TranscriptionFailed 500 8578 Åtgärden misslyckades, det gick inte att upprätta WebSocket-anslutningen.
TranscriptionFailed 500 8580 Åtgärden misslyckades, transkriptionstjänsten stängdes av.
TranscriptionFailed 500 8579 Åtgärden misslyckades, transkriptionen avbröts.
TranscriptionFailed 500 9999 Okänt internt serverfel.

Kända problem

  • För 1:1-anrop med ACS-användare som använder Klient-SDK:er stöds startTranscription = True för närvarande inte.