Android 10 では、アクセシビリティ サービスが提供する音声コマンドを使用して VoIP 通話やビデオ レコーダーを制御する場合など、複数のアクティブな音声キャプチャが同時に発生する際のユーザー エクスペリエンスが改善されています。
Android 10 のオーディオ フレームワークでは、特別な権限を持つ特定のアプリのみが通常のアプリと同時に音声をキャプチャできるようにするポリシーが実装されています。
この同時実行ポリシーは、アプリがキャプチャを開始するのを妨げるのではなく、キャプチャした音声をサイレントにすることで実行されます。フレームワークはこれにより、アクティブな音声キャプチャの数とタイプの変化にも、動的に対応できるようになります。別のアプリがキャプチャを完了した後、対象のアプリのマイクへのフルアクセスを回復させるようにすることで、アプリがキャプチャを開始するのを妨げる必要がなくなります。
オーディオ HAL とオーディオ サブシステムが同時に動作する場合、複数のアクティブな入力ストリームを同時にサポートする必要があります。1 つのストリームだけがアクティブなクライアントにサイレントではないオーディオを提供する場合でも、この要件を遵守する必要があります。
CDD の要件
同時キャプチャのサポートの要件については、CDD をご覧ください。
オーディオ HAL からキャプチャする多様なシナリオ
同時キャプチャでは、アクティブな入力ストリームの数、入力デバイスの選択、前処理の構成に関して多様なシナリオが考えられます。
以下のような場合に同時実行が発生します。
- アプリケーション プロセッサ(AP)からの複数の入力ストリーム
- 入力ストリームと音声通話
- 入力ストリームと省電力起動ワード検出を実装したオーディオ DSP
AP 入力ストリームの同時アクティビティ
オーディオ ポリシー構成ファイル(audio_policy_configuration.xml
)は、同時に開くことができる入力ストリームの数と同時にアクティブにできる入力ストリームの数を決定するために、オーディオ フレームワークによって使用されます。
オーディオ HAL は、開いているアクティブな構成ファイルにリストされている各入力プロファイル(ロール sink
の mixPort
)に対して、少なくとも 1 つのインスタンスをサポートしている必要があります。
デバイスの選択
同じ HAL 入力ストリームに複数の有効なクライアントが接続されている場合、フレームワークはユースケースの優先度に基づいてその入力ストリームに適切なデバイスを選択します。
複数の入力ストリームがアクティブな場合、各ストリームに異なるデバイスを選択できます。
対応している場合、オーディオ HAL とサブシステムで複数の入力ストリームを許可して、それぞれ異なるデバイス(Bluetooth ヘッドセットと内蔵マイクなど)からキャプチャすることをおすすめします。
対応していない場合(2 つのデバイスが同じデジタル オーディオ インターフェースやバックエンドを共有しているなど)、オーディオ HAL でデバイスの選択を制御するストリームを選択する必要があります。
次のような場合があります。
- 同じシナリオが繰り返される場合には、最終的な状態が一貫したものとなり、デバイスの選択が同一となる必要があります。
- 同時実行状態が終了した場合、最後まで残ったアクティブなストリームは、そのストリームで最初にリクエストされたデバイスにルーティングされる必要があります。
オーディオ HAL によってアクティブなユースケース間の優先順位が定義されている場合は、frameworks/av/services/audiopolicy/common/include/policy.h
の source_priority()
と同じ優先順位に従います。
前処理の選択
オーディオ フレームワークでは、addEffect()
または removeEffect()
HAL メソッドを使用して入力ストリームの前処理をリクエストできます。
特定の入力ストリームを前処理する場合、オーディオ フレームワークは、入力ストリームで最も優先度の高いアクティブなユースケースと対応する構成のみを有効にします。ただし、ユースケースのアクティブ化と非アクティブ化中に重複が発生し、2 つのアクティブなプロセス(エコー キャンセラーの 2 つのインスタンスなど)が同時に発生して同じ入力ストリームで実行される場合があります。この場合、HAL 実装は受け入れられるリクエストを選択します。アクティブなリクエストを追跡し、いずれかのプロセスが無効になったときに正しい状態に戻します。
複数のキャプチャ ストリームが同時にアクティブになっている場合に、他のストリームで異なる前処理リクエストが実行される場合があります。
HAL とオーディオ サブシステムの実装では、同じ入力デバイスを共有している場合でも、異なる前処理を異なるストリームに適用できるようにする必要があります。つまり、メインのキャプチャ ソースからのストリームを分離した後に、前処理を適用する必要があります。
特定のオーディオ サブシステムで技術的な理由によってそれが不可能な場合、オーディオ HAL はデバイスの選択にリストされている優先度ルールと同じような優先度ルールを適用します。
音声通話とアプリケーション プロセッサ(AP)からのキャプチャの同時実行
音声通話がアクティブになっているときに、AP からのキャプチャが発生することがあります。これは Android 10 での新しい現象ではなく、同時キャプチャ機能と直接関連するものでもありません。しかし、このシナリオに関するガイドラインを参照用として以下に説明します。
通話中には、AP からの異なる 2 種類のキャプチャが必要になります。
通話 RX と通話 TX をキャプチャする
通話 RX と通話 TX のキャプチャは、オーディオ ソース(AudioSource.VOICE_UPLINK
または AudioSource.VOICE_DOWNLINK
)、あるいはデバイス AudioDevice.IN_TELEPHONY_RX
が使用されることによってトリガーされます。
オーディオ HAL は、デバイス AudioDevice.IN_TELEPHONY_RX
からの使用可能なルートを通じて、入力プロファイル(ロール sink
の mixPort
)で公開される必要があります。
通話が接続されたとき(オーディオ モードが AudioMode.IN_CALL
)、デバイス AudioDevice.IN_TELEPHONY_RX
から 1 つ以上のアクティブなキャプチャ ストリームを取得できる必要があります。
通話がアクティブなときに入力デバイスからキャプチャする
通話がアクティブなとき(オーディオ モードが AudioMode.IN_CALL
)、AP 入力ストリームの同時アクティビティのセクションで説明されているように、AP からの入力ストリームを開いてアクティブにできる必要があります。
ただし、デバイス選択の優先度と前処理については、AP 入力ストリームからのリクエストと競合する場合に備えて、常に音声通話が決定および実行する必要があります。
DSP と AP からの同時キャプチャ
オーディオ サブシステムが、省電力オーディオ コンテキスト機能、あるいは省電力起動ワード検出機能をサポートする DSP を含む場合には、実装で AP とオーディオ DSP からの同時キャプチャをサポートする必要があります。これには、初期検出フェーズ中の DSP によるキャプチャと、DSP によって検出がトリガーされた後の、AudioSource.HOTWORD
を使用した AP によるキャプチャの両方が含まれます。
これは、サウンド トリガー HAL が実装記述子 ISoundTriggerHw.Properties.concurrentCapture = true
を通じてレポートする同時キャプチャ フラグによって反映されます。
オーディオ HAL は、フラグ AudioInputFlag.HW_HOTWORD
で指定される、起動ワードのキャプチャに固有の入力プロファイルで公開される必要があります。実装時にこの入力プロファイルで、サウンド トリガー HAL によって同時に読み込むことができるサウンドモデルの数と同じか、それ以上のストリームを開いて有効化できるようにする必要があります。
また、他の入力プロファイルが有効であるときも、この入力プロファイルのキャプチャを実行できる必要があります。
アシスタント実装の影響
データ使用量とユーザー通知に関する要件
マイクの同時使用が悪用された場合、ユーザーの個人情報が漏洩する可能性があります。そのため、アシスタントのロールを要求するプリロードされた特権アプリに関して、以下の状況が守られ、保証される必要があります。
- ユーザーがアシスタントを操作しない限り、マイクから収集されたデータがデバイスの外部に送信されることがない。たとえば、起動ワードのトリガーなどが操作に該当します。
- 同時に音声をリッスンするアプリでは、起動ワードが検出された後に視覚的な通知をユーザーに提供する。これでユーザーは、それ以降の会話がアシスタントなどの他のアプリを経由することを把握できます。
- ユーザーはマイクやアシスタントのトリガーをオフにできる。
- 録音された音声が保存された場合、ユーザーは保存された音声にいつでもアクセスし、閲覧および消去できる。
Android 10 の機能改善
複数のアシスタントが相互をブロックしない
Android 9 以前では、デバイス上で 2 つのアシスタントが常時オンになっている場合、起動ワードをリッスンできるのは 1 つのアシスタントだけでした。そのため、2 つのアシスタント間で切り替える必要性がありました。Android 10 では、デフォルトのアシスタントは他のアシスタントと同時にリッスンできます。これにより、両方のアシスタントを使用するユーザーの操作がよりスムーズになります。
マイクを開いたままにするアプリ
Shazam や Waze などのアプリでマイクが開いたままの状態であっても、デフォルトのアシスタントは起動ワードをリッスンできます。
Android 10 では、デフォルト以外のアシスタント アプリの動作は変更されていません。
オーディオ HAL の実装例
このドキュメントのガイドラインを遵守したオーディオ HAL の実装例は、AOSP でご確認ください。