Povolení skrytých titulků pro interoperabilitu Teams

Zjistěte, jak uživatelům umožnit povolit skryté titulky ve scénáři interoperability Teams, kdy se vaši uživatelé můžou účastnit schůzky mezi uživatelem Azure Communication Services a uživatelem klienta Teams nebo kde vaši uživatelé používají sadu SDK služby Azure Communication Services s jejich identitou Microsoftu 365.

Požadavky

Poznámka:

Upozorňujeme, že pro přístup k funkci skrytých titulků, která je popsaná v této příručce, budete potřebovat aplikaci pro hlasové volání pomocí sad SDK služby Azure Communication Services.

Modely

Název Popis
CaptionsCallFeature Rozhraní API pro funkci volání titulků
TeamsCaptions Rozhraní API pro titulky Teams
StartCaptionOptions Možnosti skrytých titulků, jako je mluvený jazyk
TeamsCaptionsReceivedEventArgs Datový objekt přijatý pro každou událost přijetí titulků Teams

Získání funkce skrytých titulků

Uživatelé externí identity a uživatelé Microsoftu 365

Pokud vytváříte aplikaci, která uživatelům Azure Communication Services umožňuje připojit se ke schůzce Teams

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

Přihlášení k odběru naslouchacích procesů

Přidání naslouchacího procesu pro příjem povolených nebo zakázaných titulků

teamsCaptions.CaptionsEnabledChanged += OnIsCaptionsEnabledChanged;

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

Přidání naslouchacího procesu pro přijatá data titulků

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
}

Přidání naslouchacího procesu pro příjem stavu změny aktivního mluveného jazyka

teamsCaptions.ActiveSpokenLanguageChanged += OnIsActiveSpokenLanguageChanged;

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

Přidání naslouchacího procesu pro příjem stavu změny jazyka aktivních titulků

teamsCaptions.ActiveCaptionLanguageChanged += OnIsActiveCaptionLanguageChanged;

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

Spustit titulky

Jakmile nastavíte všechny naslouchací procesy, můžete začít přidávat titulky.


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

Zastavení titulků

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

Odebrání naslouchacího procesu přijetí titulku

teamsCaptions.CaptionsReceived -= OnCaptionsReceived;

Podpora mluveného jazyka

Získání seznamu podporovaných mluvených jazyků

Získejte seznam podporovaných mluvených jazyků, ze kterých můžou uživatelé vybírat při povolování skrytých titulků.

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

Podpora jazyka titulků

Získání podporovaného jazyka titulků

Pokud má vaše organizace aktivní licenci Teams Premium, můžou uživatelé služeb Azure Communication Services povolit přeložené titulky, pokud má organizátor schůzky licenci Teams Premium. Pokud organizátor schůzky nemá licenci Teams Premium, platí pro uživatele s identitami Microsoftu 365, tato kontrola se provádí na jejich vlastním uživatelském účtu.

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

Nastavení jazyka titulků

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

Požadavky

Poznámka:

Upozorňujeme, že pro přístup k funkci skrytých titulků, která je popsaná v této příručce, budete potřebovat aplikaci pro hlasové volání pomocí sad SDK služby Azure Communication Services.

Modely

Název Popis
CaptionsCallFeature Rozhraní API pro titulky
TitulkyCommon Základní třída titulků
StartCaptionOptions Možnosti skrytých titulků, jako je mluvený jazyk
TeamsCaptionHandler Definice zpětného volání pro zpracování události CaptionsReceivedEventType
TeamsCaptionsInfo Přijatá datová struktura pro každou událost CaptionsReceivedEventType

Získání funkce skrytých titulků

Uživatelé externí identity

Pokud vytváříte aplikaci, která umožňuje uživatelům Azure Communication Services připojit se ke schůzce Teams.

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

Uživatelé Microsoftu 365

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

Získání objektu titulků týmů

Abyste mohli využívat specifické funkce titulků Teams, musíte získat a přetypovat objekt Titulky Teams.

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

Přihlášení k odběru naslouchacích procesů

Přidání naslouchacího procesu pro příjem aktivního nebo neaktivního stavu titulků

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

Přidání naslouchacího procesu pro přijatá data titulků

Zpracujte vrácený datový objekt TeamsCaptionsInfo.

Poznámka: Objekt obsahuje vlastnost resultType prop, která označuje, zda jsou data částečným titulkem nebo finalizovanou verzí titulku. ResultType partial označuje živý needitovaný titulek, zatímco final označuje finalizovanou interpretovanou verzi věty (tj. zahrnuje interpunkci a velká písmena).

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

Přidání naslouchacího procesu pro příjem stavu změně mluveného jazyka

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

Přidání naslouchacího procesu pro příjem stavu změně jazyka titulků

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

Spustit titulky

Jakmile nastavíte všechny naslouchací procesy, můžete začít přidávat titulky.

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

Zastavení titulků

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

Odhlášení odběru pro naslouchací procesy

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

Podpora mluveného jazyka

Získání seznamu podporovaných mluvených jazyků

Získejte seznam podporovaných mluvených jazyků, ze kterých můžou uživatelé vybírat při povolování skrytých titulků. Vlastnost vrátí pole jazyků ve formátu bcp 47.

const spokenLanguages = teamsCaptions.supportedSpokenLanguages; 

Nastavení mluveného jazyka

Předejte hodnotu z pole podporovaných mluvených jazyků, abyste zajistili podporu požadovaného jazyka. Pokud contoso ve výchozím nastavení neposkytuje žádný jazyk nebo nepodporovaný jazyk, je mluvený jazyk ve výchozím nastavení "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 */
}

Podpora jazyka titulků

Získání seznamu podporovaných jazyků titulků

Pokud má vaše organizace aktivní licenci Teams Premium, můžete uživatelům povolit používat přeložené titulky poskytované titulky Teams. Pokud organizátor schůzky nemá aktivní licenci Teams Premium, pro uživatele s identitou Microsoftu 365 platí, že kontrola jazyka titulků se provádí u účtu uživatelů Microsoftu 365.

Vlastnost vrátí pole dvoumísmenných kódů jazyka ve ISO 639-1 standardu.

const captionLanguages = teamsCaptions.supportedCaptionLanguages;

Nastavení jazyka titulků

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

Požadavky

Poznámka:

Upozorňujeme, že pro přístup k funkci skrytých titulků, která je popsaná v této příručce, budete potřebovat aplikaci pro hlasové volání pomocí sad SDK služby Azure Communication Services.

Modely

Název Popis
CaptionsCallFeature Rozhraní API pro funkci volání titulků
TeamsCaptions Rozhraní API pro titulky Teams
StartCaptionOptions Možnosti skrytých titulků, jako je mluvený jazyk
TeamsCaptionsListener Naslouchací proces pro doplněk TeamsCaptionsReceivedListener
TeamsCaptionsReceivedEvent Datový objekt přijatý pro každou událost TeamsCaptionsListener

Získání funkce skrytých titulků

Uživatelé externí identity a uživatelé Microsoftu 365

Pokud vytváříte aplikaci, která uživatelům umožňuje připojit se ke schůzce 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
        }
    }));

Přihlášení k odběru naslouchacích procesů

Přidání naslouchacího procesu pro příjem povolených nebo zakázaných titulků

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

Přidání naslouchacího procesu pro přijatá data titulků

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

Přidání naslouchacího procesu pro příjem stavu změny aktivního mluveného jazyka

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

Přidání naslouchacího procesu pro příjem stavu změny jazyka aktivních titulků

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

Spustit titulky

Jakmile nastavíte všechny naslouchací procesy, můžete začít přidávat titulky.

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

Zastavení titulků

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

Odebrání naslouchacího procesu přijetí titulku

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

Podpora mluveného jazyka

Získání seznamu podporovaných mluvených jazyků

Získejte seznam podporovaných mluvených jazyků, ze kterých můžou uživatelé vybírat při povolování skrytých titulků.

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

Nastavení mluveného jazyka

Když uživatel vybere mluvený jazyk, může vaše aplikace nastavit mluvený jazyk, ze kterého očekává vygenerování titulků.

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

Podpora jazyka titulků

Získání podporovaného jazyka titulků

Pokud má vaše organizace aktivní licenci Teams Premium, můžou uživatelé služeb Azure Communication Services povolit přeložené titulky, pokud má organizátor schůzky licenci Teams Premium. Pokud organizátor schůzky nemá licenci Teams Premium, platí pro uživatele s identitami Microsoftu 365, tato kontrola se provádí na jejich vlastním uživatelském účtu.

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

Nastavení jazyka titulků

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

Požadavky

Poznámka:

Upozorňujeme, že pro přístup k funkci skrytých titulků, která je popsaná v této příručce, budete potřebovat aplikaci pro hlasové volání pomocí sad SDK služby Azure Communication Services.

Modely

Název Popis
CaptionsCallFeature Rozhraní API pro funkci volání titulků
TeamsCaptions Rozhraní API pro titulky Teams
StartCaptionOptions Možnosti skrytých titulků, jako je mluvený jazyk
TeamsCaptionsDelegate Delegát pro titulky Teams
TeamsCaptionsReceivedEventArgs Datový objekt přijatý pro každou událost přijetí titulků Teams

Získání funkce skrytých titulků

Uživatelé externí identity a uživatelé Microsoftu 365

Pokud vytváříte aplikaci, která uživatelům Azure Communication Services umožňuje připojit se ke schůzce 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
            }
        }
    }
}

Přihlášení k odběru naslouchacích procesů

Přidání naslouchacího procesu pro příjem titulků s povoleným nebo zakázaným, mluveným jazykem, změněným stavem jazyka titulků a přijatými daty

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

Spustit titulky

Jakmile nastavíte všechny naslouchací procesy, můžete začít přidávat titulky.

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

Zastavení titulků

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

Odebrání naslouchacího procesu přijetí titulku

teamsCaptions?.delegate = nil

Podpora mluveného jazyka

Získání seznamu podporovaných mluvených jazyků

Získejte seznam podporovaných mluvených jazyků, ze kterých můžou uživatelé vybírat při povolování skrytých titulků.

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

Nastavení mluveného jazyka

Když uživatel vybere mluvený jazyk, může vaše aplikace nastavit mluvený jazyk, ze kterého očekává vygenerování titulků.

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

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

Podpora jazyka titulků

Získání podporovaného jazyka titulků

Pokud má vaše organizace aktivní licenci Teams Premium, můžou uživatelé služeb Azure Communication Services povolit přeložené titulky, pokud má organizátor schůzky licenci Teams Premium. Pokud organizátor schůzky nemá licenci Teams Premium, platí pro uživatele s identitami Microsoftu 365, tato kontrola se provádí na jejich vlastním uživatelském účtu.

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

Nastavení jazyka titulků

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

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

Vyčištění prostředků

Pokud chcete vyčistit a odebrat předplatné služby Communication Services, můžete odstranit prostředek nebo skupinu prostředků. Odstraněním skupiny prostředků se odstraní také všechny ostatní prostředky, které jsou k ní přidružené. Další informace o čištění prostředků najdete tady.

Další kroky

Další informace najdete v následujících článcích: