Partager via


Activer les sous-titres pour l’interopérabilité de Teams

Découvrez comment autoriser vos utilisateurs à activer les sous-titres pendant un scénario d’interopérabilité Teams où vos utilisateurs peuvent être en réunion entre un utilisateur Azure Communication Services et un utilisateur client Teams, ou où vos utilisateurs utilisent le Kit de développement logiciel (SDK) d’appel d’Azure Communication Services avec leur identité Microsoft 365.

Prérequis

Remarque

Veuillez noter que vous devez avoir une application d’appel vocal utilisant des Kits de développement logiciel (SDK) d’appel Azure Communication Services pour accéder à la fonctionnalité des sous-titres décrite dans ce guide.

Modèles

Nom Description
CaptionsCallFeature API pour la fonction d'appel de sous-titres
TeamsCaptions API pour les sous-titres Teams
StartCaptionOptions Options de sous-titre comme la langue parlée
TeamsCaptionsReceivedEventArgs Objet de données reçu pour chaque événement reçu de sous-titres Teams

Obtenir la fonctionnalité des sous-titres

Utilisateurs d’identités externes et utilisateurs Microsoft 365

Si vous créez une application qui permet aux utilisateurs d’Azure Communication Services de participer à une réunion Teams

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

S’abonner aux écouteurs

Ajouter un écouteur pour recevoir d’état activée ou désactivé de sous-titres

teamsCaptions.CaptionsEnabledChanged += OnIsCaptionsEnabledChanged;

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

Ajouter un écouteur pour des données de sous-titres reçues

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
}

Ajouter un écouteur pour recevoir l’état modifié actif de la langue parlée

teamsCaptions.ActiveSpokenLanguageChanged += OnIsActiveSpokenLanguageChanged;

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

Ajouter un écouteur pour recevoir l’état modifié actif de la langue de sous-titres active

teamsCaptions.ActiveCaptionLanguageChanged += OnIsActiveCaptionLanguageChanged;

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

Démarrer les sous-titres

Une fois tous vos écouteurs configurés, vous pouvez désormais ajouter vos sous-titres.


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

Arrêter des sous-titres

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

Supprimer la légende reçue par l'auditeur

teamsCaptions.CaptionsReceived -= OnCaptionsReceived;

Prise en charge de la langue parlée

Obtenir une liste des langues parlées prises en charge

Obtenez une liste des langues parlées prises en charge que vos utilisateurs peuvent sélectionner quand ils activent les sous-titres.

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

Prise en charge des langues de sous-titres

Obtenir la langue de sous-titres prise en charge

Si votre organisation dispose d’une licence Teams Premium active, vos utilisateurs Azure Communication Services peuvent activer les sous-titres traduits tant que l’organisateur de la réunion dispose d’une licence Teams Premium. Comme pour les utilisateurs disposant d’identités Microsoft 365, cette vérification est effectuée par rapport à leur propre compte d’utilisateur si l’organisateur de la réunion n’a pas de licence Teams Premium.

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

Définir la langue des sous-titres

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

Prérequis

Remarque

Veuillez noter que vous devez avoir une application d’appel vocal utilisant des Kits de développement logiciel (SDK) d’appel Azure Communication Services pour accéder à la fonctionnalité des sous-titres décrite dans ce guide.

Modèles

Nom Description
CaptionsCallFeature API pour les sous-titres
CaptionsCommon Classe de base pour les sous-titres
StartCaptionOptions Options de sous-titre comme la langue parlée
TeamsCaptionHandler Définition de rappel pour gérer un événement CaptionsReceivedEventType
TeamsCaptionsInfo Structure de données reçue pour chaque événement CaptionsReceivedEventType

Obtenir la fonctionnalité des sous-titres

Utilisateurs d’identités externes

Si vous créez une application qui permet aux utilisateurs d’Azure Communication Services de participer à une réunion Teams.

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

Utilisateurs Microsoft 365

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

Obtenir l’objet de sous-titres Teams

Vous devez obtenir et effectuer un cast de l’objet des sous-titres Teams pour utiliser des fonctionnalités spécifiques des sous-titres Teams.

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

S’abonner aux écouteurs

Ajouter un écouteur pour recevoir d’état actif/inactif de sous-titres

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

Ajouter un écouteur pour des données de sous-titres reçues

Gérez l’objet de données TeamsCaptionsInfo renvoyé.

Remarque : l’objet contient une propriété resultType qui indique si les données constituent un sous-titre partiel ou une version finalisée du sous-titre. ResultType partial indique un sous-titre en direct non modifié, tandis que final indique une version interprétée finalisée de la phrase (par exemple, inclut la ponctuation et l’utilisation de majuscules).

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

Ajouter un écouteur pour recevoir l’état modifié de la langue parlée

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

Ajouter un écouteur pour recevoir l’état de langue des sous-titres modifié

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

Démarrer les sous-titres

Une fois tous vos écouteurs configurés, vous pouvez désormais ajouter vos sous-titres.

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

Arrêter des sous-titres

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

Se désabonner des écouteurs

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

Prise en charge de la langue parlée

Obtenir une liste des langues parlées prises en charge

Obtenez une liste des langues parlées prises en charge que vos utilisateurs peuvent sélectionner quand ils activent les sous-titres. La propriété renvoie un tableau de langues au format BCP 47.

const spokenLanguages = teamsCaptions.supportedSpokenLanguages; 

Définir une langue parlée

Transmettez une valeur à partir du tableau de langues parlées prises en charge pour vérifier que la langue demandée est prise en charge. Par défaut, si Contoso ne fournit aucune langue ou fournit une langue non prise en charge, la valeur par défaut de la langue parlée est « 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 */
}

Prise en charge des langues de sous-titres

Obtenir la liste des langues de sous-titres prises en charge

