Hinzufügen einer Echtzeittranskription zu Ihrer Anwendung
Wichtig
Die in diesem Artikel beschriebenen Funktionen befinden sich derzeit in der öffentlichen Vorschauphase. Diese Vorschauversion wird ohne Vereinbarung zum Servicelevel bereitgestellt und ist nicht für Produktionsworkloads vorgesehen. Manche Features werden möglicherweise nicht unterstützt oder sind nur eingeschränkt verwendbar. Weitere Informationen finden Sie unter Zusätzliche Nutzungsbestimmungen für Microsoft Azure-Vorschauen.
Dieser Leitfaden hilft Ihnen, die verschiedenen Möglichkeiten zu verstehen, wie Sie Azure Communication Services-Angebote für Echtzeittranskription über Anrufautomatisierungs-SDKs verwenden können.
Voraussetzungen
- Ein Azure-Konto mit einem aktiven Abonnement. Details finden Sie im Artikel zum Erstellen eines kostenlosen Azure-Kontos.
- Für eine Azure Communication Services-Ressource siehe Eine Communication Services-Ressource erstellen.
- Erstellen Sie eine Azure KI Services-Instanz für Ihre Azure Communication Services-Ressource, und stellen Sie eine Verbindung mit ihr her.
- Erstellen Sie eine benutzerdefinierte Subdomäne für Ihre Azure KI Services-Ressource.
- Erstellen einer neuen Webdienstanwendung mithilfe des Call Automation SDK
Einrichten eines WebSocket-Servers
Azure Communication Services erfordert die Einrichtung eines WebSocket-Servers für Ihre Serveranwendung, um das Streamen der Transkription in Echtzeit zu ermöglichen. WebSocket ist ein standardisiertes Protokoll, das einen Vollduplex-Kommunikationskanal über eine einzelne TCP-Verbindung bereitstellt. Sie können optional Azure-Web-Apps von Azure-Diensten verwenden, um eine Anwendung zu erstellen, die Transkripte über eine WebSocket-Verbindung empfängt. Eine entsprechende Schnellstartanleitung finden Sie hier.
Einrichten eines Anrufs
In diesem Schnellstart wird davon ausgegangen, dass Sie bereits mit dem Initiieren von Anrufen vertraut sind. Weitere Informationen zum Initiieren und Einrichten von Anrufen finden Sie in unserer Schnellstartanleitung. Im Rahmen dieser Schnellstartanleitung wird das Starten der Transkription sowohl für eingehende als auch für ausgehende Anrufe durchlaufen.
Beim Arbeiten mit Echtzeittranskription haben Sie eine Reihe von Optionen, wann und wie Sie mit der Transkription beginnen:
Option 1: Ab dem Zeitpunkt der Beantwortung oder Erstellung eines Anrufs
Option 2: Starten der Transkription während eines laufenden Anrufs
In diesem Tutorial zeigen wir Option 2, die Transkription während eines laufenden Anrufs zu starten. Standardmäßig ist „startTranscription“ zum Zeitpunkt der Beantwortung oder Erstellung eines Anrufs auf „FALSCH“ festgelegt.
Erstellen eines Anrufs und Bereitstellen der Transkriptionsdetails
Definieren Sie die TranscriptionOptions für ACS, um zu wissen, ob die Transkription sofort oder zu einem späteren Zeitpunkt gestartet werden soll, welches Gebietsschema transkribiert werden soll, und welche Websocketverbindung zum Senden des Transkripts verwendet werden soll.
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);
Transkription starten
Sobald Sie bereit sind, die Transkription zu starten, können Sie einen expliziten Anruf an die Anrufautomatisierung tätigen, um das Transkribieren des Anrufs zu starten.
// 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();
Transkriptionsstream empfangen
Wenn die Transkription gestartet wird, empfängt Ihr Websocket die Transkriptionsmetadaten-Nutzdaten als erstes Paket. Diese Nutzdaten enthalten die Aufrufmetadaten und das Gebietsschema für die Konfiguration.
{
"kind": "TranscriptionMetadata",
"transcriptionMetadata": {
"subscriptionId": "aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e",
"locale": "en-us",
"callConnectionId": "65c57654=f12c-4975-92a4-21668e61dd98",
"correlationId": "65c57654=f12c-4975-92a4-21668e61dd98"
}
}
Transkriptionsdaten empfangen
Nach den Metadaten erhält Ihr Websocket als nächstes Pakete mit TranscriptionData für die transkribierte Audiodaten.
{
"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"
}
}
Transkriptionsdatenstream im Websocketserver verarbeiten
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();
Aktualisierungen des Codes für den Websocket-Handler
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);
}
}
}
Transkription aktualisieren
In Situationen, in denen Ihre Anwendung es Benutzer*innen ermöglicht, ihre bevorzugte Sprache auszuwählen, können Sie auch die Transkription in dieser Sprache erfassen. Dazu können Sie mit dem Anrufautomatisierungs-SDK das Transkriptionsgebietsschema aktualisieren.
await callMedia.UpdateTranscriptionAsync("en-US-NancyNeural");
Transkription beenden
Wenn Ihre Anwendung das Zuhören für die Transkription beenden muss, können Sie die StopTranscription-Anforderung verwenden, um die Anrufautomatisierung zu informieren und das Senden von Transkriptdaten an Ihren Websocket zu beenden.
StopTranscriptionOptions stopOptions = new StopTranscriptionOptions()
{
OperationContext = "stopTranscription"
};
await callMedia.StopTranscriptionAsync(stopOptions);
Erstellen eines Anrufs und Bereitstellen der Transkriptionsdetails
Definieren Sie die TranscriptionOptions für ACS, um zu wissen, ob die Transkription sofort oder zu einem späteren Zeitpunkt gestartet werden soll, welches Gebietsschema transkribiert werden soll, und welche Websocketverbindung zum Senden des Transkripts verwendet werden soll.
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();
Transkription starten
Sobald Sie bereit sind, die Transkription zu starten, können Sie einen expliziten Anruf an die Anrufautomatisierung tätigen, um das Transkribieren des Anrufs zu starten.
//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();
Transkriptionsstream empfangen
Wenn die Transkription gestartet wird, empfängt Ihr Websocket die Transkriptionsmetadaten-Nutzdaten als erstes Paket. Diese Nutzdaten enthalten die Aufrufmetadaten und das Gebietsschema für die Konfiguration.
{
"kind": "TranscriptionMetadata",
"transcriptionMetadata": {
"subscriptionId": "aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e",
"locale": "en-us",
"callConnectionId": "65c57654=f12c-4975-92a4-21668e61dd98",
"correlationId": "65c57654=f12c-4975-92a4-21668e61dd98"
}
}
Transkriptionsdaten empfangen
Nach den Metadaten erhält Ihr Websocket als nächstes Pakete mit TranscriptionData für die transkribierte Audiodaten.
{
"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"
}
}
Transkriptionsdatenstream im Websocketserver verarbeiten
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();
}
}
}
Aktualisierungen des Codes für den Websocket-Handler
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("----------------------------------------------------------------");
}
}
}
Transkription aktualisieren
In Situationen, in denen Ihre Anwendung es Benutzer*innen ermöglicht, ihre bevorzugte Sprache auszuwählen, können Sie auch die Transkription in dieser Sprache erfassen. Dazu können Sie mit dem Anrufautomatisierungs-SDK das Transkriptionsgebietsschema aktualisieren.
client.getCallConnection(callConnectionId)
.getCallMedia()
.updateTranscription("en-US-NancyNeural");
Transkription beenden
Wenn Ihre Anwendung das Zuhören für die Transkription beenden muss, können Sie die StopTranscription-Anforderung verwenden, um die Anrufautomatisierung zu informieren und das Senden von Transkriptdaten an Ihren Websocket zu beenden.
// 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();
Erstellen eines Anrufs und Bereitstellen der Transkriptionsdetails
Definieren Sie die TranscriptionOptions für ACS, um zu wissen, ob die Transkription sofort oder zu einem späteren Zeitpunkt gestartet werden soll, welches Gebietsschema transkribiert werden soll, und welche Websocketverbindung zum Senden des Transkripts verwendet werden soll.
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);
Transkription starten
Sobald Sie bereit sind, die Transkription zu starten, können Sie einen expliziten Anruf an die Anrufautomatisierung tätigen, um das Transkribieren des Anrufs zu starten.
const startTranscriptionOptions = {
locale: "en-AU",
operationContext: "startTranscriptionContext"
};
// Start transcription with options
await callMedia.startTranscription(startTranscriptionOptions);
// Alternative: Start transcription without options
// await callMedia.startTranscription();
Transkriptionsstream empfangen
Wenn die Transkription gestartet wird, empfängt Ihr Websocket die Transkriptionsmetadaten-Nutzdaten als erstes Paket. Diese Nutzdaten enthalten die Aufrufmetadaten und das Gebietsschema für die Konfiguration.
{
"kind": "TranscriptionMetadata",
"transcriptionMetadata": {
"subscriptionId": "aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e",
"locale": "en-us",
"callConnectionId": "65c57654=f12c-4975-92a4-21668e61dd98",
"correlationId": "65c57654=f12c-4975-92a4-21668e61dd98"
}
}
Transkriptionsdaten empfangen
Nach den Metadaten erhält Ihr Websocket als nächstes Pakete mit TranskriptionData für die transkribierte Audiodaten.
{
"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"
}
}
Transkriptionsdatenstream im Websocketserver verarbeiten
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');
Transkription aktualisieren
In Situationen, in denen Ihre Anwendung es Benutzer*innen ermöglicht, ihre bevorzugte Sprache auszuwählen, können Sie auch die Transkription in dieser Sprache erfassen. Dazu können Sie mit dem Anrufautomatisierungs-SDK das Transkriptionsgebietsschema aktualisieren.
await callMedia.updateTranscription("en-US-NancyNeural");
Transkription beenden
Wenn Ihre Anwendung das Zuhören für die Transkription beenden muss, können Sie die StopTranscription-Anforderung verwenden, um die Anrufautomatisierung zu informieren und das Senden von Transkriptdaten an Ihren Websocket zu beenden.
const stopTranscriptionOptions = {
operationContext: "stopTranscriptionContext"
};
// Stop transcription with options
await callMedia.stopTranscription(stopTranscriptionOptions);
// Alternative: Stop transcription without options
// await callMedia.stopTranscription();
Erstellen eines Anrufs und Bereitstellen der Transkriptionsdetails
Definieren Sie die TranscriptionOptions für ACS, um zu wissen, ob die Transkription sofort oder zu einem späteren Zeitpunkt gestartet werden soll, welches Gebietsschema transkribiert werden soll, und welche Websocketverbindung zum Senden des Transkripts verwendet werden soll.
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
)
Transkription starten
Sobald Sie bereit sind, die Transkription zu starten, können Sie einen expliziten Anruf an die Anrufautomatisierung tätigen, um das Transkribieren des Anrufs zu starten.
# 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")
Transkriptionsstream empfangen
Wenn die Transkription gestartet wird, empfängt Ihr Websocket die Transkriptionsmetadaten-Nutzdaten als erstes Paket. Diese Nutzdaten enthalten die Aufrufmetadaten und das Gebietsschema für die Konfiguration.
{
"kind": "TranscriptionMetadata",
"transcriptionMetadata": {
"subscriptionId": "aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e",
"locale": "en-us",
"callConnectionId": "65c57654=f12c-4975-92a4-21668e61dd98",
"correlationId": "65c57654=f12c-4975-92a4-21668e61dd98"
}
}
Transkriptionsdaten empfangen
Nach den Metadaten erhält Ihr Websocket als nächstes Pakete mit TranskriptionData für die transkribierte Audiodaten.
{
"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"
}
}
Transkriptionsdatenstream im Websocketserver verarbeiten
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()
Transkription aktualisieren
In Situationen, in denen Ihre Anwendung es Benutzer*innen ermöglicht, ihre bevorzugte Sprache auszuwählen, können Sie auch die Transkription in dieser Sprache erfassen. Dazu können Sie mit dem Anrufautomatisierungs-SDK das Transkriptionsgebietsschema aktualisieren.
await call_connection_client.update_transcription(locale="en-US-NancyNeural")
Transkription beenden
Wenn Ihre Anwendung das Zuhören für die Transkription beenden muss, können Sie die StopTranscription-Anforderung verwenden, um die Anrufautomatisierung zu informieren und das Senden von Transkriptdaten an Ihren Websocket zu beenden.
# Stop transcription without options
call_connection_client.stop_transcription()
# Alternative: Stop transcription with operation context
# call_connection_client.stop_transcription(operation_context="stopTranscriptionContext")
Ereigniscodes
Ereignis | code | subcode | `Message` |
---|---|---|---|
TranscriptionStarted | 200 | 0 | Die Aktion wurde erfolgreich abgeschlossen. |
TranscriptionStopped | 200 | 0 | Die Aktion wurde erfolgreich abgeschlossen. |
TranscriptionUpdated | 200 | 0 | Die Aktion wurde erfolgreich abgeschlossen. |
TranscriptionFailed | 400 | 8581 | Aktion fehlgeschlagen, StreamUrl ist ungültig. |
TrasncriptionFailed | 400 | 8565 | Die Aktion konnte aufgrund einer schlechten Anforderung an Cognitive Services nicht ausgeführt werden. Überprüfen Sie Ihre Eingabeparameter. |
TranscriptionFailed | 400 | 8565 | Die Aktion konnte aufgrund des Timeouts einer Anforderung an Cognitive Services nicht ausgeführt werden. Versuchen Sie es später erneut, oder suchen Sie nach Problemen mit dem Dienst. |
TranscriptionFailed | 400 | 8605 | Benutzerdefiniertes Spracherkennungsmodell für Transkription wird nicht unterstützt. |
TranscriptionFailed | 400 | 8523 | Ungültige Anforderung, Gebietsschema fehlt. |
TranscriptionFailed | 400 | 8523 | Ungültige Anforderung, nur Gebietsschemas, die Regionsinformationen enthalten, werden unterstützt. |
TranscriptionFailed | 405 | 8520 | Die Transkriptionsfunktion wird derzeit nicht unterstützt. |
TranscriptionFailed | 405 | 8520 | UpdateTranscription wird für die Verbindung, die mit der Connect-Schnittstelle erstellt wird, nicht unterstützt. |
TranscriptionFailed | 400 | 8528 | Die Aktion ist ungültig, der Aufruf wurde bereits beendet. |
TranscriptionFailed | 405 | 8520 | Das Aktualisieren der Transkriptionsfunktion wird derzeit nicht unterstützt. |
TranscriptionFailed | 405 | 8522 | Anforderung nicht zulässig, wenn die Transkription-URL während der Anrufeinrichtung nicht festgelegt wurde. |
TranscriptionFailed | 405 | 8522 | Anforderung nicht zulässig, wenn die Cognitive Service-Konfiguration während der Anrufeinrichtung nicht festgelegt wurde. |
TranscriptionFailed | 400 | 8501 | Aktion ungültig, wenn sich der Aufruf nicht im Zustand „Hergestellt“ befindet. |
TranscriptionFailed | 401 | 8565 | Die Aktion ist aufgrund eines Cognitive Services-Authentifizierungsfehlers fehlgeschlagen. Überprüfen Sie Ihre Autorisierungseingabe, und stellen Sie sicher, dass sie korrekt ist. |
TranscriptionFailed | 403 | 8565 | Die Aktion ist aufgrund einer verbotenen Anforderung an Cognitive Services fehlgeschlagen. Überprüfen Sie Ihren Abonnementstatus, und stellen Sie sicher, dass er „aktiv“ lautet. |
TranscriptionFailed | 429 | 8565 | Fehler bei der Aktion, Anzahl der zulässigen gleichzeitigen Anforderungen für das Cognitive Services-Abonnement überschritten. |
TranscriptionFailed | 500 | 8578 | Fehler bei der Aktion, nicht in der Lage, eine WebSocket-Verbindung herzustellen. |
TranscriptionFailed | 500 | 8580 | Aktion fehlgeschlagen, Transkriptionsdienst wurde heruntergefahren. |
TranscriptionFailed | 500 | 8579 | Aktion fehlgeschlagen, Transkription wurde abgebrochen. |
TranscriptionFailed | 500 | 9999 | Unbekannter interner Serverfehler. |
Bekannte Probleme
- Für 1:1-Aufrufe mit ACS-Benutzer*innen, die Client-SDKs verwenden, wird „startTranscription = True“ derzeit nicht unterstützt.