Compartilhar via


Habilitar as legendas ocultas para interoperabilidade do Teams

Saiba como permitir que seus usuários habilitem legendas fechadas durante um cenário de interoperabilidade do Teams em que seus usuários podem estar em uma reunião entre um usuário dos Serviços de Comunicação do Azure e um usuário cliente do Teams ou onde seus usuários estão usando os Serviços de Comunicação do Azure chamando o SDK com a identidade do Microsoft 365.

Pré-requisitos

Observação

Observe que você precisará ter um aplicativo de chamada de voz que use os Serviços de Comunicação do Azure chamando SDKs para acessar o recurso de legendas ocultas descrito neste guia.

Modelos

Nome Descrição
CaptionsCallFeature Recurso de chamada de API para legendas
TeamsCaptions API para legendas do Teams
StartCaptionOptions Opções da legenda oculta, como o idioma falado
TeamsCaptionsReceivedEventArgs Objeto de dados recebido para cada evento recebido de legendas do Teams

Obter o recurso de legendas ocultas

Usuários da Identidade Externa e usuários do Microsoft 365

Se você estiver criando um aplicativo que permita que os usuários dos Serviços de Comunicação do Azure participem de uma reunião do Teams

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

Assinar ouvintes

Adicionar um ouvinte para receber o status de legendas habilitadas/desabilitadas

teamsCaptions.CaptionsEnabledChanged += OnIsCaptionsEnabledChanged;

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

Adicionar ouvinte para os dados de legendas recebidos

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
}

Adicionar um ouvinte para receber o status alterado do idioma falado ativo

teamsCaptions.ActiveSpokenLanguageChanged += OnIsActiveSpokenLanguageChanged;

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

Adicionar um ouvinte para receber o status alterado do idioma falado ativo

teamsCaptions.ActiveCaptionLanguageChanged += OnIsActiveCaptionLanguageChanged;

private void OnIsActiveCaptionLanguageChanged(object sender, PropertyChangedEventArgs args)
{
    // teamsCaptions.ActiveCaptionLanguage
}

Iniciando legendas

Depois de configurar todos os ouvintes, agora você pode começar a adicionar legendas.


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

Parar legendas

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

Remover o ouvinte recebido da legenda

teamsCaptions.CaptionsReceived -= OnCaptionsReceived;

Suporte para idioma falado

Obter lista de idiomas falados com suporte

Obtenha uma lista dos idiomas falados com suporte que seus usuários podem selecionar ao habilitar as legendas ocultas.

// 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)
    {
    }
}

Suporte à linguagem de legenda

Obter linguagem de legenda com suporte

Se sua organização tiver uma licença Premium do Teams ativa, os usuários dos Serviços de Comunicação do Azure poderão habilitar legendas traduzidas, desde que o organizador da reunião tenha uma licença Premium do Teams. Quanto aos usuários com identidades do Microsoft 365, essa verificação será feita em relação à sua própria conta de usuário se o organizador da reunião não tiver uma licença Premium do Teams.

// ISO 639-1 formatted language code
IReadOnlyList<string> cLanguages = teamsCaptions.SupportedCaptionLanguages;

Definir idioma da legenda

public async void SetCaptionLanguage()
{
    try
    {
        await teamsCaptions.SetCaptionLanguageAsync("en");
    }
    catch (Exception ex)
    {
    }
}

Pré-requisitos

Observação

Observe que você precisará ter um aplicativo de chamada de voz que use os Serviços de Comunicação do Azure chamando SDKs para acessar o recurso de legendas ocultas descrito neste guia.

Modelos

Nome Descrição
CaptionsCallFeature API para legendas
CaptionsCommon Classe base para legendas
StartCaptionOptions Opções da legenda oculta, como o idioma falado
TeamsCaptionHandler Definição de retorno de chamada para manipular o evento CaptionsReceivedEventType
TeamsCaptionsInfo Estrutura de dados recebida para cada evento CaptionsReceivedEventType

Obter o recurso de legendas ocultas

Usuários da Identidade Externa

Se você estiver criando um aplicativo que permita que os usuários dos Serviços de Comunicação do Azure participem de uma reunião do Teams.

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

Usuários do Microsoft 365

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

