次の方法で共有


Teams の相互運用性のためにクローズド キャプションを有効にする

ユーザーが Azure Communication Services ユーザーと Teams クライアント ユーザーとの会議に参加している可能性がある場合や、ユーザーが Microsoft 365 ID で Azure Communication Services 通話 SDK を使用しているといった Teams の相互運用性シナリオで、ユーザーがクローズド キャプションを有効にできるようにする方法について説明します。

前提条件

Note

このガイドで説明されているクローズド キャプション機能にアクセスするには、Azure Communication Services の Calling SDK を使用する音声通話アプリが必要であることに注意してください。

モデル

名前 説明
CaptionsCallFeature キャプション呼び出し機能に使用する API
TeamsCaptions Teams のキャプション用 API
StartCaptionOptions 音声言語などのクローズド キャプションのオプション
TeamsCaptionsReceivedEventArgs イベントを受信した Teams のキャプションごとに受信したデータ オブジェクト

クローズド キャプション機能を取得する

外部 ID ユーザーと Microsoft 365 ユーザー

Azure Communication Services ユーザーが Teams 会議に参加できるようにするアプリケーションを構築する場合

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

リスナーをサブスクライブする

有効/無効状態のキャプションを受け取るリスナーを追加する

teamsCaptions.CaptionsEnabledChanged += OnIsCaptionsEnabledChanged;

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

受信したキャプション データのリスナーを追加する

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
}

アクティブな音声言語の変更状態を受け取るリスナーを追加する

teamsCaptions.ActiveSpokenLanguageChanged += OnIsActiveSpokenLanguageChanged;

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

アクティブなキャプション言語の変更状態を受け取るリスナーを追加する

teamsCaptions.ActiveCaptionLanguageChanged += OnIsActiveCaptionLanguageChanged;

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

キャプションを開始する

すべてのリスナーを設定したら、キャプションの追加を開始できます。


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

キャプションを停止する

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

キャプションを受信したリスナーを削除する

teamsCaptions.CaptionsReceived -= OnCaptionsReceived;

音声言語のサポート

サポートされている音声言語のリストを取得する

クローズド キャプションを有効にするときにユーザーが選択できる、サポートされている音声言語のリストを取得します。

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

キャプション言語のサポート

サポートされているキャプション言語を取得する

組織にアクティブな Teams Premium ライセンスがある場合、会議の開催者が Teams Premium ライセンスを持っていれば Azure Communication Services ユーザーは翻訳されたキャプションを有効にすることができます。 Microsoft 365 ID を持つユーザーについては、会議の開催者が Teams Premium ライセンスを持っていない場合、このチェックを自分のユーザー アカウントに対して行います。

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

キャプション言語の設定

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

前提条件

Note

このガイドで説明されているクローズド キャプション機能にアクセスするには、Azure Communication Services の Calling SDK を使用する音声通話アプリが必要であることに注意してください。

モデル

名前 説明
CaptionsCallFeature キャプション用の API
CaptionsCommon キャプションの基本クラス
StartCaptionOptions 音声言語などのクローズド キャプションのオプション
TeamsCaptionHandler CaptionsReceivedEventType イベントを処理するコールバック定義
TeamsCaptionsInfo CaptionsReceivedEventType イベントごとに受信したデータ構造

クローズド キャプション機能を取得する

外部 ID ユーザー

Azure Communication Services ユーザーが Teams 会議に参加できるようにするアプリケーションを構築する場合。

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

Microsoft 365 ユーザー

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

Teams キャプション オブジェクトを取得する

Teams キャプション固有の機能を利用するには、Teams キャプション オブジェクトを取得してキャストする必要があります

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

リスナーをサブスクライブする

有効/無効状態のキャプションを受け取るリスナーを追加する

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

受信したキャプション データのリスナーを追加する

返された TeamsCaptionsInfo データ オブジェクトを処理します。

注: このオブジェクトには、データが部分的なキャプションであるか、キャプションの最終版であるかを示す resultType プロパティが含まれています。 ResultType partial は編集されていないライブ キャプションを示し、final は最終解釈バージョンを示します (句読点と大文字化が含まれます)。

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

音声言語の変更状態を受け取るリスナーを追加する

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

キャプション言語の変更状態を受け取るリスナーを追加する

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

キャプションを開始する

すべてのリスナーを設定したら、キャプションの追加を開始できます。

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

キャプションを停止する

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

リスナーの登録を解除する

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

音声言語のサポート

サポートされている音声言語のリストを取得する

クローズド キャプションを有効にするときにユーザーが選択できる、サポートされている音声言語のリストを取得します。 このプロパティは、BCP 47 形式の言語配列を返します。

const spokenLanguages = teamsCaptions.supportedSpokenLanguages; 

音声言語を設定する

サポートされる音声言語配列から値を渡して、要求された言語が確実にサポートされるようにします。 既定では、contoso が言語を提供しないかサポートされていない言語を提供した場合、音声言語は既定の "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 */
}

キャプション言語のサポート

サポートされているキャプション言語のリストを取得する

組織にアクティブな Teams Premium ライセンスがある場合は、Teams キャプションが提供する翻訳されたキャプションをユーザーが使用できます。 Microsoft 365 ID を持つユーザーに関しては、会議の開催者がアクティブな Teams Premium ライセンスを持っていない場合、Microsoft 365 ユーザー アカウントに対してキャプション言語の確認が行われます。

このプロパティは、ISO 639-1 標準の 2 文字の言語コード配列を返します。

const captionLanguages = teamsCaptions.supportedCaptionLanguages;

キャプション言語の設定

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

前提条件

Note

このガイドで説明されているクローズド キャプション機能にアクセスするには、Azure Communication Services の Calling SDK を使用する音声通話アプリが必要であることに注意してください。

モデル

名前 説明
CaptionsCallFeature キャプション呼び出し機能に使用する API
TeamsCaptions Teams のキャプション用 API
StartCaptionOptions 音声言語などのクローズド キャプションのオプション
TeamsCaptionsListener TeamsCaptions addOnCaptionsReceivedListener のリスナー
TeamsCaptionsReceivedEvent TeamsCaptionsListener イベントごとに受信したデータ オブジェクト

クローズド キャプション機能を取得する

外部 ID ユーザーと Microsoft 365 ユーザー

ユーザーが 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
        }
    }));

リスナーをサブスクライブする

有効/無効状態のキャプションを受け取るリスナーを追加する

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

受信したキャプション データのリスナーを追加する

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

アクティブな音声言語の変更状態を受け取るリスナーを追加する

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

アクティブなキャプション言語の変更状態を受け取るリスナーを追加する

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

キャプションを開始する

すべてのリスナーを設定したら、キャプションの追加を開始できます。

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

キャプションを停止する

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

キャプションを受信したリスナーを削除する

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

音声言語のサポート

サポートされている音声言語のリストを取得する

クローズド キャプションを有効にするときにユーザーが選択できる、サポートされている音声言語のリストを取得します。

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

音声言語を設定する

ユーザーが音声言語を選択すると、キャプションの生成が想定される音声言語をアプリで設定できます。

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

キャプション言語のサポート

サポートされているキャプション言語を取得する

組織にアクティブな Teams Premium ライセンスがある場合、会議の開催者が Teams Premium ライセンスを持っていれば Azure Communication Services ユーザーは翻訳されたキャプションを有効にすることができます。 Microsoft 365 ID を持つユーザーについては、会議の開催者が Teams Premium ライセンスを持っていない場合、このチェックを自分のユーザー アカウントに対して行います。

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

キャプション言語の設定

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

前提条件

Note

このガイドで説明されているクローズド キャプション機能にアクセスするには、Azure Communication Services の Calling SDK を使用する音声通話アプリが必要であることに注意してください。

モデル

名前 説明
CaptionsCallFeature キャプション呼び出し機能に使用する API
TeamsCaptions Teams のキャプション用 API
StartCaptionOptions 音声言語などのクローズド キャプションのオプション
TeamsCaptionsDelegate Teams のキャプションを委任する
TeamsCaptionsReceivedEventArgs イベントを受信した Teams のキャプションごとに受信したデータ オブジェクト

クローズド キャプション機能を取得する

外部 ID ユーザーと Microsoft 365 ユーザー

Azure Communication Services ユーザーが 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
            }
        }
    }
}

リスナーをサブスクライブする

キャプションの有効化/無効化、音声言語、キャプション言語の状態の変更、受信データを受信するリスナーを追加する

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

キャプションを開始する

すべてのリスナーを設定したら、キャプションの追加を開始できます。

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

キャプションを停止する

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

キャプションを受信したリスナーを削除する

teamsCaptions?.delegate = nil

音声言語のサポート

サポートされている音声言語のリストを取得する

クローズド キャプションを有効にするときにユーザーが選択できる、サポートされている音声言語のリストを取得します。

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

音声言語を設定する

ユーザーが音声言語を選択すると、キャプションの生成が想定される音声言語をアプリで設定できます。

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

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

キャプション言語のサポート

サポートされているキャプション言語を取得する

組織にアクティブな Teams Premium ライセンスがある場合、会議の開催者が Teams Premium ライセンスを持っていれば Azure Communication Services ユーザーは翻訳されたキャプションを有効にすることができます。 Microsoft 365 ID を持つユーザーについては、会議の開催者が Teams Premium ライセンスを持っていない場合、このチェックを自分のユーザー アカウントに対して行います。

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

キャプション言語の設定

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

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

リソースをクリーンアップする

Communication Services サブスクリプションをクリーンアップして解除する場合は、リソースまたはリソース グループを削除できます。 リソース グループを削除すると、それに関連付けられている他のリソースも削除されます。 リソースのクリーンアップの詳細についてはこちらを参照してください。

次のステップ

詳細については、次の記事を参照してください。