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


Включение закрытых подписей для взаимодействия с Teams

Узнайте, как разрешить пользователям включать закрытые подписи во время сценария взаимодействия Teams, где пользователи могут находиться на собрании между пользователем Службы коммуникации Azure и пользователем клиента Teams или где пользователи используют пакет SDK для Службы коммуникации Azure вызова пакета SDK с удостоверением Microsoft 365.

Необходимые компоненты

Примечание.

Обратите внимание, что вам потребуется приложение голосового вызова с помощью Службы коммуникации 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 вызова пакетов 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 вызова пакетов 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 вызова пакетов 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 {
        }
    })
}

Очистка ресурсов

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

Следующие шаги

Дополнительные сведения см. в следующих статьях: