Exibir o estado de transcrição de chamada no cliente
Você precisa coletar o consentimento de todos os participantes na chamada antes de poder 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 ela foi iniciada antes de você ingressar na chamada ou na reunião. Você pode consentir explicitamente com a transcrição se uma reunião ou chamada exigir isso e você já tiver coletado esse consentimento.
Pré-requisitos
- Uma conta do Azure com uma assinatura ativa. Crie uma conta gratuitamente.
- Um recurso dos Serviços de Comunicação implantado. Crie um recurso dos Serviços de Comunicação.
- Um token de acesso de usuário para habilitar o cliente de chamada. Para saber mais, confira Criar e gerenciar token de acesso.
- Opcional: conclua o guia de início rápido para adicionar uma chamada de voz ao seu aplicativo
Suporte
As tabelas a seguir definem o suporte à transcrição de chamadas nos Serviços de Comunicação do Azure.
Identidades e tipos de chamadas
As tabelas a seguir mostram suporte à transcrição para o tipo de chamada e a identidade específicos.
Identidades | Reunião do Teams | Sala | Chamada 1:1 | Chamada em grupo | Chamada de interoperabilidade do Teams 1:1 | Chamada de interoperabilidade de Grupo do Teams |
---|---|---|---|---|---|---|
Usuário dos Serviços de Comunicação | ✔️ | ✔️ | ✔️ | |||
Usuário 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 | Usuário dos Serviços de Comunicação | Usuário do Microsoft 365 |
---|---|---|
Obter o evento em que a transcrição foi iniciada | ✔️ | ✔️ |
Obter status da transcrição | ✔️ | ✔️ |
Iniciar ou interromper a transcrição | ||
Saiba se o consentimento explícito é necessário | ✔️[1] | ✔️[1] |
Dar consentimento explícito para ser transcrito | ✔️[1] | ✔️[1] |
[1] Essa funcionalidade está disponível apenas para as reuniões do Teams e chamadas de interoperabilidade do Teams de grupo.
SDKs
As tabelas a seguir mostram suporte à transcrição em SDKs individuais dos Serviços de Comunicação do Azure.
Plataformas | Web | Interface do usuário da Web | iOS | Interface do usuário do iOS | Android | Interface do usuário do Android | Windows |
---|---|---|---|---|---|---|---|
Tem suporte | ✔️ | ✔️[1] | ✔️[1] | ✔️[1] | ✔️[1] | ✔️[1] | ✔️[1] |
[1] Esses SDKs não dão suporte ao consentimento explícito.
Instalar o SDK
Use o comando npm install
para instalar o SDK Comum e de Chamada 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 instância CallClient
é necessária para a maioria das operações de chamada. Ao criar uma instância de CallClient
, você pode configurá-la com opções personalizadas, como uma instância de Logger
.
Com a instância de CallClient
, você pode criar uma instância de CallAgent
chamando o createCallAgent
. Esse método retorna de modo assíncrono um objeto de instância CallAgent
.
O método createCallAgent
usa CommunicationTokenCredential
como um argumento. Ele aceita um token de acesso do usuário.
Você pode usar o método getDeviceManager
na instância CallClient
para acessar o 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()
Como gerenciar melhor a conectividade do SDK com a infraestrutura da Microsoft
A instância Call Agent
ajuda você a gerenciar chamadas (para ingressar ou iniciar chamadas). Para trabalhar, o SDK de chamada precisa se conectar à infraestrutura da Microsoft para receber notificações de chamadas de entrada e coordenar outros detalhes da chamada. O seu Call Agent
tem dois estados possíveis:
Conectado: um valor connectionStatue Call Agent
de Connected
significa que o SDK do cliente está conectado e capaz de receber notificações da infraestrutura da Microsoft.
Desconectado: um valor connectionStatue Call Agent
de Disconnected
declara que há um problema que está impedindo o SDK de se conectar corretamente. Call Agent
deve ser recriado.
invalidToken
: se um token tiver expirado ou for inválido, a instânciaCall Agent
se desconecta com este erro.connectionIssue
: se houver um problema com o cliente se conectando à infraestrutura da Microsoft, depois de muitas tentativasCall Agent
expõe o erroconnectionIssue
.
Você pode verificar se o local Call Agent
está conectado à infraestrutura da Microsoft inspecionando o valor atual da propriedade connectionState
. Durante uma chamada ativa, você pode ouvir o evento connectionStateChanged
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, o JavaScript chama SDKs com as versões 1.21 e anteriores, 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 o SDK de chamada para pelo menos a versão 1.22.
Transcrição de chamada
Transcription
é um recurso estendido da classe Call
. Primeiro, você precisa obter o objeto de API do recurso de transcrição
const callTranscriptionFeature = call.feature(Features.Transcription);
Você pode verificar o estado da transcrição na propriedade isTranscriptionActive
. Se o valor está definido como true
, a transcrição está ativa.
const isTranscriptionActive = callTranscriptionFeature.isTranscriptionActive;
Você pode assinar o evento que é disparado quando o estado da transcrição é alterado:
const isTranscriptionActiveChangedHandler = () => {
console.log(callTranscriptionFeature.isTranscriptionActive);
};
callTranscriptionFeature.on('isTranscriptionActiveChanged', isTranscriptionActiveChangedHandler);
Você pode cancelar a assinatura do evento com o seguinte código:
callTranscriptionFeature.off('isTranscriptionActiveChanged', isTranscriptionActiveChangedHandler);
Consentimento Explícito
Quando sua reunião ou chamada do Teams estiver configurada para exigir consentimento explícito para gravação ou transcrição, você precisará coletar o consentimento explícito dos seus usuários para permitir que os usuários sejam transcritos ou gravados. Você pode fornecer consentimento proativamente ao ingressar na reunião ou reativamente quando a gravação ou transcrição for iniciada. Até que o consentimento explícito seja dado, o áudio, vídeo e compartilhamento de tela dos participantes serão desabilitados 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
, o consentimento explícito será necessário para o call
.
const isTranscriptionConsentRequired = callTranscriptionFeature.isTeamsConsentRequired;
Se você já tiver obtido o consentimento do usuário para a transcrição, poderá chamar o método grantTeamsConsent()
para indicar o consentimento explícito para o serviço. Esse consentimento é válido apenas para uma sessão call
, e os usuários precisarão fornecer consentimento novamente se voltarem à reunião.
callTranscriptionFeature.grantTeamsConsent();
As tentativas de habilitar o compartilhamento de áudio, vídeo ou tela, falham quando a transcrição estiver ativa, o consentimento explícito for necessário, mas ainda não tenha sido fornecido. Você pode reconhecer essa situação verificando reason
da propriedade ParticipantCapabilities
da classe para os recursos turnVideoOn
, unmuteMic
e shareScreen
. Você pode encontrar esses recursos no recurso call.feature(Features.Capabilities)
. Esses recursos retornariam o motivo ExplicitConsentRequired
, pois os usuários precisam fornecer o consentimento explícito.
Instalar o SDK
Localize o arquivo build.gradle
de nível do projeto e adicione mavenCentral()
à lista de repositórios em buildscript
e allprojects
:
buildscript {
repositories {
...
mavenCentral()
...
}
}
allprojects {
repositories {
...
mavenCentral()
...
}
}
Em seguida, no arquivo build.gradle
no nível do módulo, adicione as seguintes linhas à seção dependencies
:
dependencies {
...
implementation 'com.azure.android:azure-communication-calling:1.0.0'
...
}
Inicializar objetos necessários
Para criar uma instância CallAgent
, você precisa chamar o método createCallAgent
em uma instância CallClient
. Essa chamada retorna de forma assíncrona um objeto de instância CallAgent
.
O método createCallAgent
usa CommunicationUserCredential
como argumento, que encapsula um token de acesso.
Para acessar DeviceManager
, você deverá criar uma instância callAgent
primeiro. Em seguida, você poderá usar o método CallClient.getDeviceManager
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 versão beta 1.1.0-beta.1 do SDK do Android de Chamada dos Serviços de Comunicação do Azure tem o isTranscriptionActive
e addOnIsTranscriptionActiveChangedListener
como parte do objeto Call
. Nas versões beta mais recentes, essas APIs foram movidas como um recurso estendido de Call
exatamente como 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
de propriedadecallTranscriptionFeature
. Ele retorna boolean
.
boolean isTranscriptionActive = callTranscriptionFeature.isTranscriptionActive();
Você também pode assinar alterações na transcrição:
private void handleCallOnIsTranscriptionChanged(PropertyChangedEvent args) {
boolean isTranscriptionActive = callTranscriptionFeature.isTranscriptionActive();
}
callTranscriptionFeature.addOnIsTranscriptionActiveChangedListener(handleCallOnIsTranscriptionChanged);
Configurar o backup do sistema
Siga essas etapas para configurar seu sistema.
Criar o projeto do Xcode
No Xcode, crie um projeto do iOS e selecione o modelo Aplicativo de Modo de Exibição Único. Como este artigo usa a estrutura SwiftUI, defina Linguagem como Swift e Interface como SwiftUI.
Você não criará testes neste artigo. Fique à vontade para limpar a caixa de seleção Incluir Testes.
Instalar o pacote e as dependências usando o CocoaPods
Crie um Podfile para seu aplicativo, como este exemplo:
platform :ios, '13.0' use_frameworks! target 'AzureCommunicationCallingSample' do pod 'AzureCommunicationCalling', '~> 1.0.0' end
Execute
pod install
.Abra o
.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 aplicativo usando NSMicrophoneUsageDescription
. Defina o valor associado como uma cadeia de caracteres incluída na caixa de diálogo que é usada pelo sistema para solicitar o acesso do usuário.
Clique com o botão direito do mouse na entrada Info.plist da árvore de projeto e selecione Abrir Como>Código-Fonte. Adicione as linhas a seguir na seção do nível superior<dict>
e, em seguida, salve o arquivo.
<key>NSMicrophoneUsageDescription</key>
<string>Need microphone access for VOIP calling.</string>
Configurar o framework de aplicativos
Abra o arquivo ContentView.swift
do projeto. Adicione uma declaração import
à parte superior do arquivo para importar a biblioteca AzureCommunicationCalling
. Além disso, importeAVFoundation
. Você precisa dele para solicitações de permissão de áudio no código.
import AzureCommunicationCalling
import AVFoundation
Inicialização do CallAgent
Para criar umaCallAgent
instânciaCallClient
,você precisa usar um método callClient.createCallAgent
que retorne de modo assíncrono um objetoCallAgent
depois que ele for inicializado.
Para criar um cliente de chamada, passe um 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)
}
Transmita o objeto CommunicationTokenCredential
que você criou para CallClient
e defina o nome de 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, o SDK do iOS de chamadas dos Serviços de Comunicação do Azure tem o isTranscriptionActive
como parte do objeto Call
, e o didChangeTranscriptionState
como parte do CallDelegate
delegado. Nas versões beta mais recentes, essas APIs foram movidas como um recurso estendido de Call
exatamente como 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á sendo transcrita, inspecione a propriedade isTranscriptionActive
de callTranscriptionFeature
. Ele retorna Bool
.
let isTranscriptionActive = callTranscriptionFeature.isTranscriptionActive;
Você também pode assinar as alterações de transcrições implementando o 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
}
Configurar o backup do sistema
Siga essas etapas para configurar seu sistema.
Criar o projeto do Visual Studio
Para um aplicativo da Plataforma Universal do Windows, no Visual Studio 2022, crie um projeto de Aplicativo em branco (Universal do Windows). Depois de inserir o nome do projeto, fique à 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. O SDK do Aplicativo do Windows versão 1.3 ou posterior é necessário.
Instalar o pacote e as dependências usando o Gerenciador de Pacotes do NuGet
As bibliotecas e as APIs 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, faça o seguinte:
- Abra o Gerenciador de Pacotes do NuGet selecionando Ferramentas>Gerenciador de Pacotes do NuGet>Gerenciar de Pacotes do NuGet para Solução.
- Selecione Procurar e insira Azure.Communication.Calling.WindowsClient na caixa de pesquisa.
- Verifique se a caixa de seleção Incluir pré-lançamento está marcada.
- Selecione o pacote Azure.Communication.Calling.WindowsClient e Azure.Communication.Calling.WindowsClient 1.4.0-beta.1 ou uma versão mais recente.
- Marque a caixa de seleção que corresponde ao projeto dos Serviços de Comunicação do Azure no painel direito.
- 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
de propriedadetranscriptionFeature
. Ele retorna boolean
.
boolean isTranscriptionActive = transcriptionFeature.isTranscriptionActive;
Você também pode assinar alterações na transcrição:
private async void Call__OnIsTranscriptionActiveChanged(object sender, PropertyChangedEventArgs args)
boolean isTranscriptionActive = transcriptionFeature.IsTranscriptionActive();
}
transcriptionFeature.IsTranscriptionActiveChanged += Call__OnIsTranscriptionActiveChanged;