Compartir vía


Visualización del estado de transcripción de llamadas en el cliente

Debe recabar el consentimiento de todos los participantes de la llamada antes de poder transcribirla. Microsoft Teams permite a los usuarios iniciar la transcripción en las reuniones o llamadas. Recibirá un evento cuando se haya iniciado la transcripción. Puede comprobar el estado de transcripción si la transcripción se inició antes de unirse a la llamada o reunión. Puede proporcionar consentimiento explícito para la transcripción si una reunión o llamada la requiere y ya la ha recopilado.

Requisitos previos

Soporte técnico

En las tablas siguientes se define la compatibilidad con la transcripción de llamadas en Azure Communication Services.

Identidades y tipos de llamadas

En las tablas siguientes se muestra la compatibilidad de la transcripción para un tipo de llamada y una identidad específicos.

Identidades Reuniones en Teams Sala Llamada 1:1 Llamada grupal Llamada de interoperabilidad de Teams individual Llamada de interoperabilidad de Teams de grupo
Usuario de Communication Services ✔️ ✔️ ✔️
Usuario de Microsoft 365 ✔️ ✔️ ✔️

Operations

En las tablas siguientes se muestra la compatibilidad de las API individuales en el SDK de llamadas a tipos de identidad individuales.

Operations Usuario de Communication Services Usuario de Microsoft 365
Obtención del evento de que se ha iniciado la transcripción ✔️ ✔️
Obtención del estado de la transcripción ✔️ ✔️
Inicio o detención de la transcripción
Obtenga información sobre si se requiere consentimiento explícito ✔️[1] ✔️[1]
Dar consentimiento explícito para ser transcrito ✔️[1] ✔️[1]

[1] Esta funcionalidad solo está disponible en reuniones de Teams y llamadas de interoperabilidad de Teams.

SDK

En las tablas siguientes se muestra la compatibilidad con la transcripción en los SDK de Azure Communication Services individuales.

Platforms Web IU Web iOS Interfaz de usuario de iOS Android UI de Android Windows
Se admite ✔️ ✔️[1] ✔️[1] ✔️[1] ✔️[1] ✔️[1] ✔️[1]

[1] Estos SDK no admiten el consentimiento explícito.

Instalación del SDK

Use el comando npm install para instalar los SDK comunes y de llamada de Azure Communication Services para JavaScript:

npm install @azure/communication-common --save
npm install @azure/communication-calling --save

Inicialización de los objetos necesarios

Se requiere una instancia de CallClient para la mayoría de las operaciones de llamada. Al crear una nueva instancia de CallClient, puede configurarla con opciones personalizadas, como una instancia de Logger.

Con la instancia de CallClient, puede crear una instancia de CallAgent llamando al createCallAgent. Este método devuelve un objeto de instancia CallAgent de manera asincrónica.

El método createCallAgent utiliza CommunicationTokenCredential como argumento. Acepta un token de acceso de usuario.

Puede usar el método getDeviceManager en la instancia de CallClient para acceder a deviceManager.

const { CallClient } = require('@azure/communication-calling');
const { AzureCommunicationTokenCredential} = require('@azure/communication-common');
const { AzureLogger, setLogLevel } = require("@azure/logger");

// Set the logger's log level
setLogLevel('verbose');

// Redirect log output to console, file, buffer, REST API, or whatever location you want
AzureLogger.log = (...args) => {
    console.log(...args); // Redirect log output to console
};

const userToken = '<USER_TOKEN>';
callClient = new CallClient(options);
const tokenCredential = new AzureCommunicationTokenCredential(userToken);
const callAgent = await callClient.createCallAgent(tokenCredential, {displayName: 'optional Azure Communication Services user name'});
const deviceManager = await callClient.getDeviceManager()

Cuál es la mejor forma de administrar la conectividad del SDK en la infraestructura de Microsoft

La instancia de Call Agent le ayuda a administrar llamadas (para unirse o iniciar llamadas). Para trabajar con el SDK de llamadas, debe conectarse a la infraestructura de Microsoft para obtener notificaciones de llamadas entrantes y coordinar otros detalles de la llamada. Call Agent tiene dos posibles estados:

Conectado: un valor connectionStatue Call Agent con estado Connected significa que el SDK de cliente está conectado y es capaz de recibir notificaciones de la infraestructura de Microsoft.

Desconectado: un valor connectionStatue Call Agent con estado Disconnected indica que hay un problema que impide que el SDK se conecte correctamente. Call Agent se debe volver a crear.

  • invalidToken: si un token ha expirado o no es válido, la instancia de Call Agent se desconecta con este error.
  • connectionIssue: si hay un problema cuando el cliente se conecta a la infraestructura de Microsoft, después de muchos reintentos, Call Agent expone el error connectionIssue.

Para comprobar si el Call Agent local está conectado a la infraestructura de Microsoft, inspeccione el valor actual de la propiedad connectionState. Durante una llamada activa, puede escuchar el evento connectionStateChanged para determinar si Call Agent cambia de Conectado a Desconectado.

const connectionState = callAgentInstance.connectionState;
console.log(connectionState); // it may return either of 'Connected' | 'Disconnected'

const connectionStateCallback = (args) => {
    console.log(args); // it will return an object with oldState and newState, each of having a value of either of 'Connected' | 'Disconnected'
    // it will also return reason, either of 'invalidToken' | 'connectionIssue'
}
callAgentInstance.on('connectionStateChanged', connectionStateCallback);

Advertencia

Debido a los cambios en Microsoft Teams, los SDK de llamadas de JavaScript con versiones 1.21 y inferiores detienen la transcripción de Teams e impiden que los usuarios de Teams inicien la transcripción. Si quiere aprovechar la transcripción de Teams en las llamadas y reuniones, debe actualizar el SDK de llamadas al menos a la versión 1.22.

Transcripción de llamadas

Transcription es una característica extendida de la clase Call. Primero debe obtener el objeto de la API de característica de transcripción:

const callTranscriptionFeature = call.feature(Features.Transcription);

Puede comprobar el estado de la transcripción en la propiedad isTranscriptionActive. Si el valor se establece en true, la transcripción está activa.

const isTranscriptionActive = callTranscriptionFeature.isTranscriptionActive;

Puede suscribirse al evento que se desencadena cuando cambia el estado de la transcripción:

const isTranscriptionActiveChangedHandler = () => {
  console.log(callTranscriptionFeature.isTranscriptionActive);
};
callTranscriptionFeature.on('isTranscriptionActiveChanged', isTranscriptionActiveChangedHandler);

Puede cancelar la suscripción del evento con el código siguiente:

callTranscriptionFeature.off('isTranscriptionActiveChanged', isTranscriptionActiveChangedHandler);

Cuando la reunión o llamada de Teams está configurada para requerir consentimiento explícito para la grabación o transcripción, es necesario recopilar consentimiento explícito de los usuarios para permitir que los usuarios se transcriban o grabe. Puede proporcionar consentimiento de forma proactiva al unirse a la reunión o reactivamente cuando se inicia la grabación o transcripción. Hasta que se dé consentimiento explícito, el audio, el vídeo y el uso de pantalla compartida de los participantes se deshabilitarán durante la transcripción.

Puede comprobar si la transcripción de reuniones requiere consentimiento explícito por propiedad isTeamsConsentRequired. Si el valor se establece en true, se requiere consentimiento explícito para el call.

const isTranscriptionConsentRequired = callTranscriptionFeature.isTeamsConsentRequired;

Si ya ha obtenido el consentimiento del usuario para la transcripción, puede llamar al método grantTeamsConsent() para indicar el consentimiento explícito al servicio. Este consentimiento es válido solo para una sesión de call y los usuarios deben volver a proporcionar consentimiento si se vuelven a unir a la reunión.

callTranscriptionFeature.grantTeamsConsent();

Se produce un error en los intentos de habilitar el uso compartido de audio, vídeo o pantalla cuando la transcripción está activa, se requiere consentimiento explícito, pero aún no se ha dado. Puede reconocer esta situación comprobando la de propiedades reasonde clase ParticipantCapabilities para funcionalidades turnVideoOn, unmuteMic y shareScreen. Puede encontrar esas funcionalidades en la característica call.feature(Features.Capabilities). Esas funcionalidades devolverían el motivo ExplicitConsentRequired, ya que los usuarios necesitan proporcionar consentimiento explícito.

Instalación del SDK

Busque el archivo build.gradle de nivel de proyecto y agregue mavenCentral() a la lista de repositorios en buildscript y allprojects:

buildscript {
    repositories {
    ...
        mavenCentral()
    ...
    }
}
allprojects {
    repositories {
    ...
        mavenCentral()
    ...
    }
}

Luego, en el archivo build.gradle de nivel de módulo, agregue las siguientes líneas a la sección dependencies:

dependencies {
    ...
    implementation 'com.azure.android:azure-communication-calling:1.0.0'
    ...
}

Inicialización de los objetos necesarios

Para crear una instancia de CallAgent, debe llamar al método createCallAgent en una instancia de CallClient. Esta llamada devuelve un objeto de instancia de CallAgent de manera asincrónica.

El método createCallAgent toma CommunicationUserCredential como argumento, que encapsula un token de acceso.

Para acceder a DeviceManager, primero debe crear una instancia de callAgent. A continuación, puede usar el método CallClient.getDeviceManager para obtener DeviceManager.

String userToken = '<user token>';
CallClient callClient = new CallClient();
CommunicationTokenCredential tokenCredential = new CommunicationTokenCredential(userToken);
android.content.Context appContext = this.getApplicationContext(); // From within an activity, for instance
CallAgent callAgent = callClient.createCallAgent(appContext, tokenCredential).get();
DeviceManager deviceManager = callClient.getDeviceManager(appContext).get();

Para establecer un nombre para mostrar para el autor de la llamada, use este método alternativo:

String userToken = '<user token>';
CallClient callClient = new CallClient();
CommunicationTokenCredential tokenCredential = new CommunicationTokenCredential(userToken);
android.content.Context appContext = this.getApplicationContext(); // From within an activity, for instance
CallAgentOptions callAgentOptions = new CallAgentOptions();
callAgentOptions.setDisplayName("Alice Bob");
DeviceManager deviceManager = callClient.getDeviceManager(appContext).get();
CallAgent callAgent = callClient.createCallAgent(appContext, tokenCredential, callAgentOptions).get();

Advertencia

Hasta la versión 1.1.0 y la versión beta 1.1.0-beta.1 de llamadas de Azure Communication Services, Android SDK tiene isTranscriptionActive y addOnIsTranscriptionActiveChangedListener como parte del objeto Call. En el caso de las versiones beta nuevas, esas API se movieron como una característica extendida de Call, tal como se describe a continuación.

La transcripción de llamadas es una característica extendida del objeto Call principal. Primero debe obtener el objeto de la característica de transcripción:

TranscriptionCallFeature callTranscriptionFeature = call.feature(Features.TRANSCRIPTION);

Luego, a fin de comprobar si se está transcribiendo la llamada, revise la propiedad isTranscriptionActive de callTranscriptionFeature. Devuelve boolean.

boolean isTranscriptionActive = callTranscriptionFeature.isTranscriptionActive();

También puede suscribirse a los cambios en la transcripción:

private void handleCallOnIsTranscriptionChanged(PropertyChangedEvent args) {
    boolean isTranscriptionActive = callTranscriptionFeature.isTranscriptionActive();
}

callTranscriptionFeature.addOnIsTranscriptionActiveChangedListener(handleCallOnIsTranscriptionChanged);

Configuración del sistema

Siga estos pasos para configurar el sistema.

Creación del proyecto de Xcode

En Xcode, cree un nuevo proyecto de iOS y seleccione la plantilla Aplicación de una vista. En este artículo se usa el marco SwiftUI, por lo que debe establecer el Lenguaje en Swift y la Interfaz en SwiftUI.

No va a crear pruebas en este artículo. Puede desactivar la casilla Incluir pruebas.

Captura de pantalla que muestra la ventana para crear un proyecto en Xcode.

Instalación del paquete y las dependencias mediante CocoaPods

  1. Cree un Podfile para la aplicación, como en este ejemplo:

    platform :ios, '13.0'
    use_frameworks!
    target 'AzureCommunicationCallingSample' do
        pod 'AzureCommunicationCalling', '~> 1.0.0'
    end
    
  2. Ejecute pod install.

  3. Abra .xcworkspace mediante Xcode.

Solicitud de acceso al micrófono

Para acceder al micrófono del dispositivo, debe actualizar la lista de propiedades de información de la aplicación mediante NSMicrophoneUsageDescription. Establezca el valor asociado en una cadena que se incluye en el cuadro de diálogo empleado por el sistema para solicitar acceso al usuario.

Haga clic con el botón derecho en la entrada Info.plist del árbol del proyecto y seleccione Abrir como>Código fuente. Agregue las líneas siguientes a la sección <dict> de nivel superior y guarde el archivo.

<key>NSMicrophoneUsageDescription</key>
<string>Need microphone access for VOIP calling.</string>

Instalación del marco de la aplicación

Abra el archivo ContentView.swift del proyecto. Agregue una declaración import a la parte superior del archivo para importar la biblioteca AzureCommunicationCalling. Además, importe AVFoundation. Lo necesitará para las solicitudes de permiso de audio en el código.

import AzureCommunicationCalling
import AVFoundation

Inicialización de CallAgent

Para crear una instancia de CallAgent a partir de CallClient, debe usar el método callClient.createCallAgent, que devuelve de manera asincrónica un objeto CallAgent después de que se inicializa.

Para crear un cliente de llamada, pase un objeto CommunicationTokenCredential:

import AzureCommunication

let tokenString = "token_string"
var userCredential: CommunicationTokenCredential?
do {
    let options = CommunicationTokenRefreshOptions(initialToken: token, refreshProactively: true, tokenRefresher: self.fetchTokenSync)
    userCredential = try CommunicationTokenCredential(withOptions: options)
} catch {
    updates("Couldn't created Credential object", false)
    initializationDispatchGroup!.leave()
    return
}

// tokenProvider needs to be implemented by Contoso, which fetches a new token
public func fetchTokenSync(then onCompletion: TokenRefreshOnCompletion) {
    let newToken = self.tokenProvider!.fetchNewToken()
    onCompletion(newToken, nil)
}

Pase el objeto CommunicationTokenCredential que ha creado a CallClient y establezca el nombre para mostrar:

self.callClient = CallClient()
let callAgentOptions = CallAgentOptions()
options.displayName = " iOS Azure Communication Services User"

self.callClient!.createCallAgent(userCredential: userCredential!,
    options: callAgentOptions) { (callAgent, error) in
        if error == nil {
            print("Create agent succeeded")
            self.callAgent = callAgent
        } else {
            print("Create agent failed")
        }
})

Advertencia

Hasta la versión 1.1.0 y la versión beta 1.1.0-beta.1 de llamadas de Azure Communication Services, el SDK de iOS tiene isTranscriptionActive como parte del objeto Call y didChangeTranscriptionState es parte del delegado CallDelegate. En el caso de las versiones beta nuevas, esas API se movieron como una característica extendida de Call, tal como se describe a continuación.

La transcripción de llamadas es una característica extendida del objeto Call principal. Primero debe obtener el objeto de la característica de transcripción:

let callTranscriptionFeature = call.feature(Features.transcription)

Luego, a fin de comprobar si se transcribe la llamada, revise la propiedad isTranscriptionActive de callTranscriptionFeature. Devuelve Bool.

let isTranscriptionActive = callTranscriptionFeature.isTranscriptionActive;

También puede suscribirse a los cambios de transcripción mediante la implementación del delegado TranscriptionCallFeatureDelegate en la clase con el evento didChangeTranscriptionState:

callTranscriptionFeature.delegate = self

// didChangeTranscriptionState is a member of TranscriptionCallFeatureDelegate
public func transcriptionCallFeature(_ transcriptionCallFeature: TranscriptionCallFeature, didChangeTranscriptionState args: PropertyChangedEventArgs) {
    let isTranscriptionActive = callTranscriptionFeature.isTranscriptionActive
}

Configuración del sistema

Siga estos pasos para configurar el sistema.

Creación del proyecto de Visual Studio

En el caso de una aplicación para la Plataforma universal de Windows, en Visual Studio 2022, cree un proyecto de Aplicación vacía (Universal Windows). Después de escribir el nombre del proyecto, puede elegir cualquier Windows SDK posterior a 10.0.17763.0.

En el caso de una aplicación WinUI 3, cree un nuevo proyecto con la plantilla Aplicación vacía, empaquetada (WinUI 3 en escritorio) para configurar una aplicación WinUI 3 de una sola página. Se requiere la versión 1.3 o posterior del SDK de aplicaciones de Windows.

Instalación del paquete y las dependencias mediante el Administrador de paquetes NuGet

Las API y bibliotecas de SDK de llamadas están disponibles públicamente a través de un paquete NuGet.

Para buscar, descargar e instalar el paquete NuGet del SDK de llamadas:

  1. Abra el Administrador de paquetes NuGet desde Herramientas>Administrador de paquetes NuGet>Administrar paquetes NuGet para la solución.
  2. Seleccione Explorar y, después, escriba Azure.Communication.Calling.WindowsClient en el cuadro de búsqueda.
  3. Asegúrese de que la casilla Incluir versión preliminar esté activada.
  4. Seleccione el paquete Azure.Communication.Calling.WindowsClient y, después, Azure.Communication.Calling.WindowsClient 1.4.0-beta.1 o una versión más reciente.
  5. Seleccione la casilla correspondiente al proyecto de Azure Communication Services en el panel derecho.
  6. Seleccione Instalar.

La transcripción de llamadas es una característica extendida del objeto Call principal. Primero debe obtener el objeto de la característica de transcripción:

TranscriptionCallFeature transcriptionFeature = call.Features.Transcription;

Luego, a fin de comprobar si se está transcribiendo la llamada, revise la propiedad IsTranscriptionActive de transcriptionFeature. Devuelve boolean.

boolean isTranscriptionActive = transcriptionFeature.isTranscriptionActive;

También puede suscribirse a los cambios en la transcripción:

private async void Call__OnIsTranscriptionActiveChanged(object sender, PropertyChangedEventArgs args)
    boolean isTranscriptionActive = transcriptionFeature.IsTranscriptionActive();
}

transcriptionFeature.IsTranscriptionActiveChanged += Call__OnIsTranscriptionActiveChanged;

Pasos siguientes