次の方法で共有


ユーザー向け診断

Azure Communication Services で通話をしているとき、顧客に影響を及ぼす問題が発生する場合があります。 この問題に対処するため、Communication Services には、通話のさまざまなプロパティを調べて問題の原因を探る、"User Facing Diagnostics" (UFD) という機能が用意されています。 User Facing Diagnostics とは、根本的な問題 (ネットワークが不十分である、ユーザーのマイクがミュートされているなど) が原因でユーザーのエクスペリエンスが低下している可能性があることを示すために発生するイベントです。 User Facing Diagnostics が発生した後、根本的な問題が発生している可能性があることを示すフィードバックをエンドユーザーに提供することを検討する必要があります。 ただし、User Facing Diagnostics 出力は情報提供のみを目的としており、呼び出し元スタックにより、発生している User Facing Diagnostics に基づいて変更が加えられることはありません。

ローカルとリモートユーザー向けの診断

ユーザー向け診断 (UFD) を使用すると、プログラム API を使用してデバイスを呼び出しているユーザーで発生するユーザーに影響を与えるイベントを公開できます。 Azure Communication Services 内では、UFD の使用と生成には、 ローカル UFDリモート UFD の 2 つの方法があります。 ローカルの UFD は、ローカル ユーザーの電話またはブラウザーで生成されます。 リモート UFD は、リモート参加者の環境で発生するイベントであり、それによりローカル ユーザーは、リモート ユーザーに影響を与えるイベントをローカルで確認し、把握することができます。

Von Bedeutung

このドキュメントで説明されている機能は、現在プライベート プレビュー段階です。 プライベート プレビューには、一般提供されていない SDK やテスト用のドキュメントへのアクセスが含まれています。 早期導入者の申請を行うには、Azure Communication Services へのプレビュー アクセス用フォームに記入してください。

パブリック プレビュー呼び出し SDK のバージョン 1.34.1-beta.2 以降では、WebJS 呼び出し元 SDK からのリモート UFD の送信がサポートされています。 呼び出し元 SDK によって出力されるローカル UFDS は、一般提供 (GA) 段階です。

ユーザー向け診断 (UFD) を使用すると、ローカルまたはリモートの参加者が音声ビデオ通話の品質に影響する問題が発生しているタイミングを確認できます。 UFD は、ネットワーク状態、デバイス機能、およびメディア パフォーマンスに関するリアルタイム診断を提供します。 この診断情報は、接続不良、ミュートされたマイク、低帯域幅などの問題を特定するのに役立ちます。 UFD はこれらの問題を自動的に解決しませんが、アプリケーションはユーザーにプロアクティブなフィードバックを提供し、インターネット接続の確認やデバイス設定の調整などのソリューションを提案できます。 このデータに基づいて、ユーザーは問題を自分で修正するか (ネットワークが弱い場合はビデオをオフにするなど)、ユーザー インターフェイスを介して情報を表示することができます。

リモート UFDローカル UFD の使用には、いくつかの小さな違いがあります。 これらの違いは次のとおりです。

  • 呼び出し元 SDK では、プライバシー上の懸念があるため、リモート UFD を介して speakingWhileMicrophoneIsMuted が公開されることはありません。
  • 呼び出し元 SDK は、呼び出しに最大 20 人の参加者まで、UFD のみを公開してストリーミングします。 参加者数が 20 人を超えると、これらのイベントでネットワークが過負荷にならないように、 リモート UFD の送信を制限し、停止します。
  • 呼び出し元の SDK はフィルター処理されるため、一意のクライアントから 1 分あたり 3 つの リモート UFD イベントのみが表示されます。
  • クライアント SDK の観点から、ローカルの UFD がリモートで送信される機能を有効にする必要があります。

診断値

次の対ユーザー診断を利用できます。

ネットワーク値

名前 説明 有効値 ユース ケース 軽減の手順
ネットワーク接続なし 利用できるネットワークがありません。 - 利用できるネットワークがないことを理由に通話に失敗したときに、True に設定されます。
- ICE 候補が存在する場合には、False に設定されます。
デバイスがネットワークに接続されていません。 通話に、音声通話を維持できる信頼性の高いインターネット接続が設定されている必要があります。 詳細は、「ネットワーク最適化 セクションを参照してください。
ネットワークリレーに接続できません ネットワークに問題があります。 - Azure Communication Services リレーに到達できなくなるような制約がネットワークに存在するときに、True に設定されます。
- 新しい通話を発信すると、False に設定されます。
アクティブな通話中に WiFi 信号がオンまたはオフになる場合。 ファイアウォール規則とネットワーク ルーティングによって、クライアントが Microsoft のターン サーバーに到達できる必要があります。 詳細については、「ファイアウォールの構成」セクションをご覧ください。
ネットワーク再接続 接続が失われ、クライアントがネットワークに再接続しています。 - ネットワークへの接続が切れると、Bad に設定されます
- メディア転送接続が失われると、Poor に設定されます
- 新しいセッションが接続済みになると、Good に設定されます。
帯域幅が狭い、インターネット接続がない 通話に、音声通話を維持できる信頼性の高いインターネット接続が設定されている必要があります。 詳細は、「ネットワーク帯域幅の要件」セクションを参照してください。
networkReceiveQuality 受信ストリームの品質に関するインジケーターです。 - ストリームの受信に重大な問題がある場合に Bad に設定します。
- ストリームの受信に中等度の問題があるときに、Poor に設定されます。
- ストリームの受信に問題がないときに、Good に設定されます。
低帯域幅 通話に、音声通話を維持できる信頼性の高いインターネット接続が設定されている必要があります。 詳細は、「ネットワーク帯域幅の要件」セクションを参照してください。 使用可能なインターネット帯域幅を節約するために、カメラをオフにすることをエンド ユーザーに提案してください。
ネットワーク送信品質 送信ストリームの品質の指標。 - ストリームの送信に重大な問題がある場合に Bad に設定します。
- ストリームの送信に軽微な問題があるときに、Poor に設定されます。
- ストリームの送信に問題がないときに、Good に設定されます。
低帯域幅 通話に、音声通話を維持できる信頼性の高いインターネット接続が設定されている必要があります。 詳細は、「ネットワーク帯域幅の要件」セクションを参照してください。 また、使用可能なインターネット帯域幅を節約するために、カメラをオフにすることをエンド ユーザーに提案してください。

オーディオ値

名前 説明 有効値 ユース ケース 軽減の手順
スピーカー装置が列挙されていません ユーザーのシステムにオーディオ出力デバイス (スピーカー) がありません。 - システムにスピーカー デバイスがなく、スピーカー選択がサポートされている場合には、True に設定されます。
- システムにスピーカー デバイスが少なくとも 1 つあり、スピーカー選択がサポートされているときに、False に設定されます。
スピーカーがすべて取り外されている 値が True に設定されている場合は、現在の通話セッションで話者が利用できないという視覚的な通知をエンド ユーザーに与えることを検討してください。
マイクがミュートになっているときに話しています 話をしているものの、ミュート中です。 - ローカルのマイクがミュートになっている間にローカル ユーザーが話をしていると、True に設定されます。
- ローカルのユーザーが話すのをやめるか、マイクのミュートを解除すると False になります。
* 注: 現在、このオプションは Safari ではサポートされていません。オーディオ レベルのサンプルは WebRTC 統計から取得されるためです。オーディオ値 "speakingWhileMicrophoneIsMuted" は、リモート UFD として使用できません。
通話中にマイクをミュートした状態で話をする。 値が True に設定されている場合は、エンド ユーザーに対して、音声がミュートされていることに気付かない可能性があることを視覚的に通知することを検討してください。
マイクデバイスが列挙されていません ユーザーのシステムにオーディオ キャプチャ デバイス (マイク) がありません - システムにマイク デバイスがない場合には、True に設定されます。
- システムにマイク デバイスが 1 つ以上あるときに、False に設定されます。
通話中にマイクがすべて取り外される。 値が True に設定されている場合は、現在の通話セッションでマイクが利用できないという視覚的な通知をエンド ユーザーに与えることを検討してください。 詳細については、「 デバイス マネージャーからマイクを有効にする 」セクションを参照してください。
マイクが機能していません マイクが機能していません。 - マイク デバイスがシステムで無効になっている可能性があるか、別のプロセスで使用されていることが原因でローカル オーディオ ストリームの送信開始に失敗した場合には、True に設定されます。 この UFD の発生には、約 10 秒かかります。
- マイクがオーディオ ストリームの送信を正常に再開した場合には、False に設定されます。
利用できるマイクがない、システムでマイクへのアクセスが無効になっている 値を True に設定して、マイクに問題があるという視覚的通知をエンド ユーザーに提供する場合。
マイクが予期せずミュートになる マイクがミュートになっています - マイクが予期せずミュート状態になった場合には、True に設定されます。
- マイクがオーディオ ストリームの送信を正常に開始した場合には、False に設定されます
マイクがシステムからミュートに設定されています。 ほとんどの場合、ユーザーがモバイル デバイスで Azure Communication Services 通話中に電話がかかってきた場合に発生します。 ほとんどの場合、ユーザーが電話に応答できるよう、オペレーティング システムは Azure Communication Services 通話をミュートします。 値が True に設定されている場合は、通話が受信されたため、通話がミュートされたという視覚的な通知をエンド ユーザーに提供します。 詳細については、Azure Communication Services 通話をミュートする OS の最適な処理方法のセクションを参照してください。
マイクの許可が拒否されました macOS でデバイスの音量が小さいか、ほぼ無音の状態になっています。 - システム設定 (オーディオ) からオーディオへのアクセス許可が拒否されたときに、True に設定されます。
- ストリームの取得に成功した場合には、False に設定されます。
注: この診断は、macOS でのみ機能します。
設定でマイクへのアクセス許可が無効になっている。 値が True に設定されている場合は、Azure Communication Services 通話にマイクを使用するアクセス許可を有効にしなかったことをエンド ユーザーに視覚的に通知します。

