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
- Podrobnosti o účtu Azure s aktivním předplatným najdete v tématu Vytvoření účtu zdarma.
- Prostředek Azure Communication Services, viz Vytvoření prostředku Azure Communication Services
- Vytvořte a připojte služby Azure AI k prostředku Azure Communication Services.
- Vytvořte vlastní subdoménu pro prostředek služeb Azure AI.
- Vytvořte novou aplikaci webové služby pomocí sady SDK pro automatizaci volání.
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.