見出し画像

Androidアプリ開発入門 (6) - 音声入力の共有

Androidアプリでの「音声入力の共有」をまとめました。

・API 29: Android 10 (Q)

前回

1. Androidの音声入力の共有

内蔵マイクからの「音声入力」を、複数のアプリが同時に「キャプチャ」しようとすることがあります。音声入力を利用するアプリには、ボイスレコーダのように録音するアプリもあれば、Googleアシスタントのように発話応答するアプリもあります。同じ音声入力を復数のアプリで同時にキャプチャしようとすると、問題が発生する場合があります。

2. Android 10より前の動作

「Android 10」より前は、音声キャプチャできるのは、1度に1アプリだけで早いもの勝ちでした。あるアプリが音声キャプチャを開始すると、停止するまで、他のアプリが音声キャプチャできないませんでした。

例外として、Googleアシスタントが音声キャプチャしていた場合、別のアプリが音声キャプチャを開始できました。この時、Googleアシスタントの音声キャプチャは停止していました。

3. Android 10以降の動作

Android 10以降では優先度ルールが定められ、複数のアプリ間で音声キャプチャの切り替えが可能になりました。新しいアプリが音声キャプチャを開始すると、それまで音声キャプチャしていたアプリは、実行を継続するものの無音を受け取ります。場合によっては、両方で音声キャプチャすることも可能になりました。

4. 音声キャプチャの優先度ルール

音声キャプチャのアプリ種別は、次の2種類です。

・通常アプリ : ユーザーによってインストールされるアプリ。
・特権アプリ : 端末に当初からプレインストールされているアプリ。
 (Googleアシスタント、アクセシビリティサービス)

プライバシー音源(プライバシーに注意が必要な音源)は、次の2種類です。

・CAMCORDER : ビデオ録画用の音源。
・VOICE_COMMUNICATION : 音声通信用のマイク音源。

音声キャプチャの優先度ルールは次のとおりです。

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

5. 音声キャプチャの共有シナリオ

2つのアプリが音声キャプチャしようとすると、その両方で音声を受け取れる場合もあれば、一方が無音を受け取る場合もあります。

・アシスタント + 通常アプリ
・アクセシビリティサービス + 通常アプリ
・通常アプリ
+ 通常アプリ
・通話 + 通常アプリ

◎ アシスタント + 通常アプリ
・両方で音声を受け取れるのは、アシスタントがバックグラウンドかつ、別アプリのキャプチャ対象がプライバシー音源ではない場合に限られます。

◎ アクセシビリティサービス + 通常アプリ
・サービスのUIが最前面に表示されている場合、サービスとアプリの両方が音声入力を受け取れます。これにより、音声コマンドによって通話を制御するといった機能が可能になります。
・サービスのUIが最前面に表示されていない場合、「通常アプリ + 通常アプリ」の場合と同じように処理されます。

◎ 通常アプリ + 通常アプリ
・2つの通常アプリが同時に音声キャプチャしている場合、一方のアプリだけが音声を受け取り、他方は無音を受け取ります。
・どちらのアプリもキャプチャ対象がプライバシー音源の場合、UI表示しているアプリが音声を受け取れます。どちらのアプリにもUIがない場合、後からキャプチャ開始したアプリが音声を受け取ります。
・一方のアプリのキャプチャ対象がプライバシー音源の場合、そのアプリが音声を受け取ります。もう一方のアプリは、UI表示していても、後からキャプチャ開始しても、無音を受け取ります。
・どちらのアプリもキャプチャ対象がプライバシー音源の場合、後からキャプチャ開始したアプリが音声を受け取り、もう一方のアプリは無音を受け取ります。

◎ 通話 + 通常アプリ
・通話は常に音声を受け取ります。
・通常アプリがアクセシビリティ サービスの場合、その通常アプリは音声を受け取れます。
・パーミッション「CAPTURE_AUDIO_OUTPUT」の特権アプリアプリは、音声を受け取れます。
・アプリで通話のアップリンク(TX)とダウンリンク(RX)をキャプチャするには、アプリで音源として MediaRecorder.AudioSource.VOICE_UPLINK か MediaRecorder.AudioSource.VOICE_DOWNLINK、または端末 AudioDeviceInfo.TYPE_TELEPHONYを指定する必要があります。

6. 参考

次回



この記事が気に入ったらサポートをしてみませんか?