Obter objeto de legendas do Teams

Você precisa obter e converter o objeto de legendas para utilizar recursos específicos de legendas.

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

Assinar ouvintes

Adicionar um ouvinte para receber os status de ativo/inativo das legendas

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

Adicionar um ouvinte para os dados de legendas recebidos

Manipule o objeto de dados TeamsCaptionsInfo retornado.

Observação: o objeto contém uma propriedade resultType que indica se os dados são uma legenda parcial ou uma versão finalizada da legenda. ResultType partial indica uma legenda dinâmica não editada, enquanto final indica uma versão interpretada finalizada da frase (ou seja, inclui pontuação e capitalização).

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

Adicionar um ouvinte para receber o status alterado do idioma falado

const spokenLanguageChangedHandler = () => {
    if (teamsCaptions.activeSpokenLanguage !== currentSpokenLanguage) {
        /* USER CODE HERE - E.G. RENDER TO DOM */
    }
}
teamsCaptions.on('SpokenLanguageChanged', spokenLanguageChangedHandler)

Adicionar um ouvinte para receber o status alterado do idioma falado

const captionLanguageChangedHandler = () => {
    if (teamsCaptions.activeCaptionLanguage !== currentCaptionLanguage) {
        /* USER CODE HERE - E.G. RENDER TO DOM */
    }
}
teamsCaptions.on('CaptionLanguageChanged', captionLanguageChangedHandler)

Iniciando legendas

Depois de configurar todos os ouvintes, agora você pode começar a adicionar legendas.

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

Parar legendas

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

Cancelar a assinatura de ouvintes

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

Suporte para idioma falado

Obter uma lista dos idiomas falados com suporte

Obtenha uma lista dos idiomas falados com suporte que seus usuários podem selecionar ao habilitar as legendas ocultas. A propriedade retorna uma matriz de idiomas no formato BCP 47.

const spokenLanguages = teamsCaptions.supportedSpokenLanguages; 

Definir o idioma falado

Passe um valor na matriz de idiomas falados com suporte para garantir que o idioma solicitado tenha suporte. Por padrão, se a Contoso não fornecer nenhum idioma ou fornecer um idioma sem suporte, o idioma falado padrão será '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 */
}

Suporte ao idioma de legenda

Obter uma lista de idiomas de legenda com suporte

Se sua organização tiver uma licença Premium do Teams ativa, você poderá permitir que os usuários usem legendas traduzidas fornecidas pelas legendas do Teams. Quanto aos usuários com uma identidade do Microsoft 365, se o organizador da reunião não tiver uma licença Premium do Teams ativa, a verificação de idioma de legendas será feita na conta de usuários do Microsoft 365.

A propriedade retorna uma matriz de códigos de idioma de duas letras no padrão ISO 639-1.

const captionLanguages = teamsCaptions.supportedCaptionLanguages;

Definir idioma da legenda

// 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 */
}

Pré-requisitos

Observação

Observe que você precisará ter um aplicativo de chamada de voz que use os Serviços de Comunicação do Azure chamando SDKs para acessar o recurso de legendas ocultas descrito neste guia.

Modelos

Nome Descrição
CaptionsCallFeature Recurso de chamada de API para legendas
TeamsCaptions API para legendas do Teams
StartCaptionOptions Opções da legenda oculta, como o idioma falado
TeamsCaptionsListener Ouvinte do TeamsCaptions addOnCaptionsReceivedListener
TeamsCaptionsReceivedEvent Objeto de dados recebido para cada evento TeamsCaptionsListener

Obter o recurso de legendas ocultas

Usuários da Identidade Externa e usuários do Microsoft 365

Se você estiver criando um aplicativo que permita que os usuários participem de uma reunião do 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
        }
    }));

Assinar ouvintes

Adicionar um ouvinte para receber o status de legendas habilitadas/desabilitadas

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

Adicionar ouvinte para os dados de legendas recebidos

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

Adicionar um ouvinte para receber o status alterado do idioma falado ativo

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

Adicionar um ouvinte para receber o status alterado do idioma falado ativo

