Aggiungere la trascrizione in tempo reale nell'applicazione
Importante
Attualmente la funzionalità descritta in questo articolo è disponibile in anteprima pubblica. Questa versione di anteprima viene fornita senza contratto di servizio, pertanto se ne sconsiglia l’uso per i carichi di lavoro in ambienti di produzione. Alcune funzionalità potrebbero non essere supportate o potrebbero presentare funzionalità limitate. Per altre informazioni, vedere le Condizioni supplementari per l'uso delle anteprime di Microsoft Azure.
Questa guida consente di comprendere meglio i diversi modi in cui è possibile usare i Servizi di comunicazione di Azure che offrono la trascrizione in tempo reale tramite gli SDK di Automazione delle chiamate.
Prerequisiti
- Un account Azure con una sottoscrizione attiva, per informazioni dettagliate, vedere Creare un account gratuitamente.
- Risorsa di Servizi di comunicazione di Azure, vedere Creare una risorsa di Servizi di comunicazione di Azure
- Creare e connettere Servizi di Azure AI alla risorsa Servizi di comunicazione di Azure.
- Creare un sottodominio personalizzato per la risorsa dei Servizi di Azure AI.
- Creare una nuova applicazione di servizio Web usando SDK di automazione delle chiamate.
Configurare un server WebSocket
Servizi di comunicazione di Azure richiede che l'applicazione server configuri un server WebSocket per trasmettere la trascrizione in tempo reale. WebSocket è un protocollo standardizzato che fornisce un canale di comunicazioni full duplex su una singola connessione TCP. Facoltativamente, è possibile usare i servizi di Azure WebApps di Azure che consentono di creare un'applicazione per ricevere trascrizioni tramite una connessione WebSocket. Seguire questa guida introduttiva.
Stabilire una chiamata
In questa guida introduttiva si presuppone che si abbia già familiarità con le chiamate iniziali. Per altre informazioni sull'avvio e la definizione delle chiamate, è possibile seguire la guida introduttiva. Ai fini di questa guida introduttiva, verrà eseguito il processo di avvio della trascrizione sia per le chiamate in ingresso che per quelle in uscita.
Quando si usa la trascrizione in tempo reale, sono disponibili due opzioni su quando e come avviare la trascrizione:
Opzione 1: A partire dal momento della risposta o della creazione di una chiamata
Opzione 2: Avvio della trascrizione durante una chiamata in corso
In questa esercitazione viene illustrata l'opzione 2, l'avvio della trascrizione durante una chiamata in corso. Per impostazione predefinita, "startTranscription" è impostato su false al momento della risposta o della creazione di una chiamata.
Creare una chiamata e fornire i dettagli della trascrizione
Definire le opzioni di trascrizione per ACS per sapere se avviare la trascrizione immediatamente o in un secondo momento, quali impostazioni locali trascrivere e la connessione Web socket da usare per l'invio della trascrizione.
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);
Avviare la trascrizione
Dopo aver avviato la trascrizione, è possibile effettuare una chiamata esplicita a Call Automation per avviare la trascrizione della chiamata.
// 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();
Ricezione del flusso di trascrizione
All'avvio della trascrizione, il WebSocket riceverà il payload dei metadati di trascrizione come primo pacchetto. Questo payload contiene i metadati delle chiamate e le impostazioni locali per la configurazione.
{
"kind": "TranscriptionMetadata",
"transcriptionMetadata": {
"subscriptionId": "835be116-f750-48a4-a5a4-ab85e070e5b0",
"locale": "en-us",
"callConnectionId": "65c57654=f12c-4975-92a4-21668e61dd98",
"correlationId": "65c57654=f12c-4975-92a4-21668e61dd98"
}
}
Ricezione dei dati di trascrizione
Dopo i metadati, i pacchetti successivi ricevuti dal Web socket saranno TranscriptionData per l'audio trascritto.
{
"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"
}
}
Gestione del flusso di trascrizione nel server Web socket
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();
Aggiornamenti del codice per il gestore 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);
}
}
}
Aggiornare la trascrizione
Per le situazioni in cui l'applicazione consente agli utenti di selezionare la lingua preferita, è anche possibile acquisire la trascrizione in tale lingua. A tale scopo, Call Automation SDK consente di aggiornare le impostazioni locali di trascrizione.
await callMedia.UpdateTranscriptionAsync("en-US-NancyNeural");
Arrestare la trascrizione
Quando l'applicazione deve interrompere l'ascolto della trascrizione, è possibile usare la richiesta StopTranscription per informare l'automazione delle chiamate di interrompere l'invio di dati di trascrizione al Web socket.
StopTranscriptionOptions stopOptions = new StopTranscriptionOptions()
{
OperationContext = "stopTranscription"
};
await callMedia.StopTranscriptionAsync(stopOptions);
Creare una chiamata e fornire i dettagli della trascrizione
Definire le opzioni di trascrizione per ACS per sapere se avviare la trascrizione immediatamente o in un secondo momento, quali impostazioni locali trascrivere e la connessione Web socket da usare per l'invio della trascrizione.
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();
Avviare la trascrizione
Dopo aver avviato la trascrizione, è possibile effettuare una chiamata esplicita a Call Automation per avviare la trascrizione della chiamata.
//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();
Ricezione del flusso di trascrizione
All'avvio della trascrizione, il WebSocket riceverà il payload dei metadati di trascrizione come primo pacchetto. Questo payload contiene i metadati delle chiamate e le impostazioni locali per la configurazione.
{
"kind": "TranscriptionMetadata",
"transcriptionMetadata": {
"subscriptionId": "835be116-f750-48a4-a5a4-ab85e070e5b0",
"locale": "en-us",
"callConnectionId": "65c57654=f12c-4975-92a4-21668e61dd98",
"correlationId": "65c57654=f12c-4975-92a4-21668e61dd98"
}
}
Ricezione dei dati di trascrizione
Dopo i metadati, i pacchetti successivi ricevuti dal Web socket saranno TranscriptionData per l'audio trascritto.
{
"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"
}
}
Gestione del flusso di trascrizione nel server Web socket
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();
}
}
}
Aggiornamenti del codice per il gestore 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("----------------------------------------------------------------");
}
}
}
Aggiornare la trascrizione
Per le situazioni in cui l'applicazione consente agli utenti di selezionare la lingua preferita, è anche possibile acquisire la trascrizione in tale lingua. A tale scopo, Call Automation SDK consente di aggiornare le impostazioni locali di trascrizione.
client.getCallConnection(callConnectionId)
.getCallMedia()
.updateTranscription("en-US-NancyNeural");
Arrestare la trascrizione
Quando l'applicazione deve interrompere l'ascolto della trascrizione, è possibile usare la richiesta StopTranscription per informare l'automazione delle chiamate di interrompere l'invio di dati di trascrizione al Web socket.
// 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();
Creare una chiamata e fornire i dettagli della trascrizione
Definire le opzioni di trascrizione per ACS per sapere se avviare la trascrizione immediatamente o in un secondo momento, quali impostazioni locali trascrivere e la connessione Web socket da usare per l'invio della trascrizione.
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);
Avviare la trascrizione
Dopo aver avviato la trascrizione, è possibile effettuare una chiamata esplicita a Call Automation per avviare la trascrizione della chiamata.
const startTranscriptionOptions = {
locale: "en-AU",
operationContext: "startTranscriptionContext"
};
// Start transcription with options
await callMedia.startTranscription(startTranscriptionOptions);
// Alternative: Start transcription without options
// await callMedia.startTranscription();
Ricezione del flusso di trascrizione
All'avvio della trascrizione, il WebSocket riceverà il payload dei metadati di trascrizione come primo pacchetto. Questo payload contiene i metadati delle chiamate e le impostazioni locali per la configurazione.
{
"kind": "TranscriptionMetadata",
"transcriptionMetadata": {
"subscriptionId": "835be116-f750-48a4-a5a4-ab85e070e5b0",
"locale": "en-us",
"callConnectionId": "65c57654=f12c-4975-92a4-21668e61dd98",
"correlationId": "65c57654=f12c-4975-92a4-21668e61dd98"
}
}
Ricezione dei dati di trascrizione
Dopo i metadati, i pacchetti successivi ricevuti dal Web socket saranno TranscriptionData per l'audio trascritto.
{
"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"
}
}
Gestione del flusso di trascrizione nel server Web socket
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');
Aggiornare la trascrizione
Per le situazioni in cui l'applicazione consente agli utenti di selezionare la lingua preferita, è anche possibile acquisire la trascrizione in tale lingua. A tale scopo, Call Automation SDK consente di aggiornare le impostazioni locali di trascrizione.
await callMedia.updateTranscription("en-US-NancyNeural");
Arrestare la trascrizione
Quando l'applicazione deve interrompere l'ascolto della trascrizione, è possibile usare la richiesta StopTranscription per informare l'automazione delle chiamate di interrompere l'invio di dati di trascrizione al Web socket.
const stopTranscriptionOptions = {
operationContext: "stopTranscriptionContext"
};
// Stop transcription with options
await callMedia.stopTranscription(stopTranscriptionOptions);
// Alternative: Stop transcription without options
// await callMedia.stopTranscription();
Creare una chiamata e fornire i dettagli della trascrizione
Definire le opzioni di trascrizione per ACS per sapere se avviare la trascrizione immediatamente o in un secondo momento, quali impostazioni locali trascrivere e la connessione Web socket da usare per l'invio della trascrizione.
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
)
Avviare la trascrizione
Dopo aver avviato la trascrizione, è possibile effettuare una chiamata esplicita a Call Automation per avviare la trascrizione della chiamata.
# 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")
Ricezione del flusso di trascrizione
All'avvio della trascrizione, il WebSocket riceverà il payload dei metadati di trascrizione come primo pacchetto. Questo payload contiene i metadati delle chiamate e le impostazioni locali per la configurazione.
{
"kind": "TranscriptionMetadata",
"transcriptionMetadata": {
"subscriptionId": "835be116-f750-48a4-a5a4-ab85e070e5b0",
"locale": "en-us",
"callConnectionId": "65c57654=f12c-4975-92a4-21668e61dd98",
"correlationId": "65c57654=f12c-4975-92a4-21668e61dd98"
}
}
Ricezione dei dati di trascrizione
Dopo i metadati, i pacchetti successivi ricevuti dal Web socket saranno TranscriptionData per l'audio trascritto.
{
"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"
}
}
Gestione del flusso di trascrizione nel server Web socket
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()
Aggiornare la trascrizione
Per le situazioni in cui l'applicazione consente agli utenti di selezionare la lingua preferita, è anche possibile acquisire la trascrizione in tale lingua. A tale scopo, Call Automation SDK consente di aggiornare le impostazioni locali di trascrizione.
await call_connection_client.update_transcription(locale="en-US-NancyNeural")
Arrestare la trascrizione
Quando l'applicazione deve interrompere l'ascolto della trascrizione, è possibile usare la richiesta StopTranscription per informare l'automazione delle chiamate di interrompere l'invio di dati di trascrizione al Web socket.
# Stop transcription without options
call_connection_client.stop_transcription()
# Alternative: Stop transcription with operation context
# call_connection_client.stop_transcription(operation_context="stopTranscriptionContext")
Codici evento
Event | codice | sottocodice | Message |
---|---|---|---|
TranscriptionStarted | 200 | 0 | Azione completata correttamente. |
TranscriptionStopped | 200 | 0 | Azione completata correttamente. |
TranscriptionUpdated | 200 | 0 | Azione completata correttamente. |
TranscriptionFailed | 400 | 8581 | Azione non riuscita. StreamUrl non valido. |
TrasncriptionFailed | 400 | 8565 | Azione non riuscita a causa di una richiesta non valida a Servizi cognitivi. Controllare i parametri di input. |
TranscriptionFailed | 400 | 8565 | Azione non riuscita a causa del timeout di una richiesta a Servizi cognitivi. Riprovare più tardi o verificare la presenza di eventuali problemi con il servizio. |
TranscriptionFailed | 400 | 8605 | Il modello di riconoscimento vocale personalizzato per la trascrizione non è supportato. |
TranscriptionFailed | 400 | 8523 | Richiesta non valida. Impostazioni locali mancanti. |
TranscriptionFailed | 400 | 8523 | Richiesta non valida. Sono supportate solo le impostazioni locali che contengono informazioni sull'area. |
TranscriptionFailed | 405 | 8520 | La funzionalità di trascrizione non è attualmente supportata. |
TranscriptionFailed | 405 | 8520 | UpdateTranscription non è supportato per la connessione creata con l'interfaccia Connect. |
TranscriptionFailed | 400 | 8528 | Azione non valida, chiamata già terminata. |
TranscriptionFailed | 405 | 8520 | L'aggiornamento della funzionalità di trascrizione non è attualmente supportato. |
TranscriptionFailed | 405 | 8522 | Richiesta non consentita quando l'URL di trascrizione non è impostato durante l'installazione della chiamata. |
TranscriptionFailed | 405 | 8522 | Richiesta non consentita quando la configurazione del servizio cognitivo non è impostata durante l'installazione delle chiamate. |
TranscriptionFailed | 400 | 8501 | L'azione non è valida quando la chiamata non è in stato Stabilito. |
TranscriptionFailed | 401 | 8565 | Azione non riuscita a causa di un errore di autenticazione di Servizi cognitivi. Controllare l'input di autorizzazione e verificare che sia corretto. |
TranscriptionFailed | 403 | 8565 | Azione non riuscita a causa di una richiesta non consentita a Servizi cognitivi. Controllare lo stato della sottoscrizione e assicurarsi che sia attivo. |
TranscriptionFailed | 429 | 8565 | Azione non riuscita, le richieste hanno superato il numero di richieste simultanee consentite per la sottoscrizione dei servizi cognitivi. |
TranscriptionFailed | 500 | 8578 | Azione non riuscita. Non è possibile stabilire la connessione WebSocket. |
TranscriptionFailed | 500 | 8580 | Azione non riuscita. Il servizio di trascrizione è stato arrestato. |
TranscriptionFailed | 500 | 8579 | Azione non riuscita. La trascrizione è stata annullata. |
TranscriptionFailed | 500 | 9999 | Errore interno sconosciuto del server. |
Problemi noti
- Per le chiamate 1:1 con utenti ACS che usano gli SDK client startTranscription = True non è attualmente supportato.