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


Краткое руководство. Добавление закрытых подписей в вызывающее приложение

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

Примечание.

Обратите внимание, что вам потребуется приложение голосового вызова с помощью Службы коммуникации Azure вызова пакетов SDK для доступа к функции закрытых подписей, описанной в этом руководстве.

Модели

Имя Описание
CaptionsCallFeature API для подписей
CaptionsCommon Базовый класс для подписей
StartCaptionOptions Параметры закрытого заголовка, такие как разговорный язык
CaptionsHandler Определение обратного вызова для обработки события CaptionsReceivedEventType
CaptionsInfo Структура данных, полученная для каждого события CaptionsReceivedEventType

Получение функции закрытых подписей

let captionsCallFeature: SDK.CaptionsCallFeature = call.feature(SDK.Features.Captions);

Получение объекта субтитров

Необходимо получить и привести объект Captions для использования определенных функций Captions.

let captions: SDK.Captions;
if (captionsCallFeature.captions.kind === 'Captions') {
    captions = captionsCallFeature.captions as SDK.Captions;
}

Подписка на прослушиватели

Добавление прослушивателя для получения заголовков активного или неактивного состояния

const captionsActiveChangedHandler = () => {
    if (captions.isCaptionsFeatureActive) {
        /* USER CODE HERE - E.G. RENDER TO DOM */
    }
}
captions.on('CaptionsActiveChanged', captionsActiveChangedHandler);

Добавление прослушивателя для полученных данных подписей

Обработка возвращаемого объекта данных CaptionsInfo.

Примечание. Объект содержит объект resultType prop, указывающий, является ли данные частичным подписью или завершенной версией заголовка. ResultType Partial указывает динамические неуправляемые субтитры, в то время как Final указывает завершенную интерпретированную версию предложения (т. е. включает препинание и заглавную букву).

const captionsReceivedHandler : CaptionsHandler = (data: CaptionsInfo) => { 
    /** USER CODE HERE - E.G. RENDER TO DOM 
     * data.resultType
     * data.speaker
     * data.spokenLanguage
     * data.spokenText
     * data.timeStamp
    */
   // Example code:
   // Create a dom element, i.e. div, with id "captionArea" before proceeding with the sample code
    let mri: string;
    switch (data.speaker.identifier.kind) {
        case 'communicationUser': { mri = data.speaker.identifier.communicationUserId; 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.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(outgoingCaption);

        captionArea.appendChild(captionContainer);
    } else {
        foundCaptionContainer.textContent = captionText;

        if (captionData.resultType === 'Final') {
            foundCaptionContainer.setAttribute('isNotFinal', 'false');
        }
    }
}; 
captions.on('CaptionsReceived', captionsReceivedHandler); 

Добавление прослушивателя для получения измененного состояния языка

// set a local variable currentSpokenLanguage to track the current spoken language in the call
let currentSpokenLanguage = ''
const spokenLanguageChangedHandler = () => {
    if (captions.activeSpokenLanguage !== currentSpokenLanguage) {
        /* USER CODE HERE - E.G. RENDER TO DOM */
    }
}
captions.on('SpokenLanguageChanged', spokenLanguageChangedHandler)

Начальные подписи

После настройки всех прослушивателей теперь можно приступить к добавлению подписей.

try {
    await captions.startCaptions({ spokenLanguage: 'en-us' });
} catch (e) {
    /* USER ERROR HANDLING CODE HERE */
}

Остановки подписей

try {
    captions.stopCaptions(); 
} catch (e) {
    /* USER ERROR HANDLING CODE HERE */
}

Отмена подписки на прослушиватели

captions.off('CaptionsActiveChanged', captionsActiveChangedHandler);
captions.off('CaptionsReceived', captionsReceivedHandler); 

Поддержка языка

Получение списка поддерживаемых языков

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

const spokenLanguages = captions.supportedSpokenLanguages; 

Настройка языка

Передайте значение из поддерживаемого массива языков, чтобы убедиться, что запрошенный язык поддерживается. По умолчанию, если contoso не предоставляет язык или неподдерживаемый язык, язык по умолчанию имеет значение en-us.

// bcp 47 formatted language code
const language = 'en-us'; 

// Alternatively, pass a value from the supported spoken languages array
const language = spokenLanguages[0]; 

try {
    captions.setSpokenLanguage(language);
} catch (e) {
    /* USER ERROR HANDLING CODE HERE */
}

Добавление прослушивателя для получения типа подписей изменено состояние

Тип подписей может меняться с субтитров на TeamsCaptions, если пользователь Teams/CTE присоединяется к вызову или если вызов изменяется на тип вызова взаимодействия. Для продолжения работы с субтитрами требуется повторное использование прослушивателей подписей Teams. Тип TeamsCaptions нельзя переключить или вернуться к типу субтитров в вызове после использования TeamsCaptions в вызове.

const captionsKindChangedHandler = () => {
    /* USER CODE HERE - E.G. SUBSCRIBE TO TEAMS CAPTIONS */
}
captions.on('CaptionsKindChanged', captionsKindChangedHandler)

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

Примечание.

Обратите внимание, что вам потребуется приложение голосового вызова с помощью Службы коммуникации Azure вызова пакетов SDK для доступа к функции закрытых подписей, описанной в этом руководстве.

Модели

Имя Описание
CaptionsCallFeature API для функции вызова подписей
CommunicationCaptions API для подписей для обмена данными
StartCaptionOptions Параметры закрытого заголовка, такие как разговорный язык
CommunicationCaptionsReceivedEventArgs Объект данных, полученный для каждого полученного события подписей связи

Получение функции закрытых подписей

Необходимо получить и привести объект Captions для использования определенных функций Captions.

CaptionsCallFeature captionsCallFeature = call.Features.Captions;
CallCaptions callCaptions = await captionsCallFeature.GetCaptionsAsync();
if (callCaptions.CaptionsKind == CaptionsKind.CommunicationCaptions)
{
    CommunicationCaptions communicationCaptions = callCaptions as CommunicationCaptions;
} 

Подписка на прослушиватели

Добавление прослушивателя для получения подписей включено или отключено состояние

communicationCaptions.CaptionsEnabledChanged += OnIsCaptionsEnabledChanged;

private void OnIsCaptionsEnabledChanged(object sender, PropertyChangedEventArgs args)
{
    if (communicationCaptions.IsEnabled)
    {
    }
}

Добавление прослушивателя для изменения типа подписей

Это событие будет активировано при изменении типа подписи на CommunicationCaptions TeamsCaptions приглашение пользователей Microsoft 365 только для вызовов ACS.

captionsCallFeature.ActiveCaptionsTypeChanged += OnIsCaptionsTypeChanged;

private void OnIsCaptionsTypeChanged(object sender, PropertyChangedEventArgs args)
{
    // get captions
}

Добавление прослушивателя для полученных данных подписей

communicationCaptions.CaptionsReceived += OnCaptionsReceived;

private void OnCaptionsReceived(object sender, CommunicationCaptionsReceivedEventArgs eventArgs)
{
    // Information about the speaker.
    // eventArgs.Speaker
    // The original text with no transcribed.
    // eventArgs.SpokenText
    // language identifier for the speaker.
    // eventArgs.SpokenLanguage
    // 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
}

Добавление прослушивателя для получения активного состояния изменения языка

communicationCaptions.ActiveSpokenLanguageChanged += OnIsActiveSpokenLanguageChanged;

private void OnIsActiveSpokenLanguageChanged(object sender, PropertyChangedEventArgs args)
{
    // communicationCaptions.ActiveSpokenLanguage
}

Начальные подписи

После настройки всех прослушивателей теперь можно приступить к добавлению подписей.


private async void StartCaptions()
{
    var options = new StartCaptionsOptions
    {
        SpokenLanguage = "en-us"
    };
    try
    {
        await communicationCaptions.StartCaptionsAsync(options);
    }
    catch (Exception ex)
    {
    }
}

Остановки подписей

private async void StopCaptions()
{
    try
    {
        await communicationCaptions.StopCaptionsAsync();
    }
    catch (Exception ex)
    {
    }
}

Удаление полученного прослушивателя субтитров

communicationCaptions.CaptionsReceived -= OnCaptionsReceived;

Поддержка языка

Получение списка поддерживаемых языков

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

// bcp 47 formatted language code
IReadOnlyList<string> sLanguages = communicationCaptions.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 communicationCaptions.SetSpokenLanguageAsync("en-us");
    }
    catch (Exception ex)
    {
    }
}

Очистка

Дополнительные сведения о очистке ресурсов см. здесь.

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

Примечание.

Обратите внимание, что вам потребуется приложение голосового вызова с помощью Службы коммуникации Azure вызова пакетов SDK для доступа к функции закрытых подписей, описанной в этом руководстве.

Модели

Имя Описание
CaptionsCallFeature API для функции вызова подписей
CommunicationCaptions API для подписей для обмена данными
StartCaptionOptions Параметры закрытого заголовка, такие как разговорный язык
CommunicationCaptionsListener Прослушиватель для CommunicationCaptions addOnCaptionsReceivedListener
CommunicationCaptionsReceivedEvent Объект данных, полученный для каждого события CommunicationCaptionsListener

Получение функции закрытых подписей

Необходимо получить и привести объект Captions для использования определенных функций Captions.

CaptionsCallFeature captionsCallFeature = call.feature(Features.CAPTIONS);
captionsCallFeature.getCaptions().whenComplete(
    ((captions, throwable) -> {
        if (throwable == null) {
            CallCaptions callCaptions = captions;
            if (captions.getCaptionsType() == CaptionsType.COMMUNICATION_CAPTIONS) {
            // communication captions
            CommunicationCaptions communicationCaptions = (CommunicationCaptions) captions;
            }
        } else {
        // get captions failed
        // throwable is the exception/cause
        }
    }));

Подписка на прослушиватели

Добавление прослушивателя для получения подписей включено или отключено состояние

public void addOnIsCaptionsEnabledChangedListener() {
    communicationCaptions.addOnCaptionsEnabledChangedListener( (PropertyChangedEvent args) -> {
        if(communicationCaptions.isEnabled()) {
            // captions enabled
        }
    });
}

Добавление прослушивателя для изменения типа подписей

Это событие будет активировано при изменении типа подписи на CommunicationCaptions TeamsCaptions приглашение пользователей Microsoft 365 только для вызовов ACS.

public void addOnIsCaptionsTypeChangedListener() {
    captionsCallFeature.addOnActiveCaptionsTypeChangedListener( (PropertyChangedEvent args) -> {
        if(communicationCaptions.isEnabled()) {
            // captionsCallFeature.getCaptions();
        }
    });
}

Добавление прослушивателя для полученных данных подписей

CommunicationCaptionsListener captionsListener = (CommunicationCaptionsReceivedEvent args) -> {
  // Information about the speaker.
  // CallerInfo participantInfo = args.getSpeaker();
  // The original text with no transcribed.
  // args.getSpokenText();
  // language identifier for the speaker.
  // args.getSpokenLanguage();
  // 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() {
  communicationCaptions.addOnCaptionsReceivedListener(captionsListener); 
}

Добавление прослушивателя для получения активного состояния изменения языка

public void addOnActiveSpokenLanguageChangedListener() {
    communicationCaptions.addOnActiveSpokenLanguageChangedListener( (PropertyChangedEvent args) -> {
       // communicationCaptions.getActiveSpokenLanguage()
    });
}

Начальные подписи

После настройки всех прослушивателей теперь можно приступить к добавлению подписей.

public void startCaptions() {
    StartCaptionsOptions startCaptionsOptions = new StartCaptionsOptions();
    startCaptionsOptions.setSpokenLanguage("en-us");
    communicationCaptions.startCaptions(startCaptionsOptions).whenComplete((result, error) -> {
        if (error != null) {
        }
    });
}

Остановки подписей

public void stopCaptions() {
    communicationCaptions.stopCaptions().whenComplete((result, error) -> {
        if (error != null) {
        }
    });
}

Удаление полученного прослушивателя субтитров

public void removeOnCaptionsReceivedListener() {
    communicationCaptions.removeOnCaptionsReceivedListener(captionsListener);
}

Поддержка языка

Получение списка поддерживаемых языков

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

// bcp 47 formatted language code
communicationCaptions.getSupportedSpokenLanguages();

Настройка языка

Когда пользователь выбирает разговорный язык, приложение может задать язык, из которых он ожидает создания подписей.

public void setSpokenLanguage() {
    communicationCaptions.setSpokenLanguage("en-us").whenComplete((result, error) -> {
        if (error != null) {
        }
    });
}

Очистка

Дополнительные сведения о очистке ресурсов см. здесь.

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

Примечание.

Обратите внимание, что вам потребуется приложение голосового вызова с помощью Службы коммуникации Azure вызова пакетов SDK для доступа к функции закрытых подписей, описанной в этом руководстве.

Модели

Имя Описание
CaptionsCallFeature API для функции вызова подписей
CommunicationCaptions API для подписей для обмена данными
StartCaptionOptions Параметры закрытого заголовка, такие как разговорный язык
CommunicationCaptionsDelegate Делегат для подписей связи
CommunicationCaptionsReceivedEventArgs Объект данных, полученный для каждого полученного события подписей связи

Получение функции закрытых подписей

Необходимо получить и привести объект Captions для использования определенных функций Captions.

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.communicationCaptions) {
                // communication captions
                @State var communicationCaptions = value as? CommunicationCaptions
            }
        }
    }
}

Подписка на прослушиватели

Добавление прослушивателя для получения подписей включено или отключено, тип, разговорный язык, состояние языка субтитров изменено и полученные данные

Событие didChangeActiveCaptionsType будет активировано при изменении типа подписи на CommunicationCaptions TeamsCaptions приглашение пользователей Microsoft 365 только для вызовов ACS.

extension CallObserver: CommunicationCaptionsDelegate {
    // listener for receive captions enabled/disabled status
    public func communicationCaptions(_ communicationCaptions: CommunicationCaptions, didChangeCaptionsEnabledState args: PropertyChangedEventArgs) {
        // communicationCaptions.isEnabled
    }
    
    // listener for active spoken language state change
    public func communicationCaptions(_ communicationCaptions: CommunicationCaptions, didChangeActiveSpokenLanguageState args: PropertyChangedEventArgs) {
        // communicationCaptions.activeSpokenLanguage
    }
    
    // listener for captions data received
    public func communicationCaptions(_ communicationCaptions: CommunicationCaptions, didReceiveCaptions:CommunicationCaptionsReceivedEventArgs) {
            // Information about the speaker.
            // didReceiveCaptions.speaker
            // The original text with no transcribed.
            // didReceiveCaptions.spokenText
            // language identifier for the speaker.
            // didReceiveCaptions.spokenLanguage
            // 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
    }
}

communicationCaptions.delegate = self.callObserver

extension CallObserver: CaptionsCallFeatureDelegate {
    // captions type changed
    public func captionsCallFeature(_ captionsCallFeature: CaptionsCallFeature, didChangeActiveCaptionsType args: PropertyChangedEventArgs) {
        // captionsCallFeature.getCaptions to get captions
    }
}

captionsCallFeature.delegate = self.callObserver

Начальные подписи

После настройки всех прослушивателей теперь можно приступить к добавлению подписей.

func startCaptions() {
    guard let communicationCaptions = communicationCaptions else {
        return
    }
    let startCaptionsOptions = StartCaptionsOptions()
    startCaptionsOptions.spokenLanguage = "en-us"
    communicationCaptions.startCaptions(startCaptionsOptions: startCaptionsOptions, completionHandler: { (error) in
        if error != nil {
            
        }
    })
}

Остановки подписей

func stopCaptions() {
    communicationCaptions.stopCaptions(completionHandler: { (error) in
        if error != nil {
            
        }
    })
}

Удаление полученного прослушивателя субтитров

communicationCaptions?.delegate = nil

Поддержка языка

Получение списка поддерживаемых языков

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

// bcp 47 formatted language code
let spokenLanguage : String = "en-us"
for language in communicationCaptions?.supportedSpokenLanguages ?? [] {
    // choose required language
    spokenLanguage = language
}

Настройка языка

Когда пользователь выбирает разговорный язык, приложение может задать язык, из которых он ожидает создания подписей.

func setSpokenLanguage() {
    guard let communicationCaptions = self.communicationCaptions else {
        return
    }

    communicationCaptions.set(spokenLanguage: spokenLanguage, completionHandler: { (error) in
        if let error = error {
        }
    })
}

Очистка

Дополнительные сведения о очистке ресурсов см. здесь.

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

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

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

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