Adicionar transcrição em tempo real ao seu aplicativo
Importante
A funcionalidade descrita neste artigo está atualmente em versão prévia pública. Essa versão prévia é fornecida sem um contrato de nível de serviço e não é recomendada para cargas de trabalho de produção. Alguns recursos podem não ter suporte ou podem ter restrição de recursos. Para obter mais informações, consulte Termos de Uso Complementares de Versões Prévias do Microsoft Azure.
Este guia ajuda você a entender melhor as diferentes maneiras de usar a oferta dos Serviços de Comunicação do Azure de transcrição em tempo real por meio de SDKs de Automação de Chamadas.
Pré-requisitos
- Conta do Azure com uma assinatura ativa, para obter detalhes, veja Criar uma conta gratuitamente.
- Para um recurso dos Serviços de Comunicação do Azure, confira Criar um recurso dos Serviços de Comunicação
- Crie e conecte os serviços de IA do Azure ao seu recurso dos Serviços de Comunicação do Azure.
- Crie um subdomínio personalizado para seu recurso de serviços de IA do Azure.
- Crie um aplicativo de serviço Web usando o SDK de Automação de Chamadas.
Configurar um servidor WebSocket
Os Serviços de Comunicação do Azure exigem que o aplicativo de servidor configure um servidor WebSocket para transmitir a transcrição em tempo real. O WebSocket é um protocolo padronizado que fornece um canal de comunicação full-duplex sobre uma única conexão TCP. Opcionalmente, é possível usar os Aplicativos Web do Azure dos serviços do Azure para criar um aplicativo que receba transcrições por uma conexão WebSocket. Siga este início rápido.
Estabelecer uma chamada
Neste início rápido, presumimos que você já esteja familiarizado com as chamadas iniciais. Para saber como iniciar e estabelecer chamadas, siga nosso início rápido. Para este início rápido, estamos passando pelo processo de iniciar a transcrição tanto para chamadas de entrada quanto chamadas de saída.
Ao trabalhar com transcrição em tempo real, você tem algumas opções sobre quando e como iniciar a transcrição:
Opção 1 – Iniciando no momento da resposta ou da criação de uma chamada
Opção 2 – Iniciando a transcrição durante uma chamada em andamento
Neste tutorial, estamos demonstrando a opção 2, iniciando a transcrição durante uma chamada em andamento. Por padrão, o 'startTranscription' é definido como false no momento da criação de uma chamada ou ao respondê-la.
Criar uma chamada e fornecer os detalhes da transcrição
Defina as TranscriptionOptions para ACS para saber se você deve iniciar a transcrição imediatamente ou em um momento posterior, em qual localidade transcrever e a conexão de soquete da Web a ser usada para enviar a transcrição.
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);
Iniciar Transcrição
Quando estiver pronto para iniciar a transcrição, você poderá fazer uma chamada explícita para a Automação de Chamadas para começar a transcrever a chamada.
// 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();
Recebendo fluxo de transcrição
Quando a transcrição for iniciada, o websocket receberá o conteúdo de metadados de transcrição como o primeiro pacote. Esse conteúdo carrega os metadados de chamada e a localidade da configuração.
{
"kind": "TranscriptionMetadata",
"transcriptionMetadata": {
"subscriptionId": "835be116-f750-48a4-a5a4-ab85e070e5b0",
"locale": "en-us",
"callConnectionId": "65c57654=f12c-4975-92a4-21668e61dd98",
"correlationId": "65c57654=f12c-4975-92a4-21668e61dd98"
}
}
Recebendo dados de transcrição
Após os metadados, os próximos pacotes recebidos pelo soquete da Web serão TranscriptionData para o áudio transcrito.
{
"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"
}
}
Manipulando o fluxo de transcrição no servidor de soquete da Web
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();
Atualizações em seu código para o manipulador 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);
}
}
}
Atualizar transcrição
Para situações em que seu aplicativo permite que os usuários selecionem o idioma de preferência deles, talvez você também queira capturar a transcrição nesse idioma. Para fazer isso, o SDK de Automação de Chamadas permite que você atualize a localidade da transcrição.
await callMedia.UpdateTranscriptionAsync("en-US-NancyNeural");
Interromper transcrição
Quando o aplicativo precisa parar de escutar a transcrição, você pode usar a solicitação StopTranscription para informar a Automação de Chamadas para interromper o envio de dados de transcrição para o soquete da Web.
StopTranscriptionOptions stopOptions = new StopTranscriptionOptions()
{
OperationContext = "stopTranscription"
};
await callMedia.StopTranscriptionAsync(stopOptions);
Criar uma chamada e fornecer os detalhes da transcrição
Defina as TranscriptionOptions para ACS para saber se você deve iniciar a transcrição imediatamente ou em um momento posterior, em qual localidade transcrever e a conexão de soquete da Web a ser usada para enviar a transcrição.
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();
Iniciar Transcrição
Quando estiver pronto para iniciar a transcrição, você poderá fazer uma chamada explícita para a Automação de Chamadas para começar a transcrever a chamada.
//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();
Recebendo fluxo de transcrição
Quando a transcrição for iniciada, o websocket receberá o conteúdo de metadados de transcrição como o primeiro pacote. Esse conteúdo carrega os metadados de chamada e a localidade da configuração.
{
"kind": "TranscriptionMetadata",
"transcriptionMetadata": {
"subscriptionId": "835be116-f750-48a4-a5a4-ab85e070e5b0",
"locale": "en-us",
"callConnectionId": "65c57654=f12c-4975-92a4-21668e61dd98",
"correlationId": "65c57654=f12c-4975-92a4-21668e61dd98"
}
}
Recebendo dados de transcrição
Após os metadados, os próximos pacotes recebidos pelo soquete da Web serão TranscriptionData para o áudio transcrito.
{
"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"
}
}
Manipulando o fluxo de transcrição no servidor de soquete da Web
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();
}
}
}
Atualizações em seu código para o manipulador 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("----------------------------------------------------------------");
}
}
}
Atualizar transcrição
Para situações em que seu aplicativo permite que os usuários selecionem o idioma de preferência deles, talvez você também queira capturar a transcrição nesse idioma. Para fazer isso, o SDK de Automação de Chamadas permite que você atualize a localidade da transcrição.
client.getCallConnection(callConnectionId)
.getCallMedia()
.updateTranscription("en-US-NancyNeural");
Interromper transcrição
Quando o aplicativo precisa parar de escutar a transcrição, você pode usar a solicitação StopTranscription para informar a Automação de Chamadas para interromper o envio de dados de transcrição para o soquete da Web.
// 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();
Criar uma chamada e fornecer os detalhes da transcrição
Defina as TranscriptionOptions para ACS para saber se você deve iniciar a transcrição imediatamente ou em um momento posterior, em qual localidade transcrever e a conexão de soquete da Web a ser usada para enviar a transcrição.
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);
Iniciar Transcrição
Quando estiver tudo pronto para iniciar a transcrição, você poderá fazer uma chamada explícita para a Automação de Chamadas para começar a transcrever a chamada.
const startTranscriptionOptions = {
locale: "en-AU",
operationContext: "startTranscriptionContext"
};
// Start transcription with options
await callMedia.startTranscription(startTranscriptionOptions);
// Alternative: Start transcription without options
// await callMedia.startTranscription();
Recebendo fluxo de transcrição
Quando a transcrição for iniciada, o websocket receberá o conteúdo de metadados de transcrição como o primeiro pacote. Esse conteúdo carrega os metadados de chamada e a localidade da configuração.
{
"kind": "TranscriptionMetadata",
"transcriptionMetadata": {
"subscriptionId": "835be116-f750-48a4-a5a4-ab85e070e5b0",
"locale": "en-us",
"callConnectionId": "65c57654=f12c-4975-92a4-21668e61dd98",
"correlationId": "65c57654=f12c-4975-92a4-21668e61dd98"
}
}
Recebendo dados de transcrição
Após os metadados, os próximos pacotes recebidos pelo soquete da Web serão TranscriptionData para o áudio transcrito.
{
"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"
}
}
Manipulando o fluxo de transcrição no servidor de soquete da Web
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');
Atualizar transcrição
Para situações em que seu aplicativo permite que os usuários selecionem o idioma de preferência deles, talvez você também queira capturar a transcrição nesse idioma. Para fazer isso, o SDK de Automação de Chamadas permite que você atualize a localidade de transcrição.
await callMedia.updateTranscription("en-US-NancyNeural");
Interromper transcrição
Quando o aplicativo precisa parar de escutar a transcrição, você pode usar a solicitação StopTranscription para informar a Automação de Chamadas para interromper o envio de dados de transcrição para o soquete da Web.
const stopTranscriptionOptions = {
operationContext: "stopTranscriptionContext"
};
// Stop transcription with options
await callMedia.stopTranscription(stopTranscriptionOptions);
// Alternative: Stop transcription without options
// await callMedia.stopTranscription();
Criar uma chamada e fornecer os detalhes da transcrição
Defina as TranscriptionOptions para ACS para saber se você deve iniciar a transcrição imediatamente ou em um momento posterior, em qual localidade transcrever e a conexão de soquete da Web a ser usada para enviar a transcrição.
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
)
Iniciar Transcrição
Quando estiver tudo pronto para iniciar a transcrição, você poderá fazer uma chamada explícita para a Automação de Chamadas para começar a transcrever a chamada.
# 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")
Recebendo fluxo de transcrição
Quando a transcrição for iniciada, o websocket receberá o conteúdo de metadados de transcrição como o primeiro pacote. Esse conteúdo carrega os metadados de chamada e a localidade da configuração.
{
"kind": "TranscriptionMetadata",
"transcriptionMetadata": {
"subscriptionId": "835be116-f750-48a4-a5a4-ab85e070e5b0",
"locale": "en-us",
"callConnectionId": "65c57654=f12c-4975-92a4-21668e61dd98",
"correlationId": "65c57654=f12c-4975-92a4-21668e61dd98"
}
}
Recebendo dados de transcrição
Após os metadados, os próximos pacotes recebidos pelo websocket serão TranscriptionData para o áudio transcrito.
{
"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"
}
}
Manipulando o fluxo de transcrição no servidor de soquete da Web
import asyncio
import json
import websockets
from azure.communication.callautomation.streaming.models import (
TranscriptionMetadata, TranscriptionData, WordData, TextFormat, ResultStatus
)
from azure.communication.callautomation.streaming.streaming_data_parser import StreamingDataParser
async def handle_client(websocket, path):
print("Client connected")
try:
async for message in websocket:
print(message)
result = StreamingDataParser.parse(message)
if isinstance(result, TranscriptionMetadata):
print("Parsed data is metadata")
print("-------------------------")
print("Subscription ID:", result.subscriptionId)
print("Locale:", result.locale)
print("Call Connection ID:", result.callConnectionId)
print("Correlation ID:", result.correlationId)
elif isinstance(result, TranscriptionData):
print("Parsed data is transcription data")
print("-------------------------")
print("Text:", result.text)
print("Format:", result.format)
print("Confidence:", result.confidence)
print("Offset:", result.offset)
print("Duration:", result.duration)
print("Participant:", result.participant.raw_id)
print("Result Status:", result.resultStatus)
for word in result.words:
print("Word:", word.text)
print("Offset:", word.offset)
print("Duration:", word.duration)
except websockets.exceptions.ConnectionClosedOK:
print("Client disconnected")
start_server = websockets.serve(handle_client, "localhost", 8081)
print('WebSocket server running on port 8081')
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()
Atualizar transcrição
Para situações em que seu aplicativo permite que os usuários selecionem o idioma de preferência deles, talvez você também queira capturar a transcrição nesse idioma. Para fazer isso, o SDK de Automação de Chamadas permite que você atualize a localidade de transcrição.
await call_connection_client.update_transcription(locale="en-US-NancyNeural")
Interromper transcrição
Quando o aplicativo precisa parar de escutar a transcrição, você pode usar a solicitação StopTranscription para informar a Automação de Chamadas para interromper o envio de dados de transcrição para o soquete da Web.
# Stop transcription without options
call_connection_client.stop_transcription()
# Alternative: Stop transcription with operation context
# call_connection_client.stop_transcription(operation_context="stopTranscriptionContext")
Códigos de evento
Evento | código | subcódigo | Mensagem |
---|---|---|---|
TranscriptionStarted | 200 | 0 | Ação concluída com sucesso. |
TranscriptionStopped | 200 | 0 | Ação concluída com sucesso. |
TranscriptionUpdated | 200 | 0 | Ação concluída com sucesso. |
TranscriptionFailed | 400 | 8581 | Falha na ação, StreamUrl não é válido. |
TranscriptionFailed | 400 | 8565 | Falha na ação devido a uma solicitação incorreta aos Serviços Cognitivos. Verifique os parâmetros de entrada. |
TranscriptionFailed | 400 | 8565 | Falha na ação devido a uma solicitação para o tempo limite dos Serviços Cognitivos. Tente novamente mais tarde ou verifique se há problemas com o serviço. |
TranscriptionFailed | 400 | 8605 | Não há suporte para o modelo de reconhecimento de fala personalizado para Transcrição. |
TranscriptionFailed | 400 | 8523 | Solicitação inválida, a localidade está ausente. |
TranscriptionFailed | 400 | 8523 | Solicitação inválida, há suporte apenas para a localidade que contém informações de região. |
TranscriptionFailed | 405 | 8520 | Não há suporte para a funcionalidade de transcrição no momento. |
TranscriptionFailed | 405 | 8520 | Não há suporte para UpdateTranscription para conexão criada com a interface Connect. |
TranscriptionFailed | 400 | 8528 | A ação é inválida, a chamada já foi encerrada. |
TranscriptionFailed | 405 | 8520 | No momento, não há suporte para a funcionalidade de transcrição de atualização. |
TranscriptionFailed | 405 | 8522 | Solicitação não permitida quando a URL de Transcrição não é definida durante a instalação da chamada. |
TranscriptionFailed | 405 | 8522 | Solicitação não permitida quando a Configuração do Serviço Cognitivo não é definida durante a configuração da chamada. |
TranscriptionFailed | 400 | 8501 | A ação é inválida quando a chamada não está no estado Estabelecido. |
TranscriptionFailed | 401 | 8565 | Falha na ação devido a um erro de autenticação dos Serviços Cognitivos. Verifique sua entrada de autorização e confirme que ela está correta. |
TranscriptionFailed | 403 | 8565 | Falha na ação devido a uma solicitação proibida aos Serviços Cognitivos. Verifique o status da assinatura e verifique se ela está ativa. |
TranscriptionFailed | 429 | 8565 | Falha na ação, as solicitações excederam o número de solicitações simultâneas permitidas para a assinatura dos serviços cognitivos. |
TranscriptionFailed | 500 | 8578 | Falha na ação, não foi possível estabelecer a conexão WebSocket. |
TranscriptionFailed | 500 | 8580 | Falha na ação, o serviço de transcrição foi desligado. |
TranscriptionFailed | 500 | 8579 | Falha na ação, a transcrição foi cancelada. |
TranscriptionFailed | 500 | 9999 | Erro interno desconhecido do servidor. |
Problemas conhecidos
- No momento, não há suporte para chamadas 1:1 com usuários do ACS usando startTranscription = True de SDKs do cliente.