Включение закрытых подписей для взаимодействия с Teams
Узнайте, как разрешить пользователям включать закрытые подписи во время сценария взаимодействия Teams, где пользователи могут находиться на собрании между пользователем Службы коммуникации Azure и пользователем клиента Teams или где пользователи используют пакет SDK для Службы коммуникации Azure вызова пакета SDK с удостоверением Microsoft 365.
Необходимые компоненты
- Учетная запись Azure с активной подпиской см. в статье "Создание учетной записи бесплатно".
- Службы коммуникации Azure ресурс. См. статью "Создание ресурса Службы коммуникации Azure". Сохраните строка подключения для этого ресурса.
- Приложение с голосовым и видеозвонками см. в кратких руководствах по голосовым и видеозвонкам .
- Маркеры доступа для пользователей Microsoft 365.
- Маркеры доступа для пользователей внешних удостоверений.
- Для переведенных подписей необходимо иметь лицензию Teams premium .
Примечание.
Обратите внимание, что вам потребуется приложение голосового вызова с помощью Службы коммуникации Azure вызова пакетов SDK для доступа к функции закрытых подписей, описанной в этом руководстве.
Модели
Имя | Описание |
---|---|
CaptionsCallFeature | API для функции вызова подписей |
TeamsCaptions | API для подписей Teams |
StartCaptionOptions | Параметры закрытого заголовка, такие как разговорный язык |
TeamsCaptionsReceivedEventArgs | Объект данных, полученный для каждого полученного события подписей Teams |
Получение функции закрытых подписей
Пользователи внешнего удостоверения и пользователи Microsoft 365
Если вы создаете приложение, позволяющее пользователям Службы коммуникации Azure присоединиться к собранию Teams
CaptionsCallFeature captionsCallFeature = call.Features.Captions;
CallCaptions callCaptions = await captionsCallFeature.GetCaptionsAsync();
if (callCaptions.CaptionsKind == CaptionsKind.TeamsCaptions)
{
TeamsCaptions teamsCaptions = callCaptions as TeamsCaptions;
}
Подписка на прослушиватели
Добавление прослушивателя для получения подписей включено или отключено состояние
teamsCaptions.CaptionsEnabledChanged += OnIsCaptionsEnabledChanged;
private void OnIsCaptionsEnabledChanged(object sender, PropertyChangedEventArgs args)
{
if (teamsCaptions.IsEnabled)
{
}
}
Добавление прослушивателя для полученных данных подписей
teamsCaptions.CaptionsReceived += OnCaptionsReceived;
private void OnCaptionsReceived(object sender, TeamsCaptionsReceivedEventArgs eventArgs)
{
// Information about the speaker.
// eventArgs.Speaker
// The original text with no transcribed.
// eventArgs.SpokenText
// language identifier for the captions text.
// eventArgs.CaptionLanguage
// language identifier for the speaker.
// eventArgs.SpokenLanguage
// The transcribed text.
// eventArgs.CaptionText
// Timestamp denoting the time when the corresponding speech was made.
// eventArgs.Timestamp
// CaptionsResultKind is Partial if text contains partially spoken sentence.
// It is set to Final once the sentence has been completely transcribed.
// eventArgs.ResultKind
}
Добавление прослушивателя для получения активного состояния изменения языка
teamsCaptions.ActiveSpokenLanguageChanged += OnIsActiveSpokenLanguageChanged;
private void OnIsActiveSpokenLanguageChanged(object sender, PropertyChangedEventArgs args)
{
// teamsCaptions.ActiveSpokenLanguage
}
Добавление прослушивателя для получения состояния измененного языка активных подписей
teamsCaptions.ActiveCaptionLanguageChanged += OnIsActiveCaptionLanguageChanged;
private void OnIsActiveCaptionLanguageChanged(object sender, PropertyChangedEventArgs args)
{
// teamsCaptions.ActiveCaptionLanguage
}
Начальные подписи
После настройки всех прослушивателей теперь можно приступить к добавлению подписей.
private async void StartCaptions()
{
var options = new StartCaptionsOptions
{
SpokenLanguage = "en-us"
};
try
{
await teamsCaptions.StartCaptionsAsync(options);
}
catch (Exception ex)
{
}
}
Остановки подписей
private async void StopCaptions()
{
try
{
await teamsCaptions.StopCaptionsAsync();
}
catch (Exception ex)
{
}
}
Удаление полученного прослушивателя субтитров
teamsCaptions.CaptionsReceived -= OnCaptionsReceived;
Поддержка языка
Получение списка поддерживаемых языков
Получите список поддерживаемых языков, которые пользователи могут выбрать при включении закрытых подписей.
// bcp 47 formatted language code
IReadOnlyList<string> sLanguages = teamsCaptions.SupportedSpokenLanguages;```
### Set spoken language
When the user selects the spoken language, your app can set the spoken language that it expects captions to be generated from.
``` cs
public async void SetSpokenLanguage()
{
try
{
await teamsCaptions.SetSpokenLanguageAsync("en-us");
}
catch (Exception ex)
{
}
}
Поддержка языка субтитров
Получение поддерживаемого языка субтитров
Если у вашей организации есть активная лицензия Teams premium, Службы коммуникации Azure пользователи могут включить переведенные субтитры, пока организатор собрания имеет лицензию Teams premium. Что касается пользователей с удостоверениями Microsoft 365, эта проверка выполняется в отношении собственной учетной записи пользователя, если у организатора собрания нет лицензии Teams premium.
// ISO 639-1 formatted language code
IReadOnlyList<string> cLanguages = teamsCaptions.SupportedCaptionLanguages;
Настройка языка субтитров
public async void SetCaptionLanguage()
{
try
{
await teamsCaptions.SetCaptionLanguageAsync("en");
}
catch (Exception ex)
{
}
}
Необходимые компоненты
- Учетная запись Azure с активной подпиской см. в статье "Создание учетной записи бесплатно".
- Службы коммуникации Azure ресурс. См. статью "Создание ресурса Службы коммуникации Azure". Сохраните строка подключения для этого ресурса.
- Приложение с голосовым и видеозвонками см. в кратких руководствах по голосовым и видеозвонкам .
- Маркеры доступа для пользователей Microsoft 365.
- Маркеры доступа для пользователей внешних удостоверений.
- Для переведенных подписей необходимо иметь лицензию Teams premium .
Примечание.
Обратите внимание, что вам потребуется приложение голосового вызова с помощью Службы коммуникации Azure вызова пакетов SDK для доступа к функции закрытых подписей, описанной в этом руководстве.
Модели
Имя | Описание |
---|---|
CaptionsCallFeature | API для подписей |
CaptionsCommon | Базовый класс для подписей |
StartCaptionOptions | Параметры закрытого заголовка, такие как разговорный язык |
TeamsCaptionHandler | Определение обратного вызова для обработки события CaptionsReceivedEventType |
TeamsCaptionsInfo | Структура данных, полученная для каждого события CaptionsReceivedEventType |
Получение функции закрытых подписей
Пользователи внешних удостоверений
Если вы создаете приложение, которое позволяет Службы коммуникации Azure пользователям присоединиться к собранию Teams.
let captionsCallFeature: SDK.CaptionsCallFeature = call.feature(SDK.Features.Captions);
Пользователи Microsoft 365
let captionsCallFeature: SDK.CaptionsCallFeature = teamsCall.feature(SDK.Features.Captions);
Получение объекта подписей teams
Необходимо получить и привести объект Captions Teams для использования определенных функций подписей Teams
let teamsCaptions: SDK.TeamsCaptions;
if (captionsCallFeature.captions.kind === 'TeamsCaptions') {
teamsCaptions = captionsCallFeature.captions as SDK.TeamsCaptions;
}
Подписка на прослушиватели
Добавление прослушивателя для получения заголовков активного или неактивного состояния
const captionsActiveChangedHandler = () => {
if (teamsCaptions.isCaptionsFeatureActive) {
/* USER CODE HERE - E.G. RENDER TO DOM */
}
}
teamsCaptions.on('CaptionsActiveChanged', captionsActiveChangedHandler);
Добавление прослушивателя для полученных данных подписей
Обработайте возвращенный объект данных TeamsCaptionsInfo.
Примечание. Объект содержит объект resultType prop, указывающий, является ли данные частичным подписью или завершенной версией заголовка. ResultType partial
указывает динамические неуправляемые субтитры, в то время как final
указывает завершенную интерпретированную версию предложения (т. е. включает препинание и заглавную букву).
let currentCaptionLanguage : string;
const captionsReceivedHandler : TeamsCaptionsHandler = (data: TeamsCaptionsInfo) => {
/** USER CODE HERE - E.G. RENDER TO DOM
* data.captionLanguage
* data.captionText
* data.resultType
* data.speaker
* data.spokenText
* data.timeStamp
*/
// Example code:
// Create a dom element, i.e. div, with id "captionArea" before proceeding with the sample code
if (!this._currentCaptionLanguage || this._currentCaptionLanguage === data.captionLanguage) {
let mri: string;
switch (data.speaker.identifier.kind) {
case 'communicationUser': { mri = data.speaker.identifier.communicationUserId; break; }
case 'microsoftTeamsUser': { mri = data.speaker.identifier.microsoftTeamsUserId; break; }
case 'phoneNumber': { mri = data.speaker.identifier.phoneNumber; break; }
}
const outgoingCaption = `prefix${mri.replace(/:/g, '').replace(/-/g, '')}`;
let captionArea = document.getElementById("captionArea");
const captionText = `${data.timestamp.toUTCString()}
${data.speaker.displayName}: ${data.captionText ?? data.spokenText}`;
let foundCaptionContainer = captionArea.querySelector(`.${outgoingCaption}[isNotFinal='true']`);
if (!foundCaptionContainer) {
let captionContainer = document.createElement('div');
captionContainer.setAttribute('isNotFinal', 'true');
captionContainer.style['borderBottom'] = '1px solid';
captionContainer.style['whiteSpace'] = 'pre-line';
captionContainer.textContent = captionText;
captionContainer.classList.add(newClassName);
captionArea.appendChild(captionContainer);
} else {
foundCaptionContainer.textContent = captionText;
if (captionData.resultType === 'Final') {
foundCaptionContainer.setAttribute('isNotFinal', 'false');
}
}
}
};
teamsCaptions.on('CaptionsReceived', captionsReceivedHandler);
Добавление прослушивателя для получения измененного состояния языка
const spokenLanguageChangedHandler = () => {
if (teamsCaptions.activeSpokenLanguage !== currentSpokenLanguage) {
/* USER CODE HERE - E.G. RENDER TO DOM */
}
}
teamsCaptions.on('SpokenLanguageChanged', spokenLanguageChangedHandler)
Добавление прослушивателя для изменения состояния языка подписей
const captionLanguageChangedHandler = () => {
if (teamsCaptions.activeCaptionLanguage !== currentCaptionLanguage) {
/* USER CODE HERE - E.G. RENDER TO DOM */
}
}
teamsCaptions.on('CaptionLanguageChanged', captionLanguageChangedHandler)
Начальные подписи
После настройки всех прослушивателей теперь можно приступить к добавлению подписей.
try {
await teamsCaptions.startCaptions({ spokenLanguage: 'en-us' });
} catch (e) {
/* USER ERROR HANDLING CODE HERE */
}
Остановки подписей
try {
teamsCaptions.stopCaptions();
} catch (e) {
/* USER ERROR HANDLING CODE HERE */
}
Отмена подписки на прослушиватели
teamsCaptions.off('CaptionsActiveChanged', captionsActiveChangedHandler);
teamsCaptions.off('CaptionsReceived', captionsReceivedHandler);
Поддержка языка
Получение списка поддерживаемых языков
Получите список поддерживаемых языков, которые пользователи могут выбрать при включении закрытых подписей. Свойство возвращает массив языков в формате bcp 47.
const spokenLanguages = teamsCaptions.supportedSpokenLanguages;
Настройка языка
Передайте значение из поддерживаемого массива языков, чтобы убедиться, что запрошенный язык поддерживается. По умолчанию, если contoso не предоставляет язык или неподдерживаемый язык, язык по умолчанию имеет значение en-us.
// bcp 47 formatted language code
const language = 'en-us';
// Altneratively, pass a value from the supported spoken languages array
const language = spokenLanguages[0];
try {
teamsCaptions.setSpokenLanguage(language);
} catch (e) {
/* USER ERROR HANDLING CODE HERE */
}
Поддержка языка субтитров
Получение списка поддерживаемых языков подписей
Если у вашей организации есть активная лицензия Teams premium, вы можете разрешить пользователям использовать переведенные субтитры, предоставляемые подписями Teams. Что касается пользователей с удостоверением Microsoft 365, то если у организатора собрания нет активной лицензии Teams premium, проверка языка подписей выполняется в учетной записи пользователей Microsoft 365.
Свойство возвращает массив двухбуквовых кодов языка в ISO 639-1
стандартном формате.
const captionLanguages = teamsCaptions.supportedCaptionLanguages;
Настройка языка субтитров
// ISO 639-1 formatted language code
const language = 'en';
// Altneratively, pass a value from the supported caption languages array
const language = captionLanguages[0];
try {
teamsCaptions.setCaptionLanguage(language);
} catch (e) {
/* USER ERROR HANDLING CODE HERE */
}
Необходимые компоненты
- Учетная запись Azure с активной подпиской см. в статье "Создание учетной записи бесплатно".
- Службы коммуникации Azure ресурс. См. статью "Создание ресурса Службы коммуникации Azure". Сохраните строка подключения для этого ресурса.
- Приложение с голосовым и видеозвонками см. в кратких руководствах по голосовым и видеозвонкам .
- Маркеры доступа для пользователей Microsoft 365.
- Маркеры доступа для пользователей внешних удостоверений.
- Для переведенных подписей необходимо иметь лицензию Teams premium .
Примечание.
Обратите внимание, что вам потребуется приложение голосового вызова с помощью Службы коммуникации Azure вызова пакетов SDK для доступа к функции закрытых подписей, описанной в этом руководстве.
Модели
Имя | Описание |
---|---|
CaptionsCallFeature | API для функции вызова подписей |
TeamsCaptions | API для подписей Teams |
StartCaptionOptions | Параметры закрытого заголовка, такие как разговорный язык |
TeamsCaptionsListener | Прослушиватель для TeamsCaptions addOnCaptionsReceivedListener |
TeamsCaptionsReceivedEvent | Объект данных, полученный для каждого события TeamsCaptionsListener |
Получение функции закрытых подписей
Пользователи внешнего удостоверения и пользователи Microsoft 365
Если вы создаете приложение, которое позволяет пользователям присоединяться к собранию Teams
CaptionsCallFeature captionsCallFeature = call.feature(Features.CAPTIONS);
captionsCallFeature.getCaptions().whenComplete(
((captions, throwable) -> {
if (throwable == null) {
CallCaptions callCaptions = captions;
if (captions.getCaptionsType() == CaptionsType.TEAMS_CAPTIONS) {
// teams captions
TeamsCaptions teamsCaptions = (TeamsCaptions) captions;
}
} else {
// get captions failed
// throwable is the exception/cause
}
}));
Подписка на прослушиватели
Добавление прослушивателя для получения подписей включено или отключено состояние
public void addOnIsCaptionsEnabledChangedListener() {
teamsCaptions.addOnCaptionsEnabledChangedListener( (PropertyChangedEvent args) -> {
if(teamsCaptions.isEnabled()) {
// captions enabled
}
});
}
Добавление прослушивателя для полученных данных подписей
TeamsCaptionsListener captionsListener = (TeamsCaptionsReceivedEvent args) -> {
// Information about the speaker.
// CallerInfo participantInfo = args.getSpeaker();
// The original text with no transcribed.
// args.getSpokenText();
// language identifier for the captions text.
// args.getCaptionLanguage();
// language identifier for the speaker.
// args.getSpokenLanguage();
// The transcribed text.
// args.getCaptionText();
// Timestamp denoting the time when the corresponding speech was made.
// args.getTimestamp();
// CaptionsResultType is Partial if text contains partially spoken sentence.
// It is set to Final once the sentence has been completely transcribed.
// args.getResultType() == CaptionsResultType.FINAL;
};
public void addOnCaptionsReceivedListener() {
teamsCaptions.addOnCaptionsReceivedListener(captionsListener);
}
Добавление прослушивателя для получения активного состояния изменения языка
public void addOnActiveSpokenLanguageChangedListener() {
teamsCaptions.addOnActiveSpokenLanguageChangedListener( (PropertyChangedEvent args) -> {
// teamsCaptions.getActiveSpokenLanguage()
});
}
Добавление прослушивателя для получения состояния измененного языка активных подписей
public void addOnActiveCaptionLanguageChangedListener() {
teamsCaptions.addOnActiveCaptionLanguageChangedListener( (PropertyChangedEvent args) -> {
// teamsCaptions.getActiveCaptionLanguage()
});
}
Начальные подписи
После настройки всех прослушивателей теперь можно приступить к добавлению подписей.
public void startCaptions() {
StartCaptionsOptions startCaptionsOptions = new StartCaptionsOptions();
startCaptionsOptions.setSpokenLanguage("en-us");
teamsCaptions.startCaptions(startCaptionsOptions).whenComplete((result, error) -> {
if (error != null) {
}
});
}
Остановки подписей
public void stopCaptions() {
teamsCaptions.stopCaptions().whenComplete((result, error) -> {
if (error != null) {
}
});
}
Удаление полученного прослушивателя субтитров
public void removeOnCaptionsReceivedListener() {
teamsCaptions.removeOnCaptionsReceivedListener(captionsListener);
}
Поддержка языка
Получение списка поддерживаемых языков
Получите список поддерживаемых языков, которые пользователи могут выбрать при включении закрытых подписей.
// bcp 47 formatted language code
teamsCaptions.getSupportedSpokenLanguages();
Настройка языка
Когда пользователь выбирает разговорный язык, приложение может задать язык, из которых он ожидает создания подписей.
public void setSpokenLanguage() {
teamsCaptions.setSpokenLanguage("en-us").whenComplete((result, error) -> {
if (error != null) {
}
});
}
Поддержка языка субтитров
Получение поддерживаемого языка субтитров
Если у вашей организации есть активная лицензия Teams premium, Службы коммуникации Azure пользователи могут включить переведенные субтитры, пока организатор собрания имеет лицензию Teams premium. Что касается пользователей с удостоверениями Microsoft 365, эта проверка выполняется в отношении собственной учетной записи пользователя, если у организатора собрания нет лицензии Teams premium.
// ISO 639-1 formatted language code
teamsCaptions.getSupportedCaptionLanguages();
Настройка языка субтитров
public void setCaptionLanguage() {
teamsCaptions.setCaptionLanguage("en").whenComplete((result, error) -> {
if (error != null) {
}
});
}
Необходимые компоненты
- Учетная запись Azure с активной подпиской см. в статье "Создание учетной записи бесплатно".
- Службы коммуникации Azure ресурс. См. статью "Создание ресурса Службы коммуникации Azure". Сохраните строка подключения для этого ресурса.
- Приложение с голосовым и видеозвонками см. в кратких руководствах по голосовым и видеозвонкам .
- Маркеры доступа для пользователей Microsoft 365.
- Маркеры доступа для пользователей внешних удостоверений.
- Для переведенных подписей необходимо иметь лицензию Teams premium .
Примечание.
Обратите внимание, что вам потребуется приложение голосового вызова с помощью Службы коммуникации Azure вызова пакетов SDK для доступа к функции закрытых подписей, описанной в этом руководстве.
Модели
Имя | Описание |
---|---|
CaptionsCallFeature | API для функции вызова подписей |
TeamsCaptions | API для подписей Teams |
StartCaptionOptions | Параметры закрытого заголовка, такие как разговорный язык |
TeamsCaptionsDelegate | Делегат подписей Teams |
TeamsCaptionsReceivedEventArgs | Объект данных, полученный для каждого полученного события подписей Teams |
Получение функции закрытых подписей
Пользователи внешнего удостоверения и пользователи Microsoft 365
Если вы создаете приложение, позволяющее пользователям Службы коммуникации Azure присоединиться к собранию Teams
if let call = self.call {
@State var captionsCallFeature = call.feature(Features.captions)
captionsCallFeature.getCaptions{(value, error) in
if let error = error {
// failed to get captions
} else {
if (value?.type == CaptionsType.teamsCaptions) {
// teams captions
@State var teamsCaptions = value as? TeamsCaptions
}
}
}
}
Подписка на прослушиватели
Добавление прослушивателя для получения подписей включено или отключено, разговорный язык, состояние языка субтитров изменено и полученные данные
extension CallObserver: TeamsCaptionsDelegate {
// listener for receive captions enabled/disabled status
public func teamsCaptions(_ teamsCaptions: TeamsCaptions, didChangeCaptionsEnabledState args: PropertyChangedEventArgs) {
// teamsCaptions.isEnabled
}
// listener for active spoken language state change
public func teamsCaptions(_ teamsCaptions: TeamsCaptions, didChangeActiveSpokenLanguageState args: PropertyChangedEventArgs) {
// teamsCaptions.activeSpokenLanguage
}
// listener for active caption language state change
public func teamsCaptions(_ teamsCaptions: TeamsCaptions, didChangeActiveCaptionLanguageState args: PropertyChangedEventArgs) {
// teamsCaptions.activeCaptionLanguage
}
// listener for captions data received
public func teamsCaptions(_ teamsCaptions: TeamsCaptions, didReceiveCaptions:TeamsCaptionsReceivedEventArgs) {
// Information about the speaker.
// didReceiveCaptions.speaker
// The original text with no transcribed.
// didReceiveCaptions.spokenText
// language identifier for the captions text.
// didReceiveCaptions.captionLanguage
// language identifier for the speaker.
// didReceiveCaptions.spokenLanguage
// The transcribed text.
// didReceiveCaptions.captionText
// Timestamp denoting the time when the corresponding speech was made.
// didReceiveCaptions.timestamp
// CaptionsResultType is Partial if text contains partially spoken sentence.
// It is set to Final once the sentence has been completely transcribed.
// didReceiveCaptions.resultType
}
}
teamsCaptions.delegate = self.callObserver
Начальные подписи
После настройки всех прослушивателей теперь можно приступить к добавлению подписей.
func startCaptions() {
guard let teamsCaptions = teamsCaptions else {
return
}
let startCaptionsOptions = StartCaptionsOptions()
startCaptionsOptions.spokenLanguage = "en-us"
teamsCaptions.startCaptions(startCaptionsOptions: startCaptionsOptions, completionHandler: { (error) in
if error != nil {
}
})
}
Остановки подписей
func stopCaptions() {
teamsCaptions.stopCaptions(completionHandler: { (error) in
if error != nil {
}
})
}
Удаление полученного прослушивателя субтитров
teamsCaptions?.delegate = nil
Поддержка языка
Получение списка поддерживаемых языков
Получите список поддерживаемых языков, которые пользователи могут выбрать при включении закрытых подписей.
// bcp 47 formatted language code
let spokenLanguage : String = "en-us"
for language in teamsCaptions?.supportedSpokenLanguages ?? [] {
// choose required language
spokenLanguage = language
}
Настройка языка
Когда пользователь выбирает разговорный язык, приложение может задать язык, из которых он ожидает создания подписей.
func setSpokenLanguage() {
guard let teamsCaptions = self.teamsCaptions else {
return
}
teamsCaptions.set(spokenLanguage: spokenLanguage, completionHandler: { (error) in
if let error = error {
}
})
}
Поддержка языка субтитров
Получение поддерживаемого языка субтитров
Если у вашей организации есть активная лицензия Teams premium, Службы коммуникации Azure пользователи могут включить переведенные субтитры, пока организатор собрания имеет лицензию Teams premium. Что касается пользователей с удостоверениями Microsoft 365, эта проверка выполняется в отношении собственной учетной записи пользователя, если у организатора собрания нет лицензии Teams premium.
// ISO 639-1 formatted language code
let captionLanguage : String = "en"
for language in teamsCaptions?.supportedCaptionLanguages ?? [] {
// choose required language
captionLanguage = language
}
Настройка языка субтитров
func setCaptionLanguage() {
guard let teamsCaptions = self.teamsCaptions else {
return
}
teamsCaptions.set(captionLanguage: captionLanguage, completionHandler: { (error) in
if let error = error {
}
})
}
Очистка ресурсов
Если вы хотите отменить и удалить подписку на Службы коммуникации, можно удалить ресурс или группу ресурсов. При удалении группы ресурсов также удаляются все связанные с ней ресурсы. Дополнительные сведения о очистке ресурсов см. здесь.
Следующие шаги
Дополнительные сведения см. в следующих статьях:
- Узнайте о голосовых и видеозвонках.
- Узнайте о взаимодействии с Teams.
- Дополнительные сведения о динамических субтитрах в Microsoft Teams.
- Дополнительные сведения о библиотеке пользовательского интерфейса.