カメラの値

名前 説明 有効値 ユース ケース 軽減の手順
カメラフリーズ カメラのフレーム生成が 5 秒以上停止しています。 - ローカル ビデオ ストリームが停止していると、True に設定されます。 この診断は、自分のビデオがリモートの相手側では停止して見えているか、リモート参加者がビデオを画面にレンダリングできていないことを意味します。
- 停止状態が解消し、相手側でビデオが通常どおり表示されるようになると、False に設定されます。
通話中にカメラが失われたか、ネットワークが悪い場合にカメラがフリーズしました。 値が True に設定されている場合は、リモート参加者ネットワークが悪い可能性があることをエンド ユーザーに通知することを検討してください。 帯域幅を節約するために、ユーザーがカメラをオフにすることを提案します。 詳細については、Azure Communication Services 通話に必要なインターネット機能に関する「ネットワーク帯域幅の要件」セクションを参照してください。
カメラの起動に失敗しました カメラの障害全般です。 - カメラ デバイスがシステムで無効になっている可能性があるか、別のプロセスで使用されていることが原因でローカル ビデオの送信開始に失敗した場合には、True に設定されます。
- 選択したカメラ デバイスがローカル ビデオの送信を正常に再開した場合には、False に設定されます。
カメラの障害 値が True に設定されている場合は、カメラの起動に失敗したという視覚的な通知をエンド ユーザーに提供します。
カメラの起動がタイムアウトしました カメラの状態が悪い場合に共通するシナリオです。 - カメラ デバイスがビデオ ストリームの送信を開始する際にタイムアウトになった場合には、True に設定されます。
- 選択したカメラ デバイスがローカル ビデオの送信を正常に再開した場合には、False に設定されます。
カメラの障害 値が True に設定されている場合、カメラで問題が発生している可能性があるという視覚的な通知をエンド ユーザーに提供します。 (通知を削除するために値が False に設定されている場合)。
カメラの許可が拒否されました カメラへのアクセス許可が設定で拒否されました。 - システム設定 (ビデオ) からカメラへのアクセス許可が拒否されたときに、True に設定されます。
- ストリームの取得に成功した場合には、False に設定されます。
注: この診断は、macOS の Chrome でのみ機能します。
設定でカメラへのアクセス許可が無効になっている。 値が True に設定されている場合は、Azure Communication Services 通話にカメラを使用するアクセス許可を有効にしなかったことをエンド ユーザーに視覚的に通知します。
カメラが予期せず停止しました カメラの不具合 - カメラが予期しない停止状態になると True になります。
- カメラが起動して動画ストリームの送信を再開すると False になります。
カメラが正しく動作しているかどうかを確認します。 値が True に設定されている場合、カメラで問題が発生している可能性があるという視覚的な通知をエンド ユーザーに提供します。 (通知を削除するために値が False に設定されている場合)。

その他の値

名前 説明 有効値 ユース ケース 軽減策の手順
画面共有の録画が無効になっています システムの画面共有が、設定から拒否されました。 - システム設定 (共有) から画面共有のためのアクセス許可が拒否されたときに、True に設定されます。
- ストリームの取得に成功した場合には、False に設定されます。
注: この診断は、macOS の Chrome でのみ機能します。
設定で画面のレコーディングが無効になっている。 値が True に設定されている場合は、Azure Communication Services 呼び出しの画面を共有するアクセス許可が有効になっていないことをエンド ユーザーに視覚的に通知します。
キャプチャーの開始に失敗しました システム画面の共有に失敗しました。 - 画面の録画の開始に失敗すると True になります。
- 画面の録画を開始すると False になります。
値が True に設定されている場合は、画面の共有に問題が発生した可能性があるという視覚的な通知をエンド ユーザーに提供します。 (値が False に設定し戻されている場合、通知を削除します)。
キャプチャーツールが予期せず停止しました システム画面の共有の不具合 - 画面の録画が予期しない停止状態になると True になります。
- 画面の録画を再開すると False になります。
画面共有が正しく機能しているかどうかを確認します 値が Trueに設定されている場合、画面共有が停止するような問題が発生している可能性があることをエンドユーザーに視覚的に通知します。 (通知を削除するために値が False に設定されている場合)。

診断へのアクセス

ユーザー向けの診断は、コア Call API の拡張機能です。 UserFacingDiagnosticsFeatureインターフェイスの詳細については、こちらをご覧ください

const userFacingDiagnostics = call.feature(Features.UserFacingDiagnostics);

ローカル ユーザー向けの診断イベント

各診断には、次のデータがあります。

  • 診断は、ローカル コンピューターで起動された UFD 診断の種類です。 たとえば、 NetworkSendQuality または DeviceSpeakWhileMutedの UFD などです。
  • 値が DiagnosticQuality または DiagnosticFlag
  • DiagnosticQuality = enum { Good = 1, Poor = 2, Bad = 3 }。
  • DiagnosticFlag = true | false
const diagnosticChangedListener = (diagnosticInfo: NetworkDiagnosticChangedEventArgs | MediaDiagnosticChangedEventArgs) => {
    console.log(`Diagnostic changed: ` +
        `Diagnostic: ${diagnosticInfo.diagnostic}` +
        `Value: ${diagnosticInfo.value}` +
        `Value type: ${diagnosticInfo.valueType}`);

    if (diagnosticInfo.valueType === 'DiagnosticQuality') {
        if (diagnosticInfo.value === DiagnosticQuality.Bad) {
            console.error(`${diagnosticInfo.diagnostic} is bad quality`);

        } else if (diagnosticInfo.value === DiagnosticQuality.Poor) {
            console.error(`${diagnosticInfo.diagnostic} is poor quality`);
        }

    } else if (diagnosticInfo.valueType === 'DiagnosticFlag') {
        if (diagnosticInfo.value === true) {
            console.error(`${diagnosticInfo.diagnostic}`);
        }
    }
};


// Subscribe to the `diagnosticChanged` event to monitor when any local user-facing diagnostic changes.
userFacingDiagnostics.network.on('diagnosticChanged', diagnosticChangedListener);
userFacingDiagnostics.media.on('diagnosticChanged', diagnosticChangedListener);

リモート ユーザー向けの診断イベントへのアクセス

通話のすべての参加者にリモートUFDを送信するには、各クライアントから関数を有効にする必要があります。 これは、クライアントごとにアクティブ化または非アクティブ化できます。 有効にすると、クライアントはローカルの UFD をすべての参加者にリモートで送信し、使用と処理を開始します。 参加者の数が 20 を超えると、ローカル クライアントからのリモート UFD の送信が停止されることに注意してください。 この測定値は、UFD トラフィックによる過剰なネットワーク帯域幅の消費を防ぐために実装されています。

// Start the local client to send its local UFD to all participants (send local UFD to remote clients).
remoteUfdsFeature.startSendingDiagnostics();
// Stop sending local UFDs to remote clients.
remoteUfdsFeature.stopSendingDiagnostics();

次のコード サンプルでは、 RemoteParticipantDiagnosticsData には次のデータが関連付けられています。

  • diagnostic には、リモート マシンから起動された診断 UFD の配列が含まれています。 たとえば、 NetworkSendQualityの UFD などです。
  • その要素の値は、 DiagnosticQuality または DiagnosticFlagとして定義されます。
  • DiagnosticQuality = enum { Good = 1, Poor = 2, Bad = 3 }。
  • DiagnosticFlag = true | false
  • 配列の valueType = DiagnosticQuality | DiagnosticFlag
const remoteDiagnosticChangedListener = (diagnosticInfo: RemoteParticipantDiagnosticsData) => {
    for (const diagnostic of diagnosticInfo.diagnostics) {
        if (diagnostic.valueType === 'DiagnosticQuality') {
            if (diagnostic.value === SDK.DiagnosticQuality.Bad) {
                console.error(`${diagnostic.diagnostic} is bad quality`);

            } else if (diagnostic.value === SDK.DiagnosticQuality.Poor) {
                console.error(`${diagnostic.diagnostic} is poor quality`);
            }

        } else if (diagnostic.valueType === 'DiagnosticFlag') {
            console.error(`${diagnostic.diagnostic} diagnostic flag raised`);
        }
    }
};

// Subscribe to the `diagnosticChanged` event to monitor when any local user-facing diagnostic changes.
userFacingDiagnostics.remote.on('diagnosticChanged', remoteDiagnosticChangedListener);

受信した最新のユーザー向け診断イベントを発生させます。

呼び出し元 SDK によって発生した最新の診断値を生成するサンプル コードを次に示します。 診断が未定義の場合は、UFD が生成されていないことを意味します。

const latestNetworkDiagnostics = userFacingDiagnostics.network.getLatest();

console.log(
  `noNetwork: ${latestNetworkDiagnostics.noNetwork.value}, ` +
    `value type = ${latestNetworkDiagnostics.noNetwork.valueType}`
);

console.log(
  `networkReconnect: ${latestNetworkDiagnostics.networkReconnect.value}, ` +
    `value type = ${latestNetworkDiagnostics.networkReconnect.valueType}`
);

console.log(
  `networkReceiveQuality: ${latestNetworkDiagnostics.networkReceiveQuality.value}, ` +
    `value type = ${latestNetworkDiagnostics.networkReceiveQuality.valueType}`
);

const latestMediaDiagnostics = userFacingDiagnostics.media.getLatest();

console.log(
  `speakingWhileMicrophoneIsMuted: ${latestMediaDiagnostics.speakingWhileMicrophoneIsMuted.value}, ` +
    `value type = ${latestMediaDiagnostics.speakingWhileMicrophoneIsMuted.valueType}`
);

console.log(
  `cameraStartFailed: ${latestMediaDiagnostics.cameraStartFailed.value}, ` +
    `value type = ${latestMediaDiagnostics.cameraStartFailed.valueType}`
);

console.log(
  `microphoneNotFunctioning: ${latestMediaDiagnostics.microphoneNotFunctioning.value}, ` +
    `value type = ${latestMediaDiagnostics.microphoneNotFunctioning.valueType}`
);

診断値

次の対ユーザー診断を利用できます。

ネットワーク値

名前 説明 有効値 ユース ケース 軽減の手順
ネットワークが利用できません 利用できるネットワークがありません。 - 利用できるネットワークがないことを理由に通話に失敗したときに、True に設定されます。
- ICE 候補が存在する場合には、False に設定されます。
デバイスがネットワークに接続されていません。 通話に、音声通話を維持できる信頼性の高いインターネット接続が設定されている必要があります。 詳細は、「ネットワーク最適化 セクションを参照してください。
ネットワークリレーに接続できません ネットワークに問題があります。 - Azure Communication Services リレーに到達できなくなるような制約がネットワークに存在するときに、True に設定されます。
- 新しい通話を発信すると、False に設定されます。
通話中に Wi-Fi 信号のオンとオフが切り替わったとき。 ファイアウォール規則とネットワーク ルーティングによって、クライアントが Microsoft のターン サーバーに到達できる必要があります。 詳細については、「ファイアウォールの構成」セクションをご覧ください。
networkReconnectionQuality 接続が失われ、ネットワークに再度接続しています。 - ネットワークへの接続が切れると、Bad に設定されます
- メディア転送接続が失われると、Poor に設定されます
- 新しいセッションが接続済みになると、Good に設定されます。
帯域幅が狭い、インターネット接続がない 通話に、音声通話を維持できる信頼性の高いインターネット接続が設定されている必要があります。 詳細は、「ネットワーク帯域幅の要件」セクションを参照してください。
networkReceiveQuality 受信ストリームの品質に関するインジケーターです。 - ストリームの受信に深刻な問題があるときに、Bad に設定されます。
- ストリームの受信に中等度の問題があるときに、Poor に設定されます。
- ストリームの受信に問題がないときに、Good に設定されます。
- 通話中に音声が流れている場合のみ表示されます。つまり、これは参加者が一定時間、積極的に発言していることを意味します。
低帯域幅 通話に、音声通話を維持できる信頼性の高いインターネット接続が設定されている必要があります。 詳細は、「ネットワーク帯域幅の要件」セクションを参照してください。 使用可能なインターネット帯域幅を節約するために、カメラをオフにすることをエンド ユーザーに提案してください。
ネットワーク送信品質 送信ストリームの品質の指標。 - ストリームの送信に重大な問題があるときに、Bad に設定されます。
- ストリームの送信に軽微な問題があるときに、Poor に設定されます。
- ストリームの送信に問題がないときに、Good に設定されます。
- 受信品質の診断の場合と同様に、通話中に音声が流れている場合のみ表示されます。つまり、これは参加者が一定時間、積極的に発言していることを意味します。 ただし、品質の検証には相手側の情報が必要なため、1 対 1 の通話でのみ機能します。 相手側が、受信したデータを通知する必要があります。
低帯域幅 通話に、音声通話を維持できる信頼性の高いインターネット接続が設定されている必要があります。 詳細は、「ネットワーク帯域幅の要件」セクションを参照してください。 また、使用可能なインターネット帯域幅を節約するために、カメラをオフにすることをエンド ユーザーに提案してください。

オーディオ値

名前 説明 有効値 ユース ケース 軽減の手順
noSpeakerDevicesAvailable ユーザーのシステムにオーディオ出力デバイス (スピーカー) がありません。 - システムにスピーカー デバイスがなく、スピーカー選択がサポートされている場合には、True に設定されます。
- システムにスピーカー デバイスが少なくとも 1 つあり、スピーカー選択がサポートされているときに、False に設定されます。
スピーカーがすべて取り外されている 値が True に設定されている場合は、現在の通話セッションで話者が利用できないという視覚的な通知をエンド ユーザーに与えることを検討してください。
マイクがミュートになっているときに話しています 話をしているものの、ミュート中です。 - ローカルのマイクがミュートになっている間にローカル ユーザーが話をしていると、True に設定されます。
- ローカルのユーザーが話すのをやめるか、マイクのミュートを解除すると False になります。
この診断イベントは、ノイズを回避し、より良いユーザー エクスペリエンスを提供するために、ユーザーの操作なしに一定回数トリガーされた場合は自動的に無効にすることができます。 新しいミュート アクションが発生すると、再度有効になります。
通話中にマイクをミュートした状態で話をする。 値が True に設定されている場合は、話していて、オーディオがミュートされていることに気付いていない可能性があるという視覚的な通知をエンド ユーザーに与えることを検討してください。
noMicrophoneDevicesAvailable ユーザーのシステムにオーディオ キャプチャ デバイス (マイク) がありません - システムにマイク デバイスがない場合には、True に設定されます。
- システムにマイク デバイスが 1 つ以上あるときに、False に設定されます。
通話中にマイクがすべて取り外される。 値が True に設定されている場合は、現在の通話セッションでマイクが利用できないという視覚的な通知をエンド ユーザーに与えることを検討してください。 詳細については、「 デバイス マネージャーからマイクを有効にする 」セクションを参照してください。
マイクが機能していません マイクが機能していません。 - マイク デバイスがシステムで無効になっている可能性があるか、別のプロセスで使用されていることが原因でローカル オーディオ ストリームの送信開始に失敗した場合には、True に設定されます。 この UFD の発生には、約 10 秒かかります。
- マイクがオーディオ ストリームの送信を正常に再開した場合には、False に設定されます。
利用できるマイクがない、システムでマイクへのアクセスが無効になっている 値を True に設定して、マイクに問題があるという視覚的通知をエンド ユーザーに提供する場合。
マイクが予期せずミュートになる マイクがミュートになっています - マイクが予期せずミュート状態になった場合には、True に設定されます。
- マイクがオーディオ ストリームの送信を正常に開始した場合には、False に設定されます
マイクがシステムからミュートに設定されています。 ほとんどの場合、ユーザーがモバイル デバイスで Azure Communication Services 通話中に電話がかかってきた場合に発生します。 ほとんどの場合、ユーザーが電話に応答できるよう、オペレーティング システムは Azure Communication Services 通話をミュートします。 値が True に設定されている場合は、通話が受信されたため、通話がミュートされたという視覚的な通知をエンド ユーザーに提供します。 詳細については、Azure Communication Services 通話をミュートする OS の最適な処理方法のセクションを参照してください。
マイクの許可が拒否されました macOS でデバイスの音量が小さいか、ほぼ無音の状態になっています。 - システム設定 (オーディオ) からオーディオへのアクセス許可が拒否されたときに、True に設定されます。
- ストリームの取得に成功した場合には、False に設定されます。
注: この診断は、macOS でのみ機能します。
設定でマイクへのアクセス許可が無効になっている。 値が True に設定されている場合は、Azure Communication Services 通話にマイクを使用するアクセス許可を有効にしなかったことをエンド ユーザーに視覚的に通知します。

カメラの値

名前 説明 有効値 ユース ケース 軽減の手順
カメラフリーズ カメラのフレーム生成が 5 秒以上停止しています。 - ローカル ビデオ ストリームが停止していると、True に設定されます。 この診断は、自分のビデオがリモートの相手側では停止して見えているか、リモート参加者がビデオを画面にレンダリングできていないことを意味します。
- 停止状態が解消し、相手側でビデオが通常どおり表示されるようになると、False に設定されます。
通話中にカメラが失われたか、ネットワークの状態が悪いためにカメラが停止した。 値が True に設定されている場合、リモート参加者ネットワークが悪い可能性があるという通知をエンド ユーザーに提供する場合は、帯域幅を節約するためにカメラをオフにしてください。 詳細については、Azure Communication Services 通話に必要なインターネット機能に関する「ネットワーク帯域幅の要件」セクションを参照してください。
カメラの起動に失敗しました カメラの障害全般です。 - カメラ デバイスがシステムで無効になっている可能性があるか、別のプロセスで使用されていることが原因でローカル ビデオの送信開始に失敗した場合には、True に設定されます。
- 選択したカメラ デバイスがローカル ビデオの送信を正常に再開した場合には、False に設定されます。
カメラの障害 値が True に設定されている場合は、カメラの起動に失敗したという視覚的な通知をエンド ユーザーに提供します。
カメラの起動がタイムアウトしました カメラの状態が悪い場合に共通するシナリオです。 - カメラ デバイスがビデオ ストリームの送信を開始する際にタイムアウトになった場合には、True に設定されます。
- 選択したカメラ デバイスがローカル ビデオの送信を正常に再開した場合には、False に設定されます。
カメラの障害 値が True に設定されている場合、カメラで問題が発生している可能性があるという視覚的な通知をエンド ユーザーに提供します。 (通知を削除するために値が False に設定されている場合)。
カメラの許可が拒否されました カメラへのアクセス許可が設定で拒否されました。 - システム設定 (ビデオ) からカメラへのアクセス許可が拒否されたときに、True に設定されます。
- ストリームの取得に成功した場合には、False に設定されます。
注: この診断は、macOS の Chrome でのみ機能します。
設定でカメラへのアクセス許可が無効になっている。 値が True に設定されている場合は、Azure Communication Services 通話にカメラを使用するアクセス許可を有効にしなかったことをエンド ユーザーに視覚的に通知します。
カメラが予期せず停止しました カメラの不具合 - カメラが予期しない停止状態になると True になります。
- カメラが起動して動画ストリームの送信を再開すると False になります。
カメラが正しく動作しているかどうかを確認します。 値が True に設定されている場合、カメラで問題が発生している可能性があるという視覚的な通知をエンド ユーザーに提供します。 (通知を削除するために値が False に設定されている場合)。

ネイティブのみ

名前 説明 有効値 ユース ケース 軽減策の手順
スピーカー音量がゼロです デバイス (スピーカー) のボリュームが 0 です。 - スピーカーのボリュームが 0 であるときに、True に設定されます。
- スピーカー音量が 0 でないときに、False に設定されます。
通話中に参加者から音声が聞こえません。 値が True に設定されている場合、ボリュームが誤って最小 (ゼロ) になる可能性があります。
スピーカーがミュートされています スピーカー デバイスがミュートされています。 - スピーカー デバイスがミュートされているときに、True に設定されます。
- スピーカー デバイスがミュートされていないときに、False に設定されます。
通話中に参加者から音声が聞こえません。 値が True に設定されている場合、ボリュームが誤ってミュートされる可能性があります。
speakerBusy スピーカーは既に使用中です。 デバイスが排他モードで使用されているか、デバイスが共有モードで使用されており、呼び出し元が排他モードでデバイスを使用するように求められています。 - スピーカー デバイス ストリームの取得がタイムアウト (オーディオ) したときに、True に設定されます。
- スピーカーの獲得が成功したときに、False に設定されます。
通話中に参加者からスピーカーを介して音声が聞こえません。 値が Trueに設定されている場合は、別のアプリケーションがスピーカーを使用しているかどうかを確認し、これを閉じることを試みることができるように、エンド ユーザーに視覚的な通知を送信します。
スピーカーが動作しません スピーカーが機能していない (オーディオ デバイス クライアントを初期化できなかったか、デバイスが 5 秒を超えて非アクティブになった) - スピーカーが使用不可であるか、デバイス ストリームの取得がタイムアウト (オーディオ) したときに、True に設定されます。
- スピーカーの獲得が成功したときに、False に設定されます。
通話中に参加者からスピーカーを介して音声が聞こえません。 スピーカー デバイスの状態を確認してみてください。
microphoneBusy マイクは既に使用されています。 デバイスが排他モードで使用されているか、デバイスが共有モードで使用されており、呼び出し元が排他モードでデバイスを使用するように求められています。 - マイク デバイス ストリームの取得がタイムアウト (オーディオ) したときに、True に設定されます。
- マイクの獲得が成功したときに、False に設定されます。
音声が通話の他の参加者に届いていません。 値が Trueに設定されている場合は、別のアプリケーションがマイクを使用しているかどうかを確認し、これを閉じることを試みることができるように、エンド ユーザーに視覚的な通知を送信します。

診断へのアクセス

対ユーザー診断はコア Call API の拡張機能であり、実行中の通話の診断ができます。

DiagnosticsCallFeature diagnosticsCallFeature = call.feature(Features.LOCAL_USER_DIAGNOSTICS);

User Facing Diagnostic イベント

  • 機能オブジェクトを取得し、診断イベントにリスナーを追加します。
DiagnosticsCallFeature diagnosticsCallFeature = call.feature(Features.LOCAL_USER_DIAGNOSTICS);

/* NetworkDiagnostic */
FlagDiagnosticChangedListener listener = (FlagDiagnosticChangedEvent args) -> {
  Boolean mediaValue = args.getValue();
  // Handle new value for no network diagnostic.
};

NetworkDiagnostics networkDiagnostics = diagnosticsCallFeature.getNetworkDiagnostics();
networkDiagnostics.addOnNetworkUnreachableChangedListener(listener);

// To remove listener for network quality event
networkDiagnostics.removeOnNetworkUnreachableChangedListener(listener);

// Quality Diagnostics
DiagnosticsCallFeature diagnosticsCallFeature = call.feature(Features.LOCAL_USER_DIAGNOSTICS);
QualityDiagnosticChangedListener listener = (QualityDiagnosticChangedEvent args) -> {
  DiagnosticQuality diagnosticQuality = args.getValue();
  // Handle new value for network reconnect diagnostic.
};

NetworkDiagnostics networkDiagnostics = diagnosticsCallFeature.getNetworkDiagnostics();
networkDiagnostics.addOnNetworkReconnectionQualityChangedListener(listener);

// To remove listener for media flag event
networkDiagnostics.removeOnNetworkReconnectionQualityChangedListener(listener);

/* MediaDiagnostic */
DiagnosticsCallFeature diagnosticsCallFeature = call.feature(Features.LOCAL_USER_DIAGNOSTICS);
FlagDiagnosticChangedListener listener = (FlagDiagnosticChangedEvent args) -> {
  Boolean mediaValue = args.getValue();
  // Handle new value for speaker not functioning diagnostic.
};

MediaDiagnostics mediaDiagnostics = diagnosticsCallFeature.getMedia();
mediaDiagnostics.addOnIsSpeakerNotFunctioningChangedListener(listener);

// To remove listener for media flag event
mediaDiagnostics.removeOnIsSpeakerNotFunctioningChangedListener(listener);

最新の User Facing Diagnostics を取得する

  • 現在の通話で出力された最新の診断値を取得します。 診断の値をまだ受け取っていない場合は、例外がスローされます。
