Partilhar via


Habilitar legendas ocultas para interoperabilidade do Teams

Saiba como permitir que seus usuários habilitem legendas ocultas 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 o SDK de chamada dos Serviços de Comunicação do Azure com sua identidade do Microsoft 365.

Pré-requisitos

Nota

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

Modelos

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

Obter recurso de legendas ocultas

Usuários de 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;
} 

Inscreva-se para ouvintes

Adicionar um ouvinte para receber legendas ativadas/desativadas

teamsCaptions.CaptionsEnabledChanged += OnIsCaptionsEnabledChanged;

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

Adicionar ouvinte para 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 da legenda ativa

teamsCaptions.ActiveCaptionLanguageChanged += OnIsActiveCaptionLanguageChanged;

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

Legendas iniciais

Depois de configurar todos os ouvintes, 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 a legenda recebida ouvinte

teamsCaptions.CaptionsReceived -= OnCaptionsReceived;

Suporte a idiomas falados

Obter lista de idiomas falados suportados

Obtenha uma lista de idiomas falados suportados que seus usuários podem selecionar ao ativar 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 ao idioma da legenda

Obter idioma de legenda suportado

Se sua organização tiver uma licença premium ativa do Teams, 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 é 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

Nota

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

Modelos

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

Obter recurso de legendas ocultas

Usuários de 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);

Utilizadores do Microsoft 365

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

Obter objeto de legendas de equipes

Você precisa obter e transmitir o objeto Teams Captions para utilizar os recursos específicos do Teams Captions

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

Inscreva-se para ouvintes

Adicionar um ouvinte para receber legendas status ativo/inativo

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

Adicionar um ouvinte para dados de legendas recebidos

Manipule o objeto de dados TeamsCaptionsInfo retornado.

Nota: O objeto contém um prop resultType que indica se os dados são uma legenda parcial ou uma versão finalizada da legenda. ResultType partial indica legenda ao vivo não editada, enquanto final indica uma versão interpretada finalizada da frase (ou seja, inclui pontuação e maiúsculas).

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 de idioma falado alterado

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 da legenda

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

Legendas iniciais

Depois de configurar todos os ouvintes, 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 inscrição para ouvintes

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

Suporte a idiomas falados

Obter uma lista de idiomas falados suportados

Obtenha uma lista de idiomas falados suportados que seus usuários podem selecionar ao ativar legendas ocultas. A propriedade retorna uma matriz de idiomas no formato bcp 47.

const spokenLanguages = teamsCaptions.supportedSpokenLanguages; 

Definir idioma falado

Passe um valor da matriz de idiomas falados suportados para garantir que o idioma solicitado seja suportado. Por padrão, se a contoso não fornecer nenhum idioma ou um idioma sem suporte, o idioma falado assumirá como padrão '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 da legenda

Obter uma lista de idiomas de legenda suportados

Se sua organização tiver uma licença premium ativa do Teams, você poderá permitir que seus 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 ativa do Teams, a verificação do idioma das legendas será feita em relação à conta de usuários do Microsoft 365.

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

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

Nota

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

Modelos

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

Obter recurso de legendas ocultas

Usuários de 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
        }
    }));

Inscreva-se para ouvintes

Adicionar um ouvinte para receber legendas ativadas/desativadas

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

Adicionar ouvinte para 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 da legenda ativa

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

Legendas iniciais

Depois de configurar todos os ouvintes, 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 a legenda recebida ouvinte

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

Suporte a idiomas falados

Obter lista de idiomas falados suportados

Obtenha uma lista de idiomas falados suportados que seus usuários podem selecionar ao ativar legendas ocultas.

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

Definir 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 da legenda

Obter idioma de legenda suportado

Se sua organização tiver uma licença premium ativa do Teams, 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 é 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

Nota

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

Modelos

Nome Descrição
CaptionsCallFeature API para recurso de chamada de legendas
EquipasLegendas Legendas da API para equipes
StartCaptionOptions Opções de legenda oculta, como idioma falado
EquipasLegendasDelegado Delegado para legendas do Teams
TeamsCaptionsReceivedEventArgs Objeto de dados recebido para cada evento de legendas recebidas do Teams

Obter recurso de legendas ocultas

Usuários de 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
            }
        }
    }
}

Inscreva-se para ouvintes

Adicionar um ouvinte para receber legendas ativadas/desativadas, idioma falado, status do idioma da 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

Legendas iniciais

Depois de configurar todos os ouvintes, 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 a legenda recebida ouvinte

teamsCaptions?.delegate = nil

Suporte a idiomas falados

Obter lista de idiomas falados suportados

Obtenha uma lista de idiomas falados suportados que seus usuários podem selecionar ao ativar legendas ocultas.

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

Definir 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 da legenda

Obter idioma de legenda suportado

Se sua organização tiver uma licença premium ativa do Teams, 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 é 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 {
        }
    })
}

Clean up resources (Limpar recursos)

Se quiser limpar e remover uma assinatura dos Serviços de Comunicação, você pode excluir o recurso ou grupo de recursos. A exclusão do grupo de recursos também exclui quaisquer outros recursos associados a ele. Saiba mais sobre a limpeza de recursos aqui.

Próximos passos

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