Sdílet prostřednictvím


Přidání přepisu v reálném čase do aplikace

Důležité

Funkce popsané v tomto článku jsou aktuálně ve verzi Public Preview. Tato verze Preview je poskytována bez smlouvy o úrovni služeb a nedoporučujeme ji pro produkční úlohy. Některé funkce se nemusí podporovat nebo mohou mít omezené možnosti. Další informace najdete v dodatečných podmínkách použití pro verze Preview v Microsoft Azure.

Tato příručka vám pomůže lépe porozumět různým způsobům použití nabídky přepisu služeb Azure Communication Services v reálném čase prostřednictvím sad SDK pro automatizaci volání.

Požadavky

Nastavení serveru WebSocket

Služba Azure Communication Services vyžaduje, aby serverová aplikace nastavila server WebSocket pro streamování přepisu v reálném čase. WebSocket je standardizovaný protokol, který poskytuje plně duplexní komunikační kanál přes jedno připojení TCP. Volitelně můžete použít služby Azure WebApps, které umožňují vytvořit aplikaci pro příjem přepisů přes připojení websocket. Postupujte podle tohoto rychlého startu.

Vytvoření hovoru

V tomto rychlém startu předpokládáme, že už znáte spouštění volání. Pokud potřebujete získat další informace o zahájení a navazování volání, můžete postupovat podle našeho rychlého startu. Pro účely tohoto rychlého startu procházíme procesem spuštění přepisu příchozích i odchozích hovorů.

Při práci s přepisem v reálném čase máte několik možností, kdy a jak začít přepis:

Možnost 1 – Zahájení odpovědi nebo vytvoření hovoru

Možnost 2 – Zahájení přepisu během probíhajícího hovoru

V tomto kurzu předvádíme možnost 2 a spouštíme přepis během probíhajícího hovoru. Ve výchozím nastavení je startTranscription nastaven na false v době, kdy odpovídáte nebo vytváříte volání.

Vytvoření hovoru a zadání podrobností přepisu

Definujte PřepisOptions pro službu ACS, abyste věděli, jestli se má přepis spustit hned nebo později, což národní prostředí, které se má přepisovat, a připojení k webovému soketu, které se má použít k odeslání přepisu.

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

Zahájit přepis

Jakmile budete připraveni zahájit přepis, můžete provést explicitní volání služby Call Automation a zahájit přepis volání.

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

Příjem streamu přepisu

Když se spustí přepis, váš websocket obdrží datovou část metadat přepisu jako první paket. Tato datová část nese metadata volání a národní prostředí pro konfiguraci.

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

Příjem dat přepisu

Po metadatech, které další pakety váš webový soket obdrží, budou PřepisData pro přepisovaný zvuk.

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

Zpracování streamu přepisu na serveru webového soketu

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

Aktualizace kódu pro obslužnou rutinu 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);
        }
    }
}

Aktualizace přepisu

V situacích, kdy vaše aplikace umožňuje uživatelům vybrat preferovaný jazyk, můžete také chtít zachytit přepis v daném jazyce. K tomu vám sada SDK pro automatizaci volání umožňuje aktualizovat národní prostředí přepisu.

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

Zastavit přepis

Když vaše aplikace potřebuje zastavit naslouchání přepisu, můžete pomocí požadavku StopTranscription dát službě Call Automation vědět, že chcete zastavit odesílání dat přepisu do webového soketu.

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

await callMedia.StopTranscriptionAsync(stopOptions);

Vytvoření hovoru a zadání podrobností přepisu

Definujte PřepisOptions pro službu ACS, abyste věděli, jestli se má přepis spustit hned nebo později, což národní prostředí, které se má přepisovat, a připojení k webovému soketu, které se má použít k odeslání přepisu.

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

Zahájit přepis

Jakmile budete připraveni zahájit přepis, můžete provést explicitní volání služby Call Automation a zahájit přepis volání.

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

Příjem streamu přepisu

Když se spustí přepis, váš websocket obdrží datovou část metadat přepisu jako první paket. Tato datová část nese metadata volání a národní prostředí pro konfiguraci.

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

Příjem dat přepisu

Po metadatech, které další pakety váš webový soket obdrží, budou PřepisData pro přepisovaný zvuk.

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

Zpracování streamu přepisu na serveru webového soketu

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

Aktualizace kódu pro obslužnou rutinu 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("----------------------------------------------------------------");
        }
    }
}

Aktualizace přepisu

V situacích, kdy vaše aplikace umožňuje uživatelům vybrat preferovaný jazyk, můžete také chtít zachytit přepis v daném jazyce. K tomu vám sada SDK pro automatizaci volání umožňuje aktualizovat národní prostředí přepisu.

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

Zastavit přepis

Když vaše aplikace potřebuje zastavit naslouchání přepisu, můžete pomocí požadavku StopTranscription dát službě Call Automation vědět, že chcete zastavit odesílání dat přepisu do webového soketu.

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

Vytvoření hovoru a zadání podrobností přepisu

Definujte PřepisOptions pro službu ACS, abyste věděli, jestli se má přepis spustit hned nebo později, které národní prostředí se má přepisovat, a připojení webového soketu, které se má použít k odeslání přepisu.

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

Zahájit přepis

Jakmile budete připraveni zahájit přepis, můžete provést explicitní volání služby Call Automation a zahájit přepis volání.

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

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

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

Příjem streamu přepisu

Když se spustí přepis, váš websocket obdrží datovou část metadat přepisu jako první paket. Tato datová část nese metadata volání a národní prostředí pro konfiguraci.

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

Příjem dat přepisu

Po metadatech budou další pakety, které webový soket přijme, přepisovatData pro přepisovaný zvuk.

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

Zpracování streamu přepisu na serveru webového soketu

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

Aktualizace přepisu

V situacích, kdy vaše aplikace umožňuje uživatelům vybrat preferovaný jazyk, můžete také chtít zachytit přepis v daném jazyce. K tomu vám sada SDK pro automatizaci volání umožňuje aktualizovat národní prostředí přepisu.

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

Zastavit přepis

Když vaše aplikace potřebuje zastavit naslouchání přepisu, můžete pomocí požadavku StopTranscription dát službě Call Automation vědět, že chcete zastavit odesílání dat přepisu do webového soketu.

const stopTranscriptionOptions = {
    operationContext: "stopTranscriptionContext"
};

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

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

Vytvoření hovoru a zadání podrobností přepisu

Definujte PřepisOptions pro službu ACS, abyste věděli, jestli se má přepis spustit hned nebo později, které národní prostředí se má přepisovat, a připojení webového soketu, které se má použít k odeslání přepisu.

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
)

Zahájit přepis

Jakmile budete připraveni zahájit přepis, můžete provést explicitní volání služby Call Automation a zahájit přepis volání.

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

Příjem streamu přepisu

Když se spustí přepis, váš websocket obdrží datovou část metadat přepisu jako první paket. Tato datová část nese metadata volání a národní prostředí pro konfiguraci.

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

Příjem dat přepisu

Po metadatech budou další pakety, které vaše websocket přijme, přepisovatData pro přepisovaný zvuk.

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

Zpracování streamu přepisu na serveru webového soketu

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

Aktualizace přepisu

V situacích, kdy vaše aplikace umožňuje uživatelům vybrat preferovaný jazyk, můžete také chtít zachytit přepis v daném jazyce. K tomu vám sada SDK pro automatizaci volání umožňuje aktualizovat národní prostředí přepisu.

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

Zastavit přepis

Když vaše aplikace potřebuje zastavit naslouchání přepisu, můžete pomocí požadavku StopTranscription dát službě Call Automation vědět, že chcete zastavit odesílání dat přepisu do webového soketu.

# Stop transcription without options
call_connection_client.stop_transcription()

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

Kódy událostí

Událost code podkódování Zpráva
PřepisStarted 200 0 Akce byla úspěšně dokončena.
PřepisStopped 200 0 Akce byla úspěšně dokončena.
PřepisUpdated 200 0 Akce byla úspěšně dokončena.
Přepis se nezdařil 400 8581 Akce se nezdařila, streamUrl není platný.
TrasncriptionFailed 400 8565 Akce selhala kvůli chybnému požadavku služby Cognitive Services. Zkontrolujte vstupní parametry.
Přepis se nezdařil 400 8565 Akce se nezdařila kvůli časového limitu požadavku služeb Cognitive Services. Zkuste to znovu později nebo zkontrolujte případné problémy se službou.
Přepis se nezdařil 400 8605 Vlastní model rozpoznávání řeči pro přepis se nepodporuje.
Přepis se nezdařil 400 8523 Neplatný požadavek, chybí národní prostředí.
Přepis se nezdařil 400 8523 Podporuje se pouze národní prostředí obsahující informace o oblasti.
Přepis se nezdařil 405 8520 Funkce přepisu se v tuto chvíli nepodporuje.
Přepis se nezdařil 405 8520 AktualizaceTranscription není podporována pro připojení vytvořené pomocí rozhraní Connect.
Přepis se nezdařil 400 8528 Akce je neplatná, volání je již ukončeno.
Přepis se nezdařil 405 8520 Funkce přepisu aktualizací se v tuto chvíli nepodporuje.
Přepis se nezdařil 405 8522 Požadavek není povolen, pokud adresa URL přepisu není nastavena během nastavení volání.
Přepis se nezdařil 405 8522 Požadavek není povolený, pokud konfigurace služby Cognitive Service není nastavená během instalace volání.
Přepis se nezdařil 400 8501 Akce je neplatná, pokud není volání v vytvořeném stavu.
Přepis se nezdařil 401 8565 Akce selhala kvůli chybě ověřování služeb Cognitive Services. Zkontrolujte vstup autorizace a ujistěte se, že je správný.
Přepis se nezdařil 403 8565 Akce selhala kvůli zakázanému požadavku na Cognitive Services. Zkontrolujte stav předplatného a ujistěte se, že je aktivní.
Přepis se nezdařil 429 8565 Akce selhala, požadavky překročily počet povolených souběžných požadavků pro předplatné služeb Cognitive Services.
Přepis se nezdařil 500 8578 Akce se nezdařila, nepodařilo se navázat připojení WebSocket.
Přepis se nezdařil 500 8580 Akce selhala, služba přepisu byla vypnuta.
Přepis se nezdařil 500 8579 Akce se nezdařila, přepis byl zrušen.
Přepis se nezdařil 500 9999 Neznámá vnitřní chyba serveru.

Známé problémy

  • U volání 1:1 s uživateli služby ACS používajícími startTranscription klientské sady SDK = True se v současné době nepodporuje.