Si votre organisation dispose d’une licence Teams Premium active, vous pouvez autoriser vos utilisateurs à utiliser des sous-titres traduits fournis par Teams. Comme pour les utilisateurs disposant d’une identité Microsoft 365, si l’organisateur de la réunion n’a pas de licence Teams Premium active, la vérification de la langue des sous-titres est effectuée par rapport au compte d’utilisateurs Microsoft 365.

La propriété retourne un tableau de codes de langue à deux lettres dans la norme ISO 639-1.

const captionLanguages = teamsCaptions.supportedCaptionLanguages;

Définir la langue des sous-titres

// 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érequis

Remarque

Veuillez noter que vous devez avoir une application d’appel vocal utilisant des Kits de développement logiciel (SDK) d’appel Azure Communication Services pour accéder à la fonctionnalité des sous-titres décrite dans ce guide.

Modèles

Nom Description
CaptionsCallFeature API pour la fonction d'appel de sous-titres
TeamsCaptions API pour les sous-titres Teams
StartCaptionOptions Options de sous-titre comme la langue parlée
TeamsCaptionsListener Écouteur pour TeamsCaptions addOnCaptionsReceivedListener
TeamsCaptionsReceivedEvent Objet de données reçu pour chaque événement TeamsCaptionsListener

Obtenir la fonctionnalité des sous-titres

Utilisateurs d’identités externes et utilisateurs Microsoft 365

Si vous créez une application qui permet aux utilisateurs de participer à une réunion 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
        }
    }));

S’abonner aux écouteurs

Ajouter un écouteur pour recevoir d’état activée ou désactivé de sous-titres

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

Ajouter un écouteur pour des données de sous-titres reçues

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

Ajouter un écouteur pour recevoir l’état modifié actif de la langue parlée

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

Ajouter un écouteur pour recevoir l’état modifié actif de la langue de sous-titres active

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

Démarrer les sous-titres

Une fois tous vos écouteurs configurés, vous pouvez désormais ajouter vos sous-titres.

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

Arrêter des sous-titres

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

Supprimer la légende reçue par l'auditeur

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

Prise en charge de la langue parlée

Obtenir une liste des langues parlées prises en charge

Obtenez une liste des langues parlées prises en charge que vos utilisateurs peuvent sélectionner quand ils activent les sous-titres.

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

Définir une langue parlée

Lorsque l'utilisateur sélectionne la langue parlée, votre application peut définir la langue parlée à partir de laquelle elle s'attend à ce que les sous-titres soient générés.

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

Prise en charge des langues de sous-titres

Obtenir la langue de sous-titres prise en charge

Si votre organisation dispose d’une licence Teams Premium active, vos utilisateurs Azure Communication Services peuvent activer les sous-titres traduits tant que l’organisateur de la réunion dispose d’une licence Teams Premium. Comme pour les utilisateurs disposant d’identités Microsoft 365, cette vérification est effectuée par rapport à leur propre compte d’utilisateur si l’organisateur de la réunion n’a pas de licence Teams Premium.

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

Définir la langue des sous-titres

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

Prérequis

Remarque

Veuillez noter que vous devez avoir une application d’appel vocal utilisant des Kits de développement logiciel (SDK) d’appel Azure Communication Services pour accéder à la fonctionnalité des sous-titres décrite dans ce guide.

Modèles

Nom Description
CaptionsCallFeature API pour la fonction d'appel de sous-titres
TeamsCaptions API pour les sous-titres Teams
StartCaptionOptions Options de sous-titre comme la langue parlée
TeamsCaptionsDelegate Délégué pour les sous-titres Teams
TeamsCaptionsReceivedEventArgs Objet de données reçu pour chaque événement reçu de sous-titres Teams

Obtenir la fonctionnalité des sous-titres

Utilisateurs d’identités externes et utilisateurs Microsoft 365

Si vous créez une application qui permet aux utilisateurs d’Azure Communication Services de participer à une réunion 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
            }
        }
    }
}

S’abonner aux écouteurs

Ajouter un auditeur pour recevoir les sous-titres activés ou désactivés, la langue parlée, le changement d'état de la langue des sous-titres et les données reçues

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

Démarrer les sous-titres

Une fois tous vos écouteurs configurés, vous pouvez désormais ajouter vos sous-titres.

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

Arrêter des sous-titres

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

Supprimer la légende reçue par l'auditeur

teamsCaptions?.delegate = nil

Prise en charge de la langue parlée

Obtenir une liste des langues parlées prises en charge

Obtenez une liste des langues parlées prises en charge que vos utilisateurs peuvent sélectionner quand ils activent les sous-titres.

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

Définir une langue parlée

Lorsque l'utilisateur sélectionne la langue parlée, votre application peut définir la langue parlée à partir de laquelle elle s'attend à ce que les sous-titres soient générés.

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

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

Prise en charge des langues de sous-titres

Obtenir la langue de sous-titres prise en charge

Si votre organisation dispose d’une licence Teams Premium active, vos utilisateurs Azure Communication Services peuvent activer les sous-titres traduits tant que l’organisateur de la réunion dispose d’une licence Teams Premium. Comme pour les utilisateurs disposant d’identités Microsoft 365, cette vérification est effectuée par rapport à leur propre compte d’utilisateur si l’organisateur de la réunion n’a pas de licence Teams Premium.

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

Définir la langue des sous-titres

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

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

Nettoyer les ressources

Si vous voulez nettoyer et supprimer un abonnement Communication Services, vous pouvez supprimer la ressource ou le groupe de ressources. La suppression du groupe de ressources efface également les autres ressources qui y sont associées. Apprenez-en davantage sur le nettoyage des ressources.

Étapes suivantes

Pour plus d’informations, consultez les articles suivants :