macOS Mojave (10.14.x) からセキュリティが強化され、プログラムからマイクへのアクセスには特別な権限が必要になりました。 「システム環境設定」→「セキュリティとプライバシー」→「マイク」とすると マイクロフォンへのアクセスが許されているアプリケーションの一覧が表示されます。 ここに"+"ボタンがないというバグ(あえてバグと表記します)のため、Javaを追加することができず、 javaにマイクへのアクセス権限を付与できません。
このためjavaのプログラムからマイクへのアクセスができなくなりました。 エラーは起きませんが、データがとれず all 0 となります。 他のアプリケーションでは Info.plistをいじると一覧に追加できる場合もあるようですが、 OpenJDKのjavaではうまくいかないようです。 このバグは macOS Catalina (10.15.x) になっても解消されていません。
したがって、以下で解説しているJavaプログラムからマイクへのアクセス方法は、 WindowsおよびmacOS10.13以前のMacのみで通用するものです。
Java で音声を扱う方法は「 Java Sound プログラマーズ・ガイド 」を参考にするとよいでしょう。
(例)8bit、モノラル、サンプリング周期8KHzの音声データ量は 8(bit) ÷ 8 (bit/byte) × 1 (channel) × 8K(hz) = 8Kbyte/sec (例2)16bit、ステレオ、サンプリング周期44KHzの音声データ量は 16(bit) ÷ 8 (bit/byte) × 2 (channel) × 44K(hz) = 176Kbyte/sec
音声の波形 | サンプリング |
サンプリングによって得られるデータ | データの再生 |
音声ファイルのフォーマットにはいろいろあるが、その中でも 以下の3種類に関しては知っておくことが望ましい。
MicrosoftとIBMがPCの標準フォーマットとして開発したもの。 8bitまたは16bitで、モノラルもステレオも可能。 サンプリング・レートも可変(11kHz, 22kHz, 44kHzなどが一般的)である。 ファイル名の拡張子には .wavを使う。
Apple により開発された音声フォーマットであり、Macでよく使われる。
Linuxなどでは最も一般的な、音声を扱う形式。 8bitモノラルで8kHzのサンプリング・レートである。 ファイル名の拡張子には .au または .snd を使う。 拡張子に.auを使うのでAUフォーマットと呼ばれることもある。
最近のmacOS ではセキュリティが強化されており、 マイクにアクセスするアプリケーションを実行する時は macOSはユーザにその許可を求めます。 しかし、この部分にバグがあり、java プログラムからからマイクにアクセスしようとしても セキュリティの承認が求められるわけではなく、単にデータが取れない状態が生じます。 appleはこのバグを放置したままです。
これを回避する方法は stack overflow にあります。 だが、この方法は普通のjavaアプリケーションでは取れない。
/Library/Java/JavaVirtualMachines/jdk-14.0.1.jdk/Contents/info.plist に "Privacy - Microphone Usage Description" を追加しても駄目だった。
Javaで音声入力を扱うための AudioInput クラスを作成しました。 AudioInputクラスの利用方法は TestAudioInput.java の // (*)がコメントについた行 を参照して下さい。
(注意)音声データをファイルに保存する場合は、wav, aiff, au などの書式付きサウンドファイルとして保存することが望ましいでしょう。 ここでは、演習のプログラムで利用しやすいように、敢えてリニアPCMのデータをそのまま(raw)保存しています。
TestAudioInputの実行例 |
|
Java で音声再生を扱うための AudioOutputクラスを作成しました。 AudioOutputクラスの利用方法は TestAudioOutput.java の // (*)がコメントについた行 を参照して下さい。
TestAudioOutputの実行例 |
|