Поделиться через


Отображение состояния транскрибирования вызовов на клиенте

Прежде чем вы сможете транскрибировать их, необходимо получить согласие от всех участников звонка. Microsoft Teams позволяет пользователям запускать транскрибирование в собраниях или звонках. При запуске транскрибирования вы получаете событие. Вы можете проверить состояние транскрипции, если она была начата до вашего присоединения к звонку или встрече. Вы можете предоставить явное согласие на расшифровку, если расшифровка требуется для собрания или звонка и вы уже его собрали.

Предпосылки

Поддержка

В следующих таблицах определяется поддержка транскрибирования вызовов в Службах коммуникации Azure.

Идентичности и типы вызовов

В следующих таблицах показана поддержка транскрибирования для конкретного типа вызова и идентификатора.

Идентичности Совещание в "Teams" Комната Личный разговор 1:1 Групповой звонок Вызов для взаимодействия команд в режиме 1:1 Вызов взаимодействия в группах Teams
пользователь Служб связи ✔️ ✔️ ✔️
Пользователь Microsoft 365 ✔️ ✔️ ✔️

Операции

В следующих таблицах показана поддержка отдельных API при вызове пакета SDK для отдельных типов удостоверений.

Операции пользователь Служб связи Пользователь Microsoft 365
Получение события о запуске транскрибирования ✔️ ✔️
Получить состояние транскрипции ✔️ ✔️
Запуск или остановка транскрибирования
Узнайте, требуется ли явное согласие ✔️ [1] ✔️ [1]
Предоставление явного согласия для транскрибирования ✔️ [1] ✔️ [1]

[1] Эта функция доступна только в собраниях Teams и групповых вызовах взаимодействия Teams.

Пакеты SDK

В следующих таблицах показана поддержка транскрибирования в отдельных пакетах SDK служб коммуникации Azure.

Платформы Интернет Веб-интерфейс iOS Пользовательский интерфейс iOS Андроид Пользовательский интерфейс Android Виндоус
Поддерживается ✔️ ✔️ [1] ✔️ [1] ✔️ [1] ✔️ [1] ✔️ [1] ✔️ [1]

[1] Эти пакеты SDK не поддерживают явное согласие.

Установите SDK

Используйте команду npm install для установки Azure Communication Services Common and Calling SDK для JavaScript.

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

Инициализируйте необходимые объекты

Для большинства операций вызова требуется наличие экземпляра CallClient. При создании нового экземпляра CallClient вы можете настроить его, используя пользовательские параметры, подобные экземпляру Logger.

Используя экземпляр CallClient, вы можете создать экземпляр CallAgent, вызвав createCallAgent. Этот метод асинхронно возвращает объект экземпляра CallAgent.

Метод createCallAgent использует CommunicationTokenCredential в качестве аргумента. Он принимает токен доступа пользователя.

Можно применить метод getDeviceManager для экземпляра CallClient, чтобы получить доступ к 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()

Управление подключением пакета SDK к инфраструктуре Майкрософт

Экземпляр Call Agent помогает управлять вызовами (присоединяться к ним или начинать их). Для работы пакета SDK для вызова необходимо подключиться к инфраструктуре Майкрософт для получения уведомлений о входящих звонках и координации других сведений о вызове. Ваш Call Agent имеет два возможных состояния:

Подключено - Значение Call Agent connectionStatue, равное Connected, означает, что клиентский SDK подключен и способен получать уведомления от инфраструктуры Microsoft.

Отключено — значение Call Agent статуса соединения Disconnected указывает на проблему, которая препятствует правильному подключению SDK. Call Agent следует создать заново.

  • invalidToken: если срок действия токена истек или он недействителен, Call Agent экземпляр отключается с этой ошибкой.
  • connectionIssue: если у клиента возникла проблема с подключением к инфраструктуре Майкрософт, после многочисленных повторных попыток Call Agent возникает connectionIssue ошибка.

Вы можете проверить, подключен ли локальный сервер Call Agent к инфраструктуре Майкрософт, проверив текущее значение connectionState свойства. Во время активного звонка вы можете прослушать событие connectionStateChanged, чтобы определить, изменилось ли Call Agent из состояния Connected в состояние Disconnected.

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

Предупреждение

Из-за изменений в Microsoft Teams JavaScript вызывает пакеты SDK с версиями 1.21 и ниже останавливает транскрибирование Teams и блокирует запуск транскрибирования Teams пользователям Teams. Если вы хотите использовать транскрибирование Teams в звонках и собраниях, необходимо обновить пакет SDK для вызова по крайней мере до версии 1.22.

Транскрибирование звонков

Transcription — это расширенная функция класса Call. Сначала необходимо получить объект API функций транскрибирования

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

Состояние транскрибирования можно проверить в свойстве isTranscriptionActive. Если задано trueзначение, то транскрибирование активно.

const isTranscriptionActive = callTranscriptionFeature.isTranscriptionActive;

Вы можете подписаться на событие, которое активируется при изменении состояния транскрибирования:

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

Вы можете отменить подписку из события с помощью следующего кода:

callTranscriptionFeature.off('isTranscriptionActiveChanged', isTranscriptionActiveChangedHandler);

Если для собрания или вызова Teams требуется явное согласие на запись или транскрибацию, необходимо получить явное согласие пользователей на то, чтобы их записывали или транскрибировали. Вы можете заранее предоставить согласие при присоединении к собранию или реактивно при запуске записи или транскрибирования. Пока не будет предоставлено явное согласие, во время транскрибирования отключается звук, видео и общий доступ к экранам участников.

Можно проверить, требуется ли для транскрибирования собрания явное согласие по свойству isTeamsConsentRequired. Если значение задано как true, тогда для этого требуется явное согласие на call.

const isTranscriptionConsentRequired = callTranscriptionFeature.isTeamsConsentRequired;

Если вы уже получили согласие пользователя на транскрибирование, можно вызвать grantTeamsConsent() метод, чтобы указать явное согласие на службу. Это согласие допустимо только для одного call сеанса, и пользователям необходимо снова предоставить согласие, если они повторно присоединиться к собранию.

callTranscriptionFeature.grantTeamsConsent();

Попытки включить аудио, видео или общий доступ к экрану завершаются неудачей, когда активно транскрибирование. Требуется явное согласие, но оно пока не предоставлено. Эту ситуацию можно распознать, проверив свойство reason класса ParticipantCapabilities для возможностейturnVideoOn, unmuteMicа также shareScreen. Эти возможности можно найти в функции call.feature(Features.Capabilities). Эти возможности возвращали бы причину ExplicitConsentRequired, поскольку пользователям необходимо предоставить явное согласие.

Установите SDK

Найдите файл build.gradle на уровне проекта и добавьте mavenCentral() в список репозиториев в разделах buildscript и allprojects:

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

Затем в файле build.gradle на уровне модуля добавьте следующие строки в раздел dependencies.

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

Инициализация требуемых объектов

Чтобы создать CallAgent экземпляр, необходимо вызвать метод createCallAgent на экземпляре CallClient. Этот вызов асинхронно возвращает объект экземпляра CallAgent .

Метод createCallAgent принимает CommunicationUserCredential в качестве аргумента, который инкапсулирует маркер доступа.

Чтобы получить доступ к DeviceManager, сначала необходимо создать callAgent объект. Затем можно использовать CallClient.getDeviceManager метод для получения 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();

Чтобы задать отображаемое имя для вызывающего абонента, используйте этот альтернативный метод:

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

Предупреждение

До версии 1.1.0 и бета-версии 1.1.0-beta.1 SDK для Android Служб коммуникации Azure isTranscriptionActive и addOnIsTranscriptionActiveChangedListener являются частью объекта Call. Для новых бета-версий эти функции теперь являются расширенными функциями Call , как описано далее в этой статье.

Транскрибирование вызовов — это расширенная функция основного Call объекта. Сначала необходимо получить объект функции транскрибирования:

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

Затем, чтобы проверить, транскрибируется ли вызов, проверьте свойство isTranscriptionActive в callTranscriptionFeature. Он возвращает boolean.

boolean isTranscriptionActive = callTranscriptionFeature.isTranscriptionActive();

Вы также можете подписаться на изменения в транскрибировании:

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

callTranscriptionFeature.addOnIsTranscriptionActiveChangedListener(handleCallOnIsTranscriptionChanged);

Замечание

Этот API предоставляется в качестве предварительной версии для разработчиков и может измениться на основе полученных отзывов. Не используйте этот API в рабочей среде. Чтобы использовать этот API, воспользуйтесь бета-версией пакета Android SDK для звонков в Службе коммуникации Azure.

Если для собрания или вызова Teams требуется явное согласие на запись или транскрибацию, необходимо получить явное согласие пользователей на то, чтобы их записывали или транскрибировали. Вы можете заранее предоставить согласие при присоединении к собранию или реактивно при запуске записи или транскрибирования. Пока не будет предоставлено явное согласие, во время транскрибирования отключается звук, видео и общий доступ к экранам участников.

Можно проверить, требуется ли для транскрибирования собрания явное согласие по свойству isTeamsConsentRequired(). Если значение задано как true, тогда для этого требуется явное согласие на call.

boolean isTranscriptionConsentRequired = callTranscriptionFeature.isTeamsConsentRequired();

Если вы уже получили согласие пользователя на транскрибирование, можно вызвать grantTeamsConsent() метод, чтобы указать явное согласие на службу. Это согласие допустимо только для одного call сеанса, и пользователям необходимо снова предоставить согласие, если они повторно присоединиться к собранию.

callTranscriptionFeature.grantTeamsConsent();

Попытки включить аудио, видео или общий доступ к экрану завершаются неудачей, когда активно транскрибирование. Требуется явное согласие, но оно пока не предоставлено. Эту ситуацию можно распознать, проверив свойство reason класса ParticipantCapabilities для возможностейturnVideoOn, unmuteMicа также shareScreen. Эти возможности можно найти в функции call.feature(Features.Capabilities). Эти возможности возвращали бы причину ExplicitConsentRequired, поскольку пользователям необходимо предоставить явное согласие.

Настройте вашу систему

Следуйте этим шагам, чтобы настроить вашу систему.

Создайте проект Xcode

В Xcode создайте новый проект iOS и выберите шаблон Single View App. В этой статье используется платформа SwiftUI, поэтому необходимо задать для языка значение Swift и задать для интерфейсазначение SwiftUI.

Вы не будете создавать тесты в этой статье. Вы можете снять галочку с поля Include Tests.

Снимок экрана, на котором показано окно для создания проекта в Xcode.

Установите пакет и зависимости с помощью CocoaPods.

  1. Создайте Podfile для вашего приложения, как в этом примере:

    platform :ios, '13.0'
    use_frameworks!
    target 'AzureCommunicationCallingSample' do
        pod 'AzureCommunicationCalling', '~> 1.0.0'
    end
    
  2. Выполните pod install.

  3. Откройте .xcworkspace с помощью Xcode.

Запросить доступ к микрофону

Чтобы получить доступ к микрофону устройства, необходимо обновить список свойств приложения с помощью NSMicrophoneUsageDescription. Задайте связанное значение строке, включенной в диалоговое окно, которое система использует для запроса доступа от пользователя.

Щелкните правой кнопкой мыши на позиции Info.plist в дереве проекта, а затем выберите Открыть как>Исходный код. Добавьте в раздел верхнего уровня <dict> следующие строки, а затем сохраните файл.

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

Настройте структуру приложения

Откройте файл ContentView.swift вашего проекта. Добавьте объявление import в начало файла для импорта библиотеки AzureCommunicationCalling. Кроме того, импортируйте AVFoundation. Он необходим для запросов на разрешение звука в коде.

import AzureCommunicationCalling
import AVFoundation

Инициализация CallAgent

Чтобы создать экземпляр CallAgent из CallClient, необходимо использовать метод callClient.createCallAgent, который асинхронно возвращает объект CallAgent после его инициализации.

Чтобы создать клиента вызова, передайте объект 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)
}

Передайте созданный объект CommunicationTokenCredential в CallClient и задайте отображаемое имя.

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

Предупреждение

До версии 1.1.0 и бета-версии 1.1.0-beta.1 iOS SDK для вызовов в службах связи Azure isTranscriptionActive является частью объекта Call, а didChangeTranscriptionState — частью делегата CallDelegate. Для новых бета-версий эти функции теперь являются расширенными функциями Call , как описано далее в этой статье.

Транскрибирование вызовов — это расширенная функция основного Call объекта. Сначала необходимо получить объект функции транскрибирования:

let callTranscriptionFeature = call.feature(Features.transcription)

Затем, чтобы проверить, правильно ли распознан вызов, проверьте свойство isTranscriptionActive у callTranscriptionFeature. Он возвращает Bool.

let isTranscriptionActive = callTranscriptionFeature.isTranscriptionActive;

Вы также можете подписаться на изменения транскрипции, реализуя TranscriptionCallFeatureDelegate делегат в вашем классе с событием didChangeTranscriptionState:

callTranscriptionFeature.delegate = self

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

Замечание

Этот API предоставляется в качестве предварительной версии для разработчиков и может измениться на основе полученных отзывов. Не используйте этот API в рабочей среде. Чтобы использовать этот API, используйте бета-версию пакета SDK для вызовов iOS Службы коммуникации Azure.

Если для собрания или вызова Teams требуется явное согласие на запись или транскрибацию, необходимо получить явное согласие пользователей на то, чтобы их записывали или транскрибировали. Вы можете заранее предоставить согласие при присоединении к собранию или реактивно при запуске записи или транскрибирования. Пока не будет предоставлено явное согласие, во время транскрибирования отключается звук, видео и общий доступ к экранам участников.

Можно проверить, требуется ли для транскрибирования собрания явное согласие по свойству isTeamsConsentRequired. Если значение задано как true, тогда для этого требуется явное согласие на call.

let isTranscriptionConsentRequired = callTranscriptionFeature.isTeamsConsentRequired;

Если вы уже получили согласие пользователя на транскрибирование, можно вызвать grantTeamsConsent() метод, чтобы указать явное согласие на службу. Это согласие допустимо только для одного call сеанса, и пользователям необходимо снова предоставить согласие, если они повторно присоединиться к собранию.

callTranscriptionFeature.grantTeamsConsent();

Попытки включить аудио, видео или общий доступ к экрану завершаются неудачей, когда активно транскрибирование. Требуется явное согласие, но оно пока не предоставлено. Эту ситуацию можно распознать, проверив свойство reason класса ParticipantCapabilities для возможностейturnVideoOn, unmuteMicа также shareScreen. Эти возможности можно найти в функции call.feature(Features.Capabilities). Эти возможности возвращали бы причину ExplicitConsentRequired, поскольку пользователям необходимо предоставить явное согласие.

Настройте вашу систему

Следуйте этим шагам, чтобы настроить вашу систему.

Создание проекта Visual Studio

В Visual Studio 2022 для приложения универсальной платформы Windows создайте новый проект Пустое приложение (универсальная платформа Windows). После ввода имени проекта вы можете свободно выбрать любую версию Windows SDK не ниже 10.0.17763.0.

Для приложения WinUI 3 создайте новый проект, используя шаблон "Пустое приложение, упакованное (WinUI 3 для рабочего стола)" для настройки одностраничного приложения WinUI 3. Требуется пакет SDK для приложений Windows версии 1.3 или более поздней.

Установите пакет и зависимости с помощью диспетчера пакетов NuGet.

API и библиотеки SDK для звонков общедоступны через пакет NuGet.

Чтобы найти, скачать и установить пакет NuGet SDK для вызовов:

  1. Откройте диспетчер пакетов NuGet, выбрав Средства>Диспетчер пакетов NuGet>Управление пакетами NuGet для решения.
  2. Выберите "Обзор" и введите Azure.Communication.Calling.WindowsClient в поле поиска.
  3. Убедитесь, что флажок Include prerelease установлен.
  4. Выберите пакет Azure.Communication.Calling.WindowsClient, а затем выберите Azure.Communication.Calling.WindowsClient1.4.0-beta.1 или более позднюю версию.
  5. Выберите флажок, который соответствует проекту Azure Communication Services в правой панели.
  6. Нажмите Установить.

Транскрибирование вызовов — это расширенная функция основного Call объекта. Сначала необходимо получить объект функции транскрибирования:

TranscriptionCallFeature transcriptionFeature = call.Features.Transcription;

Затем, чтобы проверить, транскрибируется ли вызов, проверьте свойство IsTranscriptionActive в transcriptionFeature. Он возвращает boolean.

boolean isTranscriptionActive = transcriptionFeature.isTranscriptionActive;

Вы также можете подписаться на изменения в транскрибировании:

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

transcriptionFeature.IsTranscriptionActiveChanged += Call__OnIsTranscriptionActiveChanged;

Замечание

Этот API предоставляется в качестве предварительной версии для разработчиков и может измениться на основе полученных отзывов. Не используйте этот API в рабочей среде. Чтобы использовать этот API, используйте бета-версию Azure Communication Services Calling SDK для Windows.

Если для собрания или вызова Teams требуется явное согласие на запись или транскрибацию, необходимо получить явное согласие пользователей на то, чтобы их записывали или транскрибировали. Вы можете заранее предоставить согласие при присоединении к собранию или реактивно при запуске записи или транскрибирования. Пока не будет предоставлено явное согласие, во время транскрибирования отключается звук, видео и общий доступ к экранам участников.

Можно проверить, требуется ли для транскрибирования собрания явное согласие по свойству isTeamsConsentRequired. Если значение задано как true, тогда для этого требуется явное согласие на call.

boolean isTranscriptionConsentRequired = transcriptionFeature.isTeamsConsentRequired;

Если вы уже получили согласие пользователя на транскрибирование, можно вызвать grantTeamsConsent() метод, чтобы указать явное согласие на службу. Это согласие допустимо только для одного call сеанса, и пользователям необходимо снова предоставить согласие, если они повторно присоединиться к собранию.

transcriptionFeature.grantTeamsConsent();

Попытки включить аудио, видео или общий доступ к экрану завершаются неудачей, когда активно транскрибирование. Требуется явное согласие, но оно пока не предоставлено. Эту ситуацию можно распознать, проверив свойство reason класса ParticipantCapabilities для возможностейturnVideoOn, unmuteMicа также shareScreen. Эти возможности можно найти в функции call.feature(Features.Capabilities). Эти возможности возвращали бы причину ExplicitConsentRequired, поскольку пользователям необходимо предоставить явное согласие.

Совместимость пакета SDK

В следующей таблице показана минимальная версия пакетов SDK, поддерживающих отдельные API.

Операции Интернет Веб-интерфейс iOS Пользовательский интерфейс iOS Андроид Пользовательский интерфейс Android Виндоус
Получение события о запуске транскрибирования 1.0.0, 1.25.3-beta.1 1.0.0, 1.0.0-beta.8 2.1.0, 2.1.0-beta.1 1.0.0, 1.0.0-beta.8 1.1.0, 1.2.0-beta.1 1.0.0, 1.0.0-beta.8 1.0.0, 1.0.0-beta.31
Получить состояние транскрипции 1.0.0, 1.25.3-beta.1 1.0.0, 1.0.0-beta.8 2.1.0, 2.1.0-beta.1 1.0.0, 1.0.0-beta.8 1.1.0, 1.2.0-beta.1 1.0.0, 1.0.0-beta.8 1.0.0, 1.0.0-beta.31
Узнайте, требуется ли явное согласие 1.31.2, 1.32.1-beta.1 2.16.0-beta.1 2.14.0-beta.1 1.12.0-beta.1
Предоставление явного согласия на запись 1.31.2, 1.32.1-beta.1 2.16.0-beta.1 2.14.0-beta.1 1.12.0-beta.1

Дальнейшие шаги