音声入力の共有

オーディオ入力は通常、内蔵マイク、外部マイク、または オーディオ インターフェースを使用します。オーディオ入力ソースは 使用できます。

2 つ以上のアプリの両方が「キャプチャ」し、同じ音声入力になります。 異なるタスクを実行している可能性があります。 たとえば、音声を受信するアプリによっては「録音」、シンプルなボイスレコーダーのように、 他のアプリは「リッスン」しますがGoogle アシスタントやユーザー補助サービスなど、 音声コマンドに反応する

いずれの場合も、これらのアプリは音声入力の受信を必要とします。 このページでは、「キャプチャ」という用語を使用します。あるかどうかに関係なく アプリが録音中か再生中かを確認します。

複数のアプリで同時に音声をキャプチャする場合は、問題が発生することがあります。 同じソースからすべてのスピーカーに オーディオ信号を配信しますこのページでは、以下について説明します。 Android システムが、音声をキャプチャする複数のアプリ間で音声入力を共有する方法。

Android 10 より前の動作

Android 10 より前は、入力オーディオ ストリームをキャプチャできるのは一度に 1 つのアプリだけでした。 あります。すでに音声を録音または聴いているアプリがある場合、 AudioRecord オブジェクトを作成していますが、 AudioRecord.startRecording() 録画が開始されませんでした

このルールの例外の一つは、特権アプリ(Google アシスタントや ユーザー補助サービスなど)に android.permission.CAPTURE_AUDIO_HOTWORD で、次のタイプのオーディオ ソースを使用しました HOTWORD。その場合は、別のアプリが録画を開始できます。そうなったとき、 特権アプリが終了し、新しいアプリが入力をキャプチャしました。

Android 9 ではもう一つ変更が行われました。フォアグラウンドで実行されるアプリのみ( フォアグラウンド サービスなど)で、音声入力をキャプチャできます。インストールされていないアプリは、 フォアグラウンド サービスまたはフォアグラウンド UI コンポーネントがキャプチャを開始し、 キャプチャを実行し続けたが、アプリがキャプチャした唯一のアプリでも無音状態になった 出力します。

Android 10 の動作

Android 10 より前の動作は「先着順」です。 アプリが音声のキャプチャを開始すると、他のアプリは 音声をキャプチャしているアプリが停止するまで入力し続けることができます。

Android 10 では、入力音声ストリームを切り替えられる優先スキームが定められています。 アプリ間で通信を行えます。ほとんどの場合、新しいアプリが音声入力を取得すると、 以前にキャプチャしたアプリは動作し続けますが、無音を受け取ります。一部の 引き続き両方のアプリに音声を配信できます。さまざまな 共有のシナリオについて、以下で説明します。

このスキームは、音声フォーカスが複数のアプリを処理する方法と似ています 競合している企業もあります。ただし、音声フォーカスは以下によって管理されます。 フォーカスの取得と解放を行いながら、入力の切り替えが ここで説明するスキームは、適用される優先順位ポリシーに基づいて 新しいアプリが音声のキャプチャを開始するたびに、自動的に有効になります。

音声をキャプチャするために、Android は次の 2 種類のアプリを区別します。

  • 通常ユーザーがインストールするアプリです。
  • 「閲覧者限定」アプリはデバイスにプリインストールされています。Google アシスタントやすべてのユーザー補助サービスが対象です。

また、アプリは別の方法で処理されます。 「privacy-sensitive」コマンドをオーディオ ソース: CAMCORDER または VOICE_COMMUNICATION

オーディオ入力の使用と共有に関する優先順位ルールは次のとおりです。

  • 特権アプリは通常のアプリよりも優先度が高くなります。
  • フォアグラウンド UI が表示されるアプリは、バックグラウンド アプリよりも優先されます。
  • プライバシーに配慮が必要なソースから音声をキャプチャするアプリは、そうでないアプリよりも優先されます。
  • 2 つの通常のアプリで同時に音声をキャプチャすることはできない。
  • 状況によっては、特権アプリが別のアプリと音声入力を共有できます。
  • 優先度が同じ 2 つのバックグラウンド アプリが音声をキャプチャしている場合、最後に起動したアプリが優先されます。

共有のシナリオ

2 つのアプリが音声をキャプチャしようとする場合、 両方が入力信号を受信できる場合と、どちらか一方が入力信号を受信できる場合があります。 できます。

主に 4 つのシナリオがあります。

  • アシスタント + 通常のアプリ
  • ユーザー補助サービス + 通常のアプリ
  • 2 つの普通のアプリ
  • 音声通話 + 通常のアプリ

アシスタント + 通常のアプリ

アシスタントはプリインストールされていて、 ロール RoleManager.ROLE_ASSISTANT。 このロールを持つ他のプリインストール アプリも同様に扱われます。

Android は、以下のルールに従って入力音声を共有します。

  • アシスタントは(フォアグラウンドでもバックグラウンドでも)音声を受信できます ただし、プライバシーに配慮した音源を使用している別のアプリがすでにキャプチャしている場合を除く。

  • アシスタントに UI が表示されている場合を除き、アプリは音声を受信する コンポーネントが画面上部に表示されます。

どちらのアプリも、アシスタントがバックグラウンドで動作しているときのみ音声を受信します。 もう一方のアプリは、プライバシーに配慮した音源からキャプチャしていません。

ユーザー補助サービス + 通常のアプリ

AccessibilityService 厳格な宣言が必要です。

Android は、以下のルールに従って入力音声を共有します。

  • サービスの UI が一番上の場合は、サービスとアプリの両方が 入力できます。この動作により、音声通話やビデオ通話の制御などの機能が提供されます キャプチャできます。

  • サービスが一番上でない場合、このケースは下記の通常の 2 つのアプリのケースと同様に処理されます。

2 つの普通のアプリ

2 つのアプリが同時に音声をキャプチャしている場合、一方のアプリは音声を受信し、もう一方のアプリは無音になります。

Android は、以下のルールに従って入力音声を共有します。

  • どちらのアプリもプライバシーに配慮していなければ、 UI が一番上にあるアプリは音声を受信します。 どちらのアプリにも UI がない場合は、最後にキャプチャを開始したアプリが音声を受信します。
  • プライバシーに配慮が必要なアプリの場合、音声と UI が上部に表示されている場合やキャプチャが開始されている場合でも、他のアプリは無音になります。 見てきました。
  • 両方のアプリがプライバシーにかかわる場合は、ほとんどのアプリで 最近は音声が受信され、もう一方は無音になります。

音声通話 + 通常のアプリ

によって音声モードが返された場合、音声通話はアクティブです。 AudioManager.getMode(): MODE_IN_CALL または MODE_IN_COMMUNICATION

Android は、以下のルールに従って入力音声を共有します。

Android 11 の動作

Android 11(API レベル 30)は、Android 10 の優先スキームを遵守します。 使用できます。また、AudioRecordMediaRecorder、および 音声を同時にキャプチャする機能を有効または無効にする AAudioStream。 どのユースケースにも適しています

新しいメソッドは以下のとおりです。

setPrivacySensitive()true の場合、キャプチャのユースケースは非公開であり、 同時にキャプチャすることはできません。この設定は デフォルトの動作はオーディオ ソースによって異なります。たとえば VOICE_COMMUNICATION はデフォルトで非公開ですが、UNPROCESSED は非公開です。

構成の変更

複数のアプリが同時に音声をキャプチャしている場合、そのうちの 1 つか 2 つのみ 「有効」(音声の受信)他の参加者はミュートされます(無音)。Google 変更すると、オーディオ フレームワークによってオーディオパスが再構成されることがあります。 以下のルールが適用されます。

  • アクティブなアプリごとにオーディオ入力デバイスが変更される可能性があります( 内蔵マイクを Bluetooth ヘッドセットに接続)。
  • 優先度が最も高いアクティブなアプリに関連付けられた前処理が有効になります。すべて 他の前処理は無視されます。

優先度の高いアプリがアクティブになると、アクティブなアプリは消音になる可能性があるため、 登録して AudioManager.AudioRecordingCallback AudioRecord または MediaRecorder 構成が変更されたときに通知を受け取るようにできます。 次のような変更が考えられます。

  • 消音またはミュート解除したキャプチャ
  • デバイスを変更しました
  • 前処理が変更されました
  • ストリームのプロパティの変更(サンプリング レート、チャンネル マスク、サンプル形式)

呼び出しを行う必要があります。 AudioRecord.registerAudioRecordingCallback() 必要があります。 コールバックは、アプリが音声を受信して変更が発生した場合にのみ実行されます。

メソッド onRecordingConfigChanged() は、現在の音声キャプチャ状態を含む AudioRecordingConfiguration を返します。以下を使用 メソッドも用意されています。

isClientSilenced()
クライアントに返された音声がキャプチャ ポリシーによって消音されている場合に、true を返します。
getAudioDevice()
アクティブなオーディオ デバイスを返します。
getEffects()
アクティブな前処理効果を返します。クライアントが優先度の高いアクティブなアプリでない場合、active な効果は getClientEffects() によって返されるものと異なる場合があります。
getFormat()
ストリームのプロパティを返します。クライアントが受信した実際の音声データは常に、getClientFormat() から返された必要な形式に従います。フレームワークは、必要なリサンプリング、チャネル、フォーマット変換を、ハードウェア インターフェースで使用されているフォーマットからクライアントが指定したフォーマットへ自動的に実行します。
AudioRecord.getActiveRecordingConfiguration()
アクティブな記録構成を返します。

次の呼び出しを行うと、デバイスですべてのアクティブな録音を全体的に表示できます。 AudioManager.getActiveRecordingConfigurations()