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
- Uma conta do Azure com uma subscrição ativa. Crie uma conta gratuitamente.
- Um recurso de Serviços de Comunicação implantado. Crie um recurso de Serviços de Comunicação.
- Um token de acesso de usuário para habilitar o cliente chamador. Para obter mais informações, consulte Criar e gerenciar tokens de acesso.
- Opcional: conclua o início rápido para adicionar chamadas 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 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 createCallAgent
arquivo . 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 deviceManager
o .
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álidoCall 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 tentativasCall Agent
expõe oconnectionIssue
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);
Consentimento explícito
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
turnVideoOn
e 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 DeviceManager
o , 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 .
Instale 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 o
pod install
.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 CallClient
e 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:
- Abra o Gerenciador de Pacotes NuGet selecionando Ferramentas>Gerenciador>de Pacotes NuGet Gerenciar Pacotes NuGet para Solução.
- Selecione Procurar e digite 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, em seguida, selecione 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
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;