public void addOnActiveCaptionLanguageChangedListener() {
    teamsCaptions.addOnActiveCaptionLanguageChangedListener( (PropertyChangedEvent args) -> {
       // teamsCaptions.getActiveCaptionLanguage()
    });
}

Iniciando legendas

Depois de configurar todos os ouvintes, agora você pode começar a adicionar legendas.

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

Parar legendas

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

Remover o ouvinte recebido da legenda

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

Suporte para idioma falado

Obter lista de idiomas falados com suporte

Obtenha uma lista dos idiomas falados com suporte que seus usuários podem selecionar ao habilitar as legendas ocultas.

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

Definir o idioma falado

Quando o usuário seleciona o idioma falado, seu aplicativo pode definir o idioma falado a partir do qual espera que as legendas sejam geradas.

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

Suporte ao idioma de legenda

Obter linguagem de legenda com suporte

Se sua organização tiver uma licença Premium do Teams ativa, os usuários dos Serviços de Comunicação do Azure poderão habilitar legendas traduzidas, desde que o organizador da reunião tenha uma licença Premium do Teams. Quanto aos usuários com identidades do Microsoft 365, essa verificação será feita em relação à sua própria conta de usuário se o organizador da reunião não tiver uma licença Premium do Teams.

// ISO 639-1 formatted language code
teamsCaptions.getSupportedCaptionLanguages();

Definir idioma da legenda

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

Pré-requisitos

Observação

Observe que você precisará ter um aplicativo de chamada de voz que use os Serviços de Comunicação do Azure chamando SDKs para acessar o recurso de legendas ocultas descrito neste guia.

Modelos

Nome Descrição
CaptionsCallFeature Recurso de chamada de API para legendas
TeamsCaptions API para legendas do Teams
StartCaptionOptions Opções da legenda oculta, como o idioma falado
TeamsCaptionsDelegate Delegar para legendas do Teams
TeamsCaptionsReceivedEventArgs Objeto de dados recebido para cada evento recebido de legendas do Teams

Obter o recurso de legendas ocultas

Usuários da Identidade Externa e usuários do Microsoft 365

Se você estiver criando um aplicativo que permita que os usuários dos Serviços de Comunicação do Azure participem de uma reunião do 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
            }
        }
    }
}

Assinar ouvintes

Adicione um ouvinte para receber legendas habilitadas/desabilitadas, tipo, idioma falado, status da linguagem de legenda alterado e dados recebidos

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

Iniciando legendas

Depois de configurar todos os ouvintes, agora você pode começar a adicionar legendas.

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

Parar legendas

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

Remover o ouvinte recebido da legenda

teamsCaptions?.delegate = nil

Suporte para idioma falado

Obter lista de idiomas falados com suporte

Obtenha uma lista dos idiomas falados com suporte que seus usuários podem selecionar ao habilitar as legendas ocultas.

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

Definir o idioma falado

Quando o usuário seleciona o idioma falado, seu aplicativo pode definir o idioma falado a partir do qual espera que as legendas sejam geradas.

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

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

Suporte ao idioma de legenda

Obter linguagem de legenda com suporte

Se sua organização tiver uma licença Premium do Teams ativa, os usuários dos Serviços de Comunicação do Azure poderão habilitar legendas traduzidas, desde que o organizador da reunião tenha uma licença Premium do Teams. Quanto aos usuários com identidades do Microsoft 365, essa verificação será feita em relação à sua própria conta de usuário se o organizador da reunião não tiver uma licença Premium do Teams.

// ISO 639-1 formatted language code
let captionLanguage : String = "en"
for language in teamsCaptions?.supportedCaptionLanguages ?? [] {
    // choose required language
    captionLanguage = language
}

Definir idioma da legenda

func setCaptionLanguage() {
    guard let teamsCaptions = self.teamsCaptions else {
        return
    }

    teamsCaptions.set(captionLanguage: captionLanguage, completionHandler: { (error) in
        if let error = error {
        }
    })
}

Limpar os recursos

Se quiser limpar e remover uma assinatura dos Serviços de Comunicação, exclua o recurso ou o grupo de recursos. Excluir o grupo de recursos também exclui todos os recursos associados a ele. Saiba mais sobre como limpar os recursos aqui.

Próximas etapas

Para obter mais informações, consulte os seguintes artigos: