Partilhar via


Exibir o estado de transcrição da chamada no cliente

Você precisa coletar o consentimento de todos os participantes da chamada antes de transcrevê-los. O Microsoft Teams permite que os usuários iniciem a transcrição nas reuniões ou chamadas. Você receberá o evento quando a transcrição for iniciada. Você pode verificar o estado da transcrição se a transcrição começou antes de entrar na chamada ou reunião. Pode dar consentimento explícito à transcrição se uma reunião ou chamada o exigir e já a tiver recolhido.

Pré-requisitos

Suporte

As tabelas a seguir definem o suporte à transcrição de chamadas nos Serviços de Comunicação do Azure.

Identidades e tipos de chamada

As tabelas a seguir mostram o suporte à transcrição para tipo de chamada e identidade específicos.

Identidades Reunião de equipas Sala Chamada 1:1 Chamada em grupo Chamada de interoperabilidade 1:1 das equipes Chamada de interoperabilidade de equipes de grupo
Utilizador dos Serviços de Comunicação ✔️ ✔️ ✔️
Utilizador do Microsoft 365 ✔️ ✔️ ✔️

Operações

As tabelas a seguir mostram o suporte de APIs individuais na chamada do SDK para tipos de identidade individuais.

Operações Utilizador dos Serviços de Comunicação Utilizador do Microsoft 365
Obter evento em que a transcrição foi iniciada ✔️ ✔️
Obter estado de transcrição ✔️ ✔️
Iniciar ou parar a transcrição
Saiba se é necessário consentimento explícito ✔️ [1] ✔️ [1]
Dar consentimento explícito para ser transcrito ✔️ [1] ✔️ [1]

[1] Esta funcionalidade está disponível apenas em reuniões do Teams e chamadas de interoperabilidade do Teams em grupo.

SDKs

As tabelas a seguir mostram o suporte à transcrição em SDKs individuais dos Serviços de Comunicação do Azure.

Plataformas Web IU da Web iOS Interface do usuário do iOS Android Interface do usuário do Android Windows
É suportado ✔️ ✔️ [1] ✔️ [1] ✔️ [1] ✔️ [1] ✔️ [1] ✔️ [1]

[1] Estes SDKs não suportam consentimento explícito.

Instale o SDK

Use o npm install comando para instalar o SDK de Chamada e Comum dos Serviços de Comunicação do Azure para JavaScript:

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

Inicializar objetos necessários

Uma CallClient instância é necessária para a maioria das operações de chamada. Ao criar uma nova CallClient instância, você pode configurá-la com opções personalizadas, como uma Logger instância.

Com a CallClient instância, você pode criar uma CallAgent instância chamando o createCallAgentarquivo . Esse método retorna de forma assíncrona um objeto de CallAgent instância.

O createCallAgent método usa CommunicationTokenCredential como argumento. Ele aceita um token de acesso de usuário.

Você pode usar o getDeviceManager método na CallClient instância para acessar deviceManagero .

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()

Como gerenciar melhor a conectividade do SDK com a infraestrutura da Microsoft

A Call Agent instância ajuda você a gerenciar chamadas (para ingressar ou iniciar chamadas). Para funcionar, seu SDK de chamada precisa se conectar à infraestrutura da Microsoft para receber notificações de chamadas recebidas e coordenar outros detalhes da chamada. O seu Call Agent tem dois estados possíveis:

Conectado - Um Call Agent valor connectionStatue significa que o SDK do Connected cliente está conectado e é capaz de receber notificações da infraestrutura da Microsoft.

Desconectado - Um Call Agent valor connectionStatue de Disconnected estados há um problema que está impedindo o SDK de se conectar corretamente. Call Agent devem ser recriados.

  • invalidToken: Se um token expirou ou é inválido Call Agent , a instância se desconecta com esse erro.
  • connectionIssue: Se houver um problema com o cliente se conectando à infrascture da Microsoft, depois de muitas tentativas Call Agent expõe o connectionIssue erro.

Você pode verificar se seu local Call Agent está conectado à infraestrutura da Microsoft inspecionando o valor atual da connectionState propriedade. Durante uma chamada ativa, você pode ouvir o connectionStateChanged evento para determinar se Call Agent muda do estado Conectado para 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);

Aviso

Devido a alterações no Microsoft Teams, JavaScript chamando SDKs com versões 1.21 e inferiores interrompe a transcrição do Teams e bloqueia os usuários do Teams para iniciar a transcrição. Se você quiser aproveitar a transcrição do Teams nas chamadas e reuniões, precisará atualizar seu SDK de chamadas para pelo menos a versão 1.22.

Transcrição de chamadas

Transcription é um recurso estendido da classe Call. Primeiro, você precisa obter o objeto da API do recurso de transcrição

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

Você pode verificar o estado da transcrição na propriedade isTranscriptionActive. Se value for definido como true, a transcrição estará ativa.

const isTranscriptionActive = callTranscriptionFeature.isTranscriptionActive;

Você pode se inscrever no evento que é acionado quando o estado da transcrição é alterado:

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

Pode cancelar a subscrição do evento com o seguinte código:

callTranscriptionFeature.off('isTranscriptionActiveChanged', isTranscriptionActiveChangedHandler);

Quando sua reunião ou chamada do Teams é configurada para exigir consentimento explícito para gravação ou transcrição, você é obrigado a coletar consentimento explícito de seus usuários para permitir que os usuários sejam transcritos ou gravados. Você pode fornecer consentimento proativamente ao participar da reunião ou reativamente quando a gravação ou transcrição for iniciada. Até que o consentimento explícito seja dado, o áudio, o vídeo e o compartilhamento de tela dos participantes serão desativados durante a transcrição.

Você pode verificar se a transcrição da reunião requer consentimento explícito por propriedade isTeamsConsentRequired. Se o valor for definido como true, é necessário o consentimento explícito para o call.

const isTranscriptionConsentRequired = callTranscriptionFeature.isTeamsConsentRequired;

Se você já obteve o consentimento do usuário para a transcrição, você pode chamar o grantTeamsConsent() método para indicar consentimento explícito para o serviço. Esse consentimento é válido apenas para uma call sessão e os usuários precisam fornecer consentimento novamente se voltarem a participar da reunião.

callTranscriptionFeature.grantTeamsConsent();

As tentativas de ativar o compartilhamento de áudio, vídeo ou tela falham quando a transcrição está ativa, o consentimento explícito é necessário, mas ainda não foi dado. Você pode reconhecer essa situação verificando a propriedade reason da classe ParticipantCapabilities para recursos unmuteMic turnVideoOne shareScreen. Você pode encontrar esses recursos no recurso call.feature(Features.Capabilities). Esses recursos retornariam a razão ExplicitConsentRequired , pois os usuários precisam fornecer consentimento explícito.

Instale o SDK

Localize seu arquivo no nível build.gradle do projeto e adicione mavenCentral() à lista de repositórios em buildscript e allprojects:

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

Em seguida, no arquivo de nível build.gradle de módulo, adicione as seguintes linhas à dependencies seção:

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

Inicializar os objetos necessários

Para criar uma CallAgent instância, você precisa chamar o createCallAgent método em uma CallClient instância. Essa chamada retorna de forma assíncrona um objeto de CallAgent instância.

O createCallAgent método toma CommunicationUserCredential como um argumento, que encapsula um token de acesso.

Para acessar DeviceManagero , você deve criar uma callAgent instância primeiro. Então você pode usar o CallClient.getDeviceManager método para obter 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 definir um nome de exibição para o chamador, 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();

Aviso

Até a versão 1.1.0 e a versão beta 1.1.0-beta.1 do SDK do Azure Communication Services Calling Android tem o isTranscriptionActive e addOnIsTranscriptionActiveChangedListener fazem parte do Call objeto. Para novas versões beta, essas APIs foram movidas como um recurso estendido como Call descrito abaixo.

A transcrição de chamadas é um recurso estendido do objeto principal Call . Primeiro, você precisa obter o objeto do recurso de transcrição:

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

Em seguida, para verificar se a chamada está sendo transcrita, inspecione a isTranscriptionActive propriedade de callTranscriptionFeature. Ele retorna boolean.

boolean isTranscriptionActive = callTranscriptionFeature.isTranscriptionActive();

Também pode subscrever alterações na transcrição:

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

callTranscriptionFeature.addOnIsTranscriptionActiveChangedListener(handleCallOnIsTranscriptionChanged);

Configure o seu sistema

Siga estes passos para configurar o seu sistema.

Criar o projeto Xcode

No Xcode, crie um novo projeto iOS e selecione o modelo Single View App . Este artigo usa a estrutura SwiftUI, portanto, você deve definir Language como Swift e Interface como SwiftUI.

Você não vai criar testes neste artigo. Sinta-se à vontade para desmarcar a caixa de seleção Incluir testes .

Captura de tela que mostra a janela para criar um projeto no Xcode.

Instale o pacote e as dependências usando o CocoaPods

  1. Crie um Podfile para seu aplicativo, como este exemplo:

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

  3. Abra .xcworkspace usando o Xcode.

Solicitar acesso ao microfone

Para acessar o microfone do dispositivo, você precisa atualizar a lista de propriedades de informações do seu aplicativo usando NSMicrophoneUsageDescription. Defina o valor associado para uma cadeia de caracteres incluída na caixa de diálogo que o sistema usa para solicitar acesso do usuário.

Clique com o botão direito do mouse na entrada Info.plist da árvore do projeto e selecione Abrir como>código-fonte. Adicione as seguintes linhas na secção de nível <dict> superior e, em seguida, guarde o ficheiro.

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

Configurar a estrutura do aplicativo

Abra o arquivo do ContentView.swift seu projeto. Adicione uma import declaração à parte superior do arquivo para importar a AzureCommunicationCalling biblioteca. Além disso, importe AVFoundation. Você precisa dele para solicitações de permissão de áudio no código.

import AzureCommunicationCalling
import AVFoundation

Inicializar o CallAgent

Para criar uma CallAgent instância a partir do CallClient, você precisa usar um callClient.createCallAgent método que retorna de forma assíncrona um CallAgent objeto depois que ele é inicializado.

Para criar um cliente de chamada, passe um CommunicationTokenCredential objeto:

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)
}

Passe o CommunicationTokenCredential objeto que você criou para CallCliente defina o nome para exibição:

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")
        }
})

Aviso

Até a versão 1.1.0 e a versão beta 1.1.0-beta.1 do SDK do iOS de Chamada dos Serviços de Comunicação do Azure tem o isTranscriptionActive como parte do Call objeto e didChangeTranscriptionState faz parte do CallDelegate delegado. Para novas versões beta, essas APIs foram movidas como um recurso estendido como Call descrito abaixo.

A transcrição de chamadas é um recurso estendido do objeto principal Call . Primeiro, você precisa obter o objeto do recurso de transcrição:

let callTranscriptionFeature = call.feature(Features.transcription)

Em seguida, para verificar se a chamada está transcrita, inspecione a isTranscriptionActive propriedade de callTranscriptionFeature. Ele retorna Bool.

let isTranscriptionActive = callTranscriptionFeature.isTranscriptionActive;

Você também pode se inscrever para alterações de transcrição implementando TranscriptionCallFeatureDelegate delegado em sua classe com o evento didChangeTranscriptionState:

callTranscriptionFeature.delegate = self

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

Configure o seu sistema

Siga estes passos para configurar o seu sistema.

Criar o projeto do Visual Studio

Para um aplicativo da Plataforma Universal do Windows, no Visual Studio 2022, crie um novo projeto Aplicativo em Branco (Universal Windows). Depois de inserir o nome do projeto, sinta-se à vontade para escolher qualquer SDK do Windows posterior a 10.0.17763.0.

Para um aplicativo WinUI 3, crie um novo projeto com o modelo Aplicativo em branco, empacotado (WinUI 3 na área de trabalho) para configurar um aplicativo WinUI 3 de página única. É necessário o SDK de Aplicativos Windows versão 1.3 ou posterior.

Instalar o pacote e as dependências usando o Gerenciador de Pacotes NuGet

As APIs e bibliotecas do SDK de chamada estão disponíveis publicamente por meio de um pacote NuGet.

Para localizar, baixar e instalar o pacote NuGet do SDK de chamada:

  1. Abra o Gerenciador de Pacotes NuGet selecionando Ferramentas>Gerenciador>de Pacotes NuGet Gerenciar Pacotes NuGet para Solução.
  2. Selecione Procurar e digite Azure.Communication.Calling.WindowsClient na caixa de pesquisa.
  3. Verifique se a caixa de seleção Incluir pré-lançamento está marcada.
  4. Selecione o pacote Azure.Communication.Calling.WindowsClient e, em seguida, selecione Azure.Communication.Calling.WindowsClient 1.4.0-beta.1 ou uma versão mais recente.
  5. Marque a caixa de seleção que corresponde ao projeto dos Serviços de Comunicação do Azure no painel direito.
  6. Selecione Instalar.

A transcrição de chamadas é um recurso estendido do objeto principal Call . Primeiro, você precisa obter o objeto do recurso de transcrição:

TranscriptionCallFeature transcriptionFeature = call.Features.Transcription;

Em seguida, para verificar se a chamada está sendo transcrita, inspecione a IsTranscriptionActive propriedade de transcriptionFeature. Ele retorna boolean.

boolean isTranscriptionActive = transcriptionFeature.isTranscriptionActive;

Também pode subscrever alterações na transcrição:

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

transcriptionFeature.IsTranscriptionActiveChanged += Call__OnIsTranscriptionActiveChanged;

Próximos passos