Teams の相互運用性のためにクローズド キャプションを有効にする
ユーザーが Azure Communication Services ユーザーと Teams クライアント ユーザーとの会議に参加している可能性がある場合や、ユーザーが Microsoft 365 ID で Azure Communication Services 通話 SDK を使用しているといった Teams の相互運用性シナリオで、ユーザーがクローズド キャプションを有効にできるようにする方法について説明します。
前提条件
- アクティブなサブスクリプションを持つ Azure アカウント。詳細については、アカウントの無料作成に関するページを参照してください。
- Azure Communication Services リソース。 Azure Communication Services リソースの作成に関する記事を参照してください。 このリソースの接続文字列を保存します。
- 音声通話とビデオ通話を使用するアプリについては、Microsoft の音声とビデオでの通話に関するクイックスタートを参照してください。
- Microsoft 365 ユーザーのアクセス トークン。
- 外部 ID ユーザーのアクセス トークン。
- 翻訳されたキャプションを使用するには、Teams Premium ライセンスが必要です。
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)
{
}
}
前提条件
- アクティブなサブスクリプションを持つ Azure アカウント。詳細については、アカウントの無料作成に関するページを参照してください。
- Azure Communication Services リソース。 Azure Communication Services リソースの作成に関する記事を参照してください。 このリソースの接続文字列を保存します。
- 音声通話とビデオ通話を使用するアプリについては、Microsoft の音声とビデオでの通話に関するクイックスタートを参照してください。
- Microsoft 365 ユーザーのアクセス トークン。
- 外部 ID ユーザーのアクセス トークン。
- 翻訳されたキャプションを使用するには、Teams Premium ライセンスが必要です。
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 */
}
前提条件
- アクティブなサブスクリプションを持つ Azure アカウント。詳細については、アカウントの無料作成に関するページを参照してください。
- Azure Communication Services リソース。 Azure Communication Services リソースの作成に関する記事を参照してください。 このリソースの接続文字列を保存します。
- 音声通話とビデオ通話を使用するアプリについては、Microsoft の音声とビデオでの通話に関するクイックスタートを参照してください。
- Microsoft 365 ユーザーのアクセス トークン。
- 外部 ID ユーザーのアクセス トークン。
- 翻訳されたキャプションを使用するには、Teams Premium ライセンスが必要です。
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) {
}
});
}
前提条件
- アクティブなサブスクリプションを持つ Azure アカウント。詳細については、アカウントの無料作成に関するページを参照してください。
- Azure Communication Services リソース。 Azure Communication Services リソースの作成に関する記事を参照してください。 このリソースの接続文字列を保存します。
- 音声通話とビデオ通話を使用するアプリについては、Microsoft の音声とビデオでの通話に関するクイックスタートを参照してください。
- Microsoft 365 ユーザーのアクセス トークン。
- 外部 ID ユーザーのアクセス トークン。
- 翻訳されたキャプションを使用するには、Teams Premium ライセンスが必要です。
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 サブスクリプションをクリーンアップして解除する場合は、リソースまたはリソース グループを削除できます。 リソース グループを削除すると、それに関連付けられている他のリソースも削除されます。 リソースのクリーンアップの詳細についてはこちらを参照してください。
次のステップ
詳細については、次の記事を参照してください。
- 音声およびビデオによる通話の詳細。
- Teams の相互運用性の詳細については、こちらを参照してください。
- Microsoft Teams の翻訳済みライブ キャプションの詳細。
- UI ライブラリについて説明します。