DiagnosticsCallFeature diagnosticsCallFeature = call.feature(Features.LOCAL_USER_DIAGNOSTICS);
NetworkDiagnostics networkDiagnostics = diagnosticsCallFeature.getNetwork();
MediaDiagnostics mediaDiagnostics = diagnosticsCallFeature.getMedia();

NetworkDiagnosticValues latestNetwork = networkDiagnostics.getLatestDiagnostics();
Boolean lastNetworkValue = latestNetwork.isNetworkUnavailable(); // null if there isn't a value for this diagnostic.
DiagnosticQuality lastReceiveQualityValue = latestNetwork.getNetworkReceiveQuality(); //  UNKNOWN if there isn't a value for this diagnostic.

MediaDiagnosticValues latestMedia = networkDiagnostics.getLatestDiagnostics();
Boolean lastSpeakerNotFunctionValue = latestMedia.isSpeakerNotFunctioning(); // null if there isn't a value for this diagnostic.

// Use the last values ...

診断値

次の対ユーザー診断を利用できます。

ネットワーク値

名前 説明 有効値 ユース ケース 軽減の手順
ネットワークが利用できません 利用できるネットワークがありません。 - 利用できるネットワークがないことを理由に通話に失敗したときに、True に設定されます。
- ICE 候補が存在する場合には、False に設定されます。
デバイスがネットワークに接続されていません。 通話に、音声通話を維持できる信頼性の高いインターネット接続が設定されている必要があります。 詳細は、「ネットワーク最適化 セクションを参照してください。
ネットワークリレーに接続できません ネットワークに問題があります。 - Azure Communication Services リレーに到達できなくなるような制約がネットワークに存在するときに、True に設定されます。
- 新しい通話を発信すると、False に設定されます。
通話中に Wi-Fi 信号のオンとオフが切り替わったとき。 ファイアウォール規則とネットワーク ルーティングによって、クライアントが Microsoft のターン サーバーに到達できる必要があります。 詳細については、「ファイアウォールの構成」セクションをご覧ください。
networkReconnectionQuality 接続が失われ、ネットワークに再度接続しています。 - ネットワークへの接続が切れると、Bad に設定されます
- メディア転送接続が失われると、Poor に設定されます
- 新しいセッションが接続済みになると、Good に設定されます。
帯域幅が狭い、インターネット接続がない 通話に、音声通話を維持できる信頼性の高いインターネット接続が設定されている必要があります。 詳細は、「ネットワーク帯域幅の要件」セクションを参照してください。
networkReceiveQuality 受信ストリームの品質に関するインジケーターです。 - ストリームの受信に深刻な問題があるときに、Bad に設定されます。
- ストリームの受信に中等度の問題があるときに、Poor に設定されます。
- ストリームの受信に問題がないときに、Good に設定されます。
- 通話中に音声が流れている場合のみ表示されます。つまり、これは参加者が一定時間、積極的に発言していることを意味します。
低帯域幅 通話に、音声通話を維持できる信頼性の高いインターネット接続が設定されている必要があります。 詳細は、「ネットワーク帯域幅の要件」セクションを参照してください。 使用可能なインターネット帯域幅を節約するために、カメラをオフにすることをエンド ユーザーに提案してください。
ネットワーク送信品質 送信ストリームの品質の指標。 - ストリームの送信に重大な問題があるときに、Bad に設定されます。
- ストリームの送信に軽微な問題があるときに、Poor に設定されます。
- ストリームの送信に問題がないときに、Good に設定されます。
- 受信品質の診断の場合と同様に、通話中に音声が流れている場合のみ表示されます。つまり、これは参加者が一定時間、積極的に発言していることを意味します。 ただし、品質の検証には相手側の情報が必要なため、1 対 1 の通話でのみ機能します。 相手側が、受信したデータを通知する必要があります。
低帯域幅 通話に、音声通話を維持できる信頼性の高いインターネット接続が設定されている必要があります。 詳細は、「ネットワーク帯域幅の要件」セクションを参照してください。 また、使用可能なインターネット帯域幅を節約するために、カメラをオフにすることをエンド ユーザーに提案してください。

オーディオ値

名前 説明 有効値 ユース ケース 軽減の手順
noSpeakerDevicesAvailable ユーザーのシステムにオーディオ出力デバイス (スピーカー) がありません。 - システムにスピーカー デバイスがなく、スピーカー選択がサポートされている場合には、True に設定されます。
- システムにスピーカー デバイスが少なくとも 1 つあり、スピーカー選択がサポートされているときに、False に設定されます。
スピーカーがすべて取り外されている 値が True に設定されている場合は、現在の通話セッションで話者が利用できないという視覚的な通知をエンド ユーザーに与えることを検討してください。
マイクがミュートになっているときに話しています 話をしているものの、ミュート中です。 - ローカルのマイクがミュートになっている間にローカル ユーザーが話をしていると、True に設定されます。
- ローカルのユーザーが話すのをやめるか、マイクのミュートを解除すると False になります。
この診断イベントは、ノイズを回避し、より良いユーザー エクスペリエンスを提供するために、ユーザーの操作なしに一定回数トリガーされた場合は自動的に無効にすることができます。 新しいミュート アクションが発生すると、再度有効になります。
通話中にマイクをミュートした状態で話をする。 値が True に設定されている場合は、話していて、オーディオがミュートされていることに気付いていない可能性があるという視覚的な通知をエンド ユーザーに与えることを検討してください。
noMicrophoneDevicesAvailable ユーザーのシステムにオーディオ キャプチャ デバイス (マイク) がありません - システムにマイク デバイスがない場合には、True に設定されます。
- システムにマイク デバイスが 1 つ以上あるときに、False に設定されます。
通話中にマイクがすべて取り外される。 値が True に設定されている場合は、現在の通話セッションでマイクが利用できないという視覚的な通知をエンド ユーザーに与えることを検討してください。 詳細については、「 デバイス マネージャーからマイクを有効にする 」セクションを参照してください。
マイクが機能していません マイクが機能していません。 - マイク デバイスがシステムで無効になっている可能性があるか、別のプロセスで使用されていることが原因でローカル オーディオ ストリームの送信開始に失敗した場合には、True に設定されます。 この UFD の発生には、約 10 秒かかります。
- マイクがオーディオ ストリームの送信を正常に再開した場合には、False に設定されます。
利用できるマイクがない、システムでマイクへのアクセスが無効になっている 値を True に設定して、マイクに問題があるという視覚的通知をエンド ユーザーに提供する場合。
マイクが予期せずミュートになる マイクがミュートになっています - マイクが予期せずミュート状態になった場合には、True に設定されます。
- マイクがオーディオ ストリームの送信を正常に開始した場合には、False に設定されます
マイクがシステムからミュートに設定されています。 ほとんどの場合、ユーザーがモバイル デバイスで Azure Communication Services 通話中に電話がかかってきた場合に発生します。 ほとんどの場合、ユーザーが電話に応答できるよう、オペレーティング システムは Azure Communication Services 通話をミュートします。 値が True に設定されている場合は、通話が受信されたため、通話がミュートされたという視覚的な通知をエンド ユーザーに提供します。 詳細については、Azure Communication Services 通話をミュートする OS の最適な処理方法のセクションを参照してください。
マイクの許可が拒否されました macOS でデバイスの音量が小さいか、ほぼ無音の状態になっています。 - システム設定 (オーディオ) からオーディオへのアクセス許可が拒否されたときに、True に設定されます。
- ストリームの取得に成功した場合には、False に設定されます。
注: この診断は、macOS でのみ機能します。
設定でマイクへのアクセス許可が無効になっている。 値が True に設定されている場合は、Azure Communication Services 通話にマイクを使用するアクセス許可を有効にしなかったことをエンド ユーザーに視覚的に通知します。

カメラの値

名前 説明 有効値 ユース ケース 軽減の手順
カメラフリーズ カメラのフレーム生成が 5 秒以上停止しています。 - ローカル ビデオ ストリームが停止していると、True に設定されます。 この診断は、自分のビデオがリモートの相手側では停止して見えているか、リモート参加者がビデオを画面にレンダリングできていないことを意味します。
- 停止状態が解消し、相手側でビデオが通常どおり表示されるようになると、False に設定されます。
通話中にカメラが失われたか、ネットワークの状態が悪いためにカメラが停止した。 値が True に設定されている場合、リモート参加者ネットワークが悪い可能性があるという通知をエンド ユーザーに提供する場合は、帯域幅を節約するためにカメラをオフにしてください。 詳細については、Azure Communication Services 通話に必要なインターネット機能に関する「ネットワーク帯域幅の要件」セクションを参照してください。
カメラの起動に失敗しました カメラの障害全般です。 - カメラ デバイスがシステムで無効になっている可能性があるか、別のプロセスで使用されていることが原因でローカル ビデオの送信開始に失敗した場合には、True に設定されます。
- 選択したカメラ デバイスがローカル ビデオの送信を正常に再開した場合には、False に設定されます。
カメラの障害 値が True に設定されている場合は、カメラの起動に失敗したという視覚的な通知をエンド ユーザーに提供します。
カメラの起動がタイムアウトしました カメラの状態が悪い場合に共通するシナリオです。 - カメラ デバイスがビデオ ストリームの送信を開始する際にタイムアウトになった場合には、True に設定されます。
- 選択したカメラ デバイスがローカル ビデオの送信を正常に再開した場合には、False に設定されます。
カメラの障害 値が True に設定されている場合、カメラで問題が発生している可能性があるという視覚的な通知をエンド ユーザーに提供します。 (通知を削除するために値が False に設定されている場合)。
カメラの許可が拒否されました カメラへのアクセス許可が設定で拒否されました。 - システム設定 (ビデオ) からカメラへのアクセス許可が拒否されたときに、True に設定されます。
- ストリームの取得に成功した場合には、False に設定されます。
注: この診断は、macOS の Chrome でのみ機能します。
設定でカメラへのアクセス許可が無効になっている。 値が True に設定されている場合は、Azure Communication Services 通話にカメラを使用するアクセス許可を有効にしなかったことをエンド ユーザーに視覚的に通知します。
カメラが予期せず停止しました カメラの不具合 - カメラが予期しない停止状態になると True になります。
- カメラが起動して動画ストリームの送信を再開すると False になります。
カメラが正しく動作しているかどうかを確認します。 値が True に設定されている場合、カメラで問題が発生している可能性があるという視覚的な通知をエンド ユーザーに提供します。 (通知を削除するために値が False に設定されている場合)。

ネイティブのみ

名前 説明 有効値 ユース ケース 軽減策の手順
スピーカー音量がゼロです デバイス (スピーカー) のボリュームが 0 です。 - スピーカーのボリュームが 0 であるときに、True に設定されます。
- スピーカー音量が 0 でないときに、False に設定されます。
通話中に参加者から音声が聞こえません。 値が True に設定されている場合、ボリュームが誤って最小 (ゼロ) になる可能性があります。
スピーカーがミュートされています スピーカー デバイスがミュートされています。 - スピーカー デバイスがミュートされているときに、True に設定されます。
- スピーカー デバイスがミュートされていないときに、False に設定されます。
通話中に参加者から音声が聞こえません。 値が True に設定されている場合、ボリュームが誤ってミュートされる可能性があります。
speakerBusy スピーカーは既に使用中です。 デバイスが排他モードで使用されているか、デバイスが共有モードで使用されており、呼び出し元が排他モードでデバイスを使用するように求められています。 - スピーカー デバイス ストリームの取得がタイムアウト (オーディオ) したときに、True に設定されます。
- スピーカーの獲得が成功したときに、False に設定されます。
通話中に参加者からスピーカーを介して音声が聞こえません。 値が Trueに設定されている場合は、別のアプリケーションがスピーカーを使用しているかどうかを確認し、これを閉じることを試みることができるように、エンド ユーザーに視覚的な通知を送信します。
スピーカーが動作しません スピーカーが機能していない (オーディオ デバイス クライアントを初期化できなかったか、デバイスが 5 秒を超えて非アクティブになった) - スピーカーが使用不可であるか、デバイス ストリームの取得がタイムアウト (オーディオ) したときに、True に設定されます。
- スピーカーの獲得が成功したときに、False に設定されます。
通話中に参加者からスピーカーを介して音声が聞こえません。 スピーカー デバイスの状態を確認してみてください。
microphoneBusy マイクは既に使用されています。 デバイスが排他モードで使用されているか、デバイスが共有モードで使用されており、呼び出し元が排他モードでデバイスを使用するように求められています。 - マイク デバイス ストリームの取得がタイムアウト (オーディオ) したときに、True に設定されます。
- マイクの獲得が成功したときに、False に設定されます。
音声が通話の他の参加者に届いていません。 値が Trueに設定されている場合は、別のアプリケーションがマイクを使用しているかどうかを確認し、これを閉じることを試みることができるように、エンド ユーザーに視覚的な通知を送信します。

診断へのアクセス

対ユーザー診断はコア Call API の拡張機能であり、実行中の通話の診断ができます。

let userFacingDiagnostics = self.call?.feature(Features.localUserDiagnostics)

User Facing Diagnostic イベント

  • media および network 診断ソースのデリゲートを実装します。 それぞれ MediaDiagnosticsDelegateNetworkDiagnosticsDelegate
extension CallObserver: MediaDiagnosticsDelegate {
  func mediaDiagnostics(_ mediaDiagnostics: MediaDiagnostics,
                        didChangeIsCameraFrozen args: DiagnosticFlagChangedEventArgs) {
    let newValue = args.value
    // Handle the diagnostic event value changed...
  }
    
  func mediaDiagnostics(_ mediaDiagnostics: MediaDiagnostics,
                        didChangeIsSpeakerMuted args: DiagnosticFlagChangedEventArgs) {
    let newValue = args.value
    // Handle the diagnostic event value changed...
  }
    
  func mediaDiagnostics(_ mediaDiagnostics: MediaDiagnostics,
                        didChangeIsCameraStartFailed args: DiagnosticFlagChangedEventArgs) {
    let newValue = args.value
    // Handle the diagnostic event value changed...
  }
    
  func mediaDiagnostics(_ mediaDiagnostics: MediaDiagnostics,
                        didChangeIsSpeakerVolumeZero args: DiagnosticFlagChangedEventArgs) {
    let newValue = args.value
    // Handle the diagnostic event value changed...
  }
    
  func mediaDiagnostics(_ mediaDiagnostics: MediaDiagnostics,
                        didChangeIsSpeakerNotFunctioning args: DiagnosticFlagChangedEventArgs) {
    let newValue = args.value
    // Handle the diagnostic event value changed...
  }
    
  func mediaDiagnostics(_ mediaDiagnostics: MediaDiagnostics,
                        didChangeIsCameraPermissionDenied args: DiagnosticFlagChangedEventArgs) {
    let newValue = args.value
    // Handle the diagnostic event value changed...
  }
    
  func mediaDiagnostics(_ mediaDiagnostics: MediaDiagnostics,
                        didChangeIsMicrophoneNotFunctioning args: DiagnosticFlagChangedEventArgs) {
    let newValue = args.value
    // Handle the diagnostic event value changed...
  }
    
  func mediaDiagnostics(_ mediaDiagnostics: MediaDiagnostics,
                        didChangeIsCameraStartTimedOut args: DiagnosticFlagChangedEventArgs) {
    let newValue = args.value
    // Handle the diagnostic event value changed...
  }
    
  func mediaDiagnostics(_ mediaDiagnostics: MediaDiagnostics,
                        didChangeIsMicrophoneMutedUnexpectedly args: DiagnosticFlagChangedEventArgs) {
    let newValue = args.value
    // Handle the diagnostic event value changed...
  }
    
  func mediaDiagnostics(_ mediaDiagnostics: MediaDiagnostics,
                        didChangeIsZeroSpeakerDevicesAvailable args: DiagnosticFlagChangedEventArgs) {
    let newValue = args.value
    // Handle the diagnostic event value changed...                            
  }
    
  func mediaDiagnostics(_ mediaDiagnostics: MediaDiagnostics,
                        didChangeIsZeroMicrophoneDevicesAvailable args: DiagnosticFlagChangedEventArgs) {
    let newValue = args.value
    // Handle the diagnostic event value changed...
  }
    
  func mediaDiagnostics(_ mediaDiagnostics: MediaDiagnostics,
                        didChangeIsSpeakingWhileMicrophoneIsMuted args: DiagnosticFlagChangedEventArgs) {
    let newValue = args.value
    // Handle the diagnostic event value changed...
  }
    
  func mediaDiagnostics(_ mediaDiagnostics: MediaDiagnostics,
                        didChangeIsSpeakerBusy args: DiagnosticFlagChangedEventArgs) {
    let newValue = args.value
    // Handle the diagnostic event value changed...
  }
    
  func mediaDiagnostics(_ mediaDiagnostics: MediaDiagnostics,
                        didChangeIsMicrophoneBusy args: DiagnosticFlagChangedEventArgs) {
    let newValue = args.value
    // Handle the diagnostic event value changed...
  }
}

extension CallObserver: NetworkDiagnosticsDelegate {
  func networkDiagnostics(_ networkDiagnostics: NetworkDiagnostics,
                          didChangeIsNetworkRelaysUnreachable args: DiagnosticFlagChangedEventArgs) {
    let newValue = args.value
    // Handle the diagnostic event value changed...
  }
    
  func networkDiagnostics(_ networkDiagnostics: NetworkDiagnostics,
                          didChangeNetworkReconnectionQuality args: DiagnosticQualityChangedEventArgs) {
    let newValue = args.value
    // Handle the diagnostic event value changed...
  }
    
  func networkDiagnostics(_ networkDiagnostics: NetworkDiagnostics,
                          didChangeNetworkSendQuality args: DiagnosticQualityChangedEventArgs) {
    let newValue = args.value
    // Handle the diagnostic event value changed...
  }
    
  func networkDiagnostics(_ networkDiagnostics: NetworkDiagnostics,
                          didChangeIsNetworkUnavailable args: DiagnosticFlagChangedEventArgs) {
    let newValue = args.value
    // Handle the diagnostic event value changed...
  }
    
  func networkDiagnostics(_ networkDiagnostics: NetworkDiagnostics,
                          didChangeNetworkReceiveQuality args: DiagnosticQualityChangedEventArgs) {
    let newValue = args.value
    // Handle the diagnostic event value changed...
  }
}
  • media および network 診断への参照を保持し、イベントをリッスンするためのデリゲート オブジェクトを設定します。
self.mediaDiagnostics = userFacingDiagnostics?.media
self.networkDiagnostics = userFacingDiagnostics?.network
self.mediaDiagnostics?.delegate = self.callObserver
self.networkDiagnostics?.delegate = self.callObserver

SDK を使用してCallKit が有効であるか、アプリケーションで CallKit 統合を実装している場合、OS でプライバシー上の理由により、アプリケーションがマイクを保持できなくなる可能性があります。この結果、ユーザーが話していることを検出するためのマイク デバイスからの入力をキャプチャできないため、didIsSpeakingWhileMicrophoneIsMuted イベントが期待どおりに機能しなくなります。

最新の User Facing Diagnostics を取得する

  • 出力された最新の診断値を取得します。 診断の値をまだ受け取っていない場合は、nil または .unknown が返されます。
let lastSpeakerNotFunctionValue = self.mediaDiagnostics.latest.isSpeakerNotFunctioning // Boolean?
let lastNetworkRelayNotReachableValue = self.networkDiagnostics.latest.networkRelaysUnreachable // Boolean?
let lastReceiveQualityValue = self.networkDiagnostics.latest.networkReceiveQuality // DiagnosticQuality (.good, .poor, .bad)
// or .unknown if there isn't a diagnostic for this.

診断値

次の対ユーザー診断を利用できます。

ネットワーク値

名前 説明 有効値 ユース ケース 軽減の手順
ネットワークが利用できません 利用できるネットワークがありません。 - 利用できるネットワークがないことを理由に通話に失敗したときに、True に設定されます。
- ICE 候補が存在する場合には、False に設定されます。
デバイスがネットワークに接続されていません。 通話に、音声通話を維持できる信頼性の高いインターネット接続が設定されている必要があります。 詳細は、「ネットワーク最適化 セクションを参照してください。
ネットワークリレーに接続できません ネットワークに問題があります。 - Azure Communication Services リレーに到達できなくなるような制約がネットワークに存在するときに、True に設定されます。
- 新しい通話を発信すると、False に設定されます。
通話中に Wi-Fi 信号のオンとオフが切り替わったとき。 ファイアウォール規則とネットワーク ルーティングによって、クライアントが Microsoft のターン サーバーに到達できる必要があります。 詳細については、「ファイアウォールの構成」セクションをご覧ください。
networkReconnectionQuality 接続が失われ、ネットワークに再度接続しています。 - ネットワークへの接続が切れると、Bad に設定されます
- メディア転送接続が失われると、Poor に設定されます
- 新しいセッションが接続済みになると、Good に設定されます。
帯域幅が狭い、インターネット接続がない 通話に、音声通話を維持できる信頼性の高いインターネット接続が設定されている必要があります。 詳細は、「ネットワーク帯域幅の要件」セクションを参照してください。
networkReceiveQuality 受信ストリームの品質に関するインジケーターです。 - ストリームの受信に深刻な問題があるときに、Bad に設定されます。
- ストリームの受信に中等度の問題があるときに、Poor に設定されます。
- ストリームの受信に問題がないときに、Good に設定されます。
- 通話中に音声が流れている場合のみ表示されます。つまり、これは参加者が一定時間、積極的に発言していることを意味します。
低帯域幅 通話に、音声通話を維持できる信頼性の高いインターネット接続が設定されている必要があります。 詳細は、「ネットワーク帯域幅の要件」セクションを参照してください。 使用可能なインターネット帯域幅を節約するために、カメラをオフにすることをエンド ユーザーに提案してください。
ネットワーク送信品質 送信ストリームの品質の指標。 - ストリームの送信に重大な問題があるときに、Bad に設定されます。
- ストリームの送信に軽微な問題があるときに、Poor に設定されます。
- ストリームの送信に問題がないときに、Good に設定されます。
- 受信品質の診断の場合と同様に、通話中に音声が流れている場合のみ表示されます。つまり、これは参加者が一定時間、積極的に発言していることを意味します。 ただし、品質の検証には相手側の情報が必要なため、1 対 1 の通話でのみ機能します。 相手側が、受信したデータを通知する必要があります。
低帯域幅 通話に、音声通話を維持できる信頼性の高いインターネット接続が設定されている必要があります。 詳細は、「ネットワーク帯域幅の要件」セクションを参照してください。 また、使用可能なインターネット帯域幅を節約するために、カメラをオフにすることをエンド ユーザーに提案してください。

オーディオ値

名前 説明 有効値 ユース ケース 軽減の手順
noSpeakerDevicesAvailable ユーザーのシステムにオーディオ出力デバイス (スピーカー) がありません。 - システムにスピーカー デバイスがなく、スピーカー選択がサポートされている場合には、True に設定されます。
- システムにスピーカー デバイスが少なくとも 1 つあり、スピーカー選択がサポートされているときに、False に設定されます。
スピーカーがすべて取り外されている 値が True に設定されている場合は、現在の通話セッションで話者が利用できないという視覚的な通知をエンド ユーザーに与えることを検討してください。
マイクがミュートになっているときに話しています 話をしているものの、ミュート中です。 - ローカルのマイクがミュートになっている間にローカル ユーザーが話をしていると、True に設定されます。
- ローカルのユーザーが話すのをやめるか、マイクのミュートを解除すると False になります。
この診断イベントは、ノイズを回避し、より良いユーザー エクスペリエンスを提供するために、ユーザーの操作なしに一定回数トリガーされた場合は自動的に無効にすることができます。 新しいミュート アクションが発生すると、再度有効になります。
通話中にマイクをミュートした状態で話をする。 値が True に設定されている場合は、話していて、オーディオがミュートされていることに気付いていない可能性があるという視覚的な通知をエンド ユーザーに与えることを検討してください。
noMicrophoneDevicesAvailable ユーザーのシステムにオーディオ キャプチャ デバイス (マイク) がありません - システムにマイク デバイスがない場合には、True に設定されます。
- システムにマイク デバイスが 1 つ以上あるときに、False に設定されます。
通話中にマイクがすべて取り外される。 値が True に設定されている場合は、現在の通話セッションでマイクが利用できないという視覚的な通知をエンド ユーザーに与えることを検討してください。 詳細については、「 デバイス マネージャーからマイクを有効にする 」セクションを参照してください。
マイクが機能していません マイクが機能していません。 - マイク デバイスがシステムで無効になっている可能性があるか、別のプロセスで使用されていることが原因でローカル オーディオ ストリームの送信開始に失敗した場合には、True に設定されます。 この UFD の発生には、約 10 秒かかります。
- マイクがオーディオ ストリームの送信を正常に再開した場合には、False に設定されます。
利用できるマイクがない、システムでマイクへのアクセスが無効になっている 値を True に設定して、マイクに問題があるという視覚的通知をエンド ユーザーに提供する場合。
マイクが予期せずミュートになる マイクがミュートになっています - マイクが予期せずミュート状態になった場合には、True に設定されます。
- マイクがオーディオ ストリームの送信を正常に開始した場合には、False に設定されます
マイクがシステムからミュートに設定されています。 ほとんどの場合、ユーザーがモバイル デバイスで Azure Communication Services 通話中に電話がかかってきた場合に発生します。 ほとんどの場合、ユーザーが電話に応答できるよう、オペレーティング システムは Azure Communication Services 通話をミュートします。 値が True に設定されている場合は、通話が受信されたため、通話がミュートされたという視覚的な通知をエンド ユーザーに提供します。 詳細については、Azure Communication Services 通話をミュートする OS の最適な処理方法のセクションを参照してください。
マイクの許可が拒否されました macOS でデバイスの音量が小さいか、ほぼ無音の状態になっています。 - システム設定 (オーディオ) からオーディオへのアクセス許可が拒否されたときに、True に設定されます。
- ストリームの取得に成功した場合には、False に設定されます。
注: この診断は、macOS でのみ機能します。
設定でマイクへのアクセス許可が無効になっている。 値が True に設定されている場合は、Azure Communication Services 通話にマイクを使用するアクセス許可を有効にしなかったことをエンド ユーザーに視覚的に通知します。

カメラの値

名前 説明 有効値 ユース ケース 軽減の手順
カメラフリーズ カメラのフレーム生成が 5 秒以上停止しています。 - ローカル ビデオ ストリームが停止していると、True に設定されます。 この診断は、自分のビデオがリモートの相手側では停止して見えているか、リモート参加者がビデオを画面にレンダリングできていないことを意味します。
- 停止状態が解消し、相手側でビデオが通常どおり表示されるようになると、False に設定されます。
通話中にカメラが失われたか、ネットワークの状態が悪いためにカメラが停止した。 値が True に設定されている場合、リモート参加者ネットワークが悪い可能性があるという通知をエンド ユーザーに提供する場合は、帯域幅を節約するためにカメラをオフにしてください。 詳細については、Azure Communication Services 通話に必要なインターネット機能に関する「ネットワーク帯域幅の要件」セクションを参照してください。
カメラの起動に失敗しました カメラの障害全般です。 - カメラ デバイスがシステムで無効になっている可能性があるか、別のプロセスで使用されていることが原因でローカル ビデオの送信開始に失敗した場合には、True に設定されます。
- 選択したカメラ デバイスがローカル ビデオの送信を正常に再開した場合には、False に設定されます。
カメラの障害 値が True に設定されている場合は、カメラの起動に失敗したという視覚的な通知をエンド ユーザーに提供します。
カメラの起動がタイムアウトしました カメラの状態が悪い場合に共通するシナリオです。 - カメラ デバイスがビデオ ストリームの送信を開始する際にタイムアウトになった場合には、True に設定されます。
- 選択したカメラ デバイスがローカル ビデオの送信を正常に再開した場合には、False に設定されます。
カメラの障害 値が True に設定されている場合、カメラで問題が発生している可能性があるという視覚的な通知をエンド ユーザーに提供します。 (通知を削除するために値が False に設定されている場合)。
カメラの許可が拒否されました カメラへのアクセス許可が設定で拒否されました。 - システム設定 (ビデオ) からカメラへのアクセス許可が拒否されたときに、True に設定されます。
- ストリームの取得に成功した場合には、False に設定されます。
注: この診断は、macOS の Chrome でのみ機能します。
設定でカメラへのアクセス許可が無効になっている。 値が True に設定されている場合は、Azure Communication Services 通話にカメラを使用するアクセス許可を有効にしなかったことをエンド ユーザーに視覚的に通知します。
カメラが予期せず停止しました カメラの不具合 - カメラが予期しない停止状態になると True になります。
- カメラが起動して動画ストリームの送信を再開すると False になります。
カメラが正しく動作しているかどうかを確認します。 値が True に設定されている場合、カメラで問題が発生している可能性があるという視覚的な通知をエンド ユーザーに提供します。 (通知を削除するために値が False に設定されている場合)。

ネイティブのみ

名前 説明 有効値 ユース ケース 軽減策の手順
スピーカー音量がゼロです デバイス (スピーカー) のボリュームが 0 です。 - スピーカーのボリュームが 0 であるときに、True に設定されます。
- スピーカー音量が 0 でないときに、False に設定されます。
通話中に参加者から音声が聞こえません。 値が True に設定されている場合、ボリュームが誤って最小 (ゼロ) になる可能性があります。
スピーカーがミュートされています スピーカー デバイスがミュートされています。 - スピーカー デバイスがミュートされているときに、True に設定されます。
- スピーカー デバイスがミュートされていないときに、False に設定されます。
通話中に参加者から音声が聞こえません。 値が True に設定されている場合、ボリュームが誤ってミュートされる可能性があります。
speakerBusy スピーカーは既に使用中です。 デバイスが排他モードで使用されているか、デバイスが共有モードで使用されており、呼び出し元が排他モードでデバイスを使用するように求められています。 - スピーカー デバイス ストリームの取得がタイムアウト (オーディオ) したときに、True に設定されます。
- スピーカーの獲得が成功したときに、False に設定されます。
通話中に参加者からスピーカーを介して音声が聞こえません。 値が Trueに設定されている場合は、別のアプリケーションがスピーカーを使用しているかどうかを確認し、これを閉じることを試みることができるように、エンド ユーザーに視覚的な通知を送信します。
スピーカーが動作しません スピーカーが機能していない (オーディオ デバイス クライアントを初期化できなかったか、デバイスが 5 秒を超えて非アクティブになった) - スピーカーが使用不可であるか、デバイス ストリームの取得がタイムアウト (オーディオ) したときに、True に設定されます。
- スピーカーの獲得が成功したときに、False に設定されます。
通話中に参加者からスピーカーを介して音声が聞こえません。 スピーカー デバイスの状態を確認してみてください。
microphoneBusy マイクは既に使用されています。 デバイスが排他モードで使用されているか、デバイスが共有モードで使用されており、呼び出し元が排他モードでデバイスを使用するように求められています。 - マイク デバイス ストリームの取得がタイムアウト (オーディオ) したときに、True に設定されます。
- マイクの獲得が成功したときに、False に設定されます。
音声が通話の他の参加者に届いていません。 値が Trueに設定されている場合は、別のアプリケーションがマイクを使用しているかどうかを確認し、これを閉じることを試みることができるように、エンド ユーザーに視覚的な通知を送信します。

診断へのアクセス

対ユーザー診断はコア Call API の拡張機能であり、実行中の通話の診断ができます。

this.diagnosticsCallFeature = call.Features.LocalUserDiagnostics;

User Facing Diagnostic イベント

  • 診断イベントのリスナーを実装します。
private async void Call__OnNetworkUnavailableChanged(object sender, FlagDiagnosticChangedEventArgs args)
{
  var value = args.Value;
  // Handle the diagnostic event value changed...
}

// Listen to other network diagnostics

private async void Call__OnMediaSpeakerNotFunctioningChanged(object sender, FlagDiagnosticChangedEventArgs args)
{
  var value = args.Value;
  // Handle the diagnostic event value changed...
}

// Listen to other media diagnostics
  • イベントをリッスンするためのイベント メソッドを設定します。
this.diagnosticsCallFeature = call.Features.LocalUserDiagnostics;
this.networkDiagnostics = diagnosticsCallFeature.Network;
this.mediaDiagnostics = diagnosticsCallFeature.Media;

this.networkDiagnostics.NetworkUnavailableChanged += Call__OnNetworkUnavailableChanged;
// Listen to other network events as well ... 

this.mediaDiagnostics.SpeakerNotFunctioningChanged += Call__OnMediaSpeakerNotFunctioningChanged;
// Listen to other media events as well ... 

// Removing listeners

this.networkDiagnostics.NetworkUnavailable -= Call__NetworkUnavailableChanged;
// Remove the other listeners as well ... 

this.mediaDiagnostics.SpeakerNotFunctioningChanged -= Call__OnMediaSpeakerNotFunctioningChanged;
// Remove the other listeners as well ... 

最新の User Facing Diagnostics を取得する

  • 現在の通話で出力された最新の診断値を取得します。 診断の値をまだ受け取っていない場合は、null または .unknown が返されます。
this.diagnosticsCallFeature = call.Features.LocalUserDiagnostics;
this.networkDiagnostics = diagnosticsCallFeature.Network;
this.mediaDiagnostics = diagnosticsCallFeature.Media;

bool? lastSpeakerNotFunctionValue = this.mediaDiagnostics.GetLatestDiagnostics().IsSpeakerNotFunctioning; // Boolean?
bool? lastNetworkRelayNotReachableValue = this.networkDiagnostics.GetLatestDiagnostics().IsNetworkRelaysUnreachable; // Boolean?
DiagnosticQuality lastReceiveQualityValue = this.networkDiagnostics.GetLatestDiagnostics().NetworkReceiveQuality; // DiagnosticQuality (.good, .poor, .bad)
// or .unknown if there isn't a diagnostic for this.