サウンド入力のキャプチャ

Microphone クラスを使用すると、ユーザーのシステムのマイクロフォンまたは他のサウンド入力デバイスにアプリケーションを接続できます。アプリケーションでは、入力したオーディオをシステムのスピーカにブロードキャストしたり、Flash Media Server などのリモートサーバーにオーディオデータを送信したりできます。マイクロフォンから入力される生のオーディオデータにはアクセスできません。システムのスピーカへのオーディオの送信、またはリモートサーバーへの圧縮オーディオデータの送信のみが可能です。リモートサーバーに送信するデータには、Speex または Nellymoser コーデックを使用できます(Speex コーデックは AIR 1.5 で使用できます)。

マイクロフォンへのアクセス

Microphone クラスにはコンストラクターメソッドはありません。代わりに、次の例で示すように、静的な Microphone.getMicrophone() メソッドを使用して新しい Microphone インスタンスを取得します。

var mic = air.Microphone.getMicrophone(); 

パラメーターを指定せずに Microphone.getMicrophone() メソッドを呼び出すと、ユーザーのシステムで検出された最初のサウンド入力デバイスが返されます。

システムには複数のサウンド入力デバイスを接続できます。アプリケーションでは、 Microphone.names プロパティを使用して、使用可能なすべてのサウンド入力デバイスの名前の配列を取得できます。次に、 Microphone.getMicrophone() メソッドを、配列にあるデバイスの名前のインデックス値と一致する index パラメーターを指定して呼び出します。

システムには、マイクロフォンまたは他のサウンド入力デバイスが接続されていない場合があります。 Microphone.names プロパティまたは Microphone.getMicrophone() メソッドを使用すると、サウンド入力デバイスがインストールされているかどうかを確認できます。サウンド入力デバイスがインストールされていない場合は names 配列の長さがゼロになり、 getMicrophone() メソッドは null 値を返します。

マイクロフォンのオーディオからローカルスピーカへのルーティング

Microphone.setLoopback() メソッドを呼び出してパラメーター値に true を指定することで、マイクロフォンからのオーディオ入力をローカルシステムのスピーカにルーティングできます。

ローカルマイクロフォンからのサウンドをローカルスピーカにルーティングすると、オーディオフィードバックループが形成されるリスクが伴います。それによってキーンという大きい音が発生し、サウンドハードウェアが破損する可能性があります。 Microphone.setUseEchoSuppression() メソッドを呼び出してパラメーターに true を指定すると、オーディオフィードバックが発生するリスクは低下しますが、完全に除去することはできません。ユーザーがサウンドの再生にヘッドフォンなどスピーカ以外の装置を使用することが確実でない限り、 Microphone.setLoopback(true) を呼び出す前に必ず Microphone.setUseEchoSuppression(true) を呼び出すことをお勧めします。

次のコードでは、ローカルマイクロフォンからローカルシステムのスピーカにオーディオをルーティングする方法を示します。

var mic = air.Microphone.getMicrophone(); 
mic.setUseEchoSuppression(true); 
mic.setLoopBack(true);

マイクロフォンのオーディオの変更

アプリケーションでは、マイクロフォンから入力されたオーディオデータを 2 つの方法で変更できます。最初の方法では、入力サウンドのゲインを変更でき、実際には、指定した値で入力値が乗算されます。これにより、サウンドの音量を大きくしたり小さくしたりできます。 Microphone.gain プロパティは、0 ~ 100 の範囲の数値を受け付けます。50 という値は 1 を掛けるのと同じで、通常の音量を指定します。値 0 は 0 を掛けるのと同じで、結果として入力オーディオは消音されます。50 より大きい値を指定すると、通常の音量より大きくなります。

アプリケーションでは、入力オーディオのサンプリングレートを変更することもできます。サンプリングレートを高くするほどサウンドの品質は向上しますが、データストリームの密度も高くなり、送信と格納に必要なリソースの量が増加します。 Microphone.rate プロパティは、キロヘルツ(kHz)単位で測定されたオーディオサンプリングレートを表します。デフォルトのサンプリングレートは 8 kHz です。マイクロフォンがこれより高いレートをサポートしている場合は、 Microphone.rate プロパティに 8 kHz より高い値を設定できます。例えば、 Microphone.rate プロパティを 11 に設定するとサンプリングレートは 11 kHz になり、22 に設定するとサンプリングレートは 22 kHz になります。使用可能なサンプリングレートは、選択したコーデックによって異なります。Nellymoser コーデックを使用する場合は、サンプリングレートとして 5、8、11、16、22 および 44 kHz を指定できます。Speex コーデック(AIR 1.5 で利用可能)を使用する場合は、16 kHz のみ使用できます。

マイクロフォンの動作の検出

帯域幅と処理リソースを節約するため、ランタイムはマイクロフォンがサウンドを送信していないときにそれを検出しようとします。マイクロフォンの動作レベルが、ある一定の期間、無音レベルのしきい値を下回ったままであるとき、ランタイムはオーディオ入力の送信を停止して activity イベントを送出します。Speex コーデック(AIR 1.5 で利用可能)を使用する場合は、オーディオデータがアプリケーションから継続的に送信されるように、無音レベルを 0 に設定します。Speex の音声動作検出によって、帯域幅が自動的に軽減されます。

Microphone クラスの 3 つのプロパティを使用して、動作の検出を監視および制御します。

  • 読み取り専用の activityLevel プロパティは、マイクロフォンが検出しているサウンドの大きさを、0 ~ 100 のスケールで示します。

  • silenceLevel プロパティは、マイクロフォンをアクティブにして activity イベントを送出するために必要なサウンドの大きさを指定します。 silenceLevel プロパティも 0 ~ 100 のスケールを使用し、デフォルト値は 10 です。

  • silenceTimeout プロパティは、 activity イベントを送出するしきい値となる、動作レベルが無音レベルを下回る時間の長さをミリ秒単位の数値で示します。 silenceTimeout のデフォルト値は 2000 です。

Microphone.silenceLevel プロパティと Microphone.silenceTimeout プロパティはどちらも読み取り専用ですが、 Microphone.setSilenceLevel() メソッドを使用して値を変更できます。

場合によっては、新しい動作が検出されたときにマイクロフォンをアクティブにする処理過程で短い遅延が発生する可能性があります。常にマイクロフォンをアクティブにしておくことで、アクティブ化に伴うこのような遅延を除去できます。そのためには、 Microphone.setSilenceLevel() メソッドを、 silenceLevel パラメーターに 0 を指定して呼び出します。これにより、サウンドが検出されなくても、マイクロフォンはアクティブな状態でオーディオデータの収集を継続します。逆に、 silenceLevel パラメーターを 100 に設定すると、マイクロフォンがアクティブにならなくなります。

次の例では、マイクロフォンに関する情報を表示し、Microphone オブジェクトが送出する activity イベントと status イベントを報告します。

var deviceArray = air.Microphone.names; 
air.trace("Available sound input devices:"); 
for (i = 0; i < deviceArray.length; i++) 
{ 
    air.trace("   " + deviceArray[i]); 
} 
 
var mic = air.Microphone.getMicrophone(); 
mic.gain = 60; 
mic.rate = 11; 
mic.setUseEchoSuppression(true); 
mic.setLoopBack(true); 
mic.setSilenceLevel(5, 1000); 
     
mic.addEventListener(air.ActivityEvent.ACTIVITY, this.onMicActivity); 
     
var micDetails = "Sound input device name: " + mic.name + '\n'; 
micDetails += "Gain: " + mic.gain + '\n'; 
micDetails += "Rate: " + mic.rate + " kHz" + '\n'; 
micDetails += "Muted: " + mic.muted + '\n'; 
micDetails += "Silence level: " + mic.silenceLevel + '\n'; 
micDetails += "Silence timeout: " + mic.silenceTimeout + '\n'; 
micDetails += "Echo suppression: " + mic.useEchoSuppression + '\n'; 
air.trace(micDetails); 
 
function onMicActivity(event) 
{ 
    air.trace("activating=" + event.activating + ", activityLevel=" +  
        mic.activityLevel); 
}

前の例を実行し、システムのマイクロフォンに向かって話すか音を立ててみて、コンソールに表示されるトレースステートメントを確認してください。

メディアサーバーとのオーディオの送受信

Flash Media Server などのストリーミングメディアサーバーを使用すると、他のオーディオ機能を利用できます。

特に、Microphone オブジェクトを runtime.flash.net.NetStream オブジェクトに接続して、ユーザーのマイクロフォンからサーバーにデータを直接送信できる機能が挙げられます。また、サーバーから AIR アプリケーションにオーディオデータをストリーミングすることもできます。

AIR 1.5 では、Speex コーデックがサポートされるようになりました。メディアサーバーに送信される圧縮オーディオに使用するコーデックを設定するには、Microphone オブジェクトの codec プロパティを使用します。このプロパティには、SoundCodec クラスで列挙されている 2 つの値を設定できます。codec プロパティを SoundCodec.SPEEX に設定すると、オーディオの圧縮時に Speex コーデックスが選択されます。このプロパティを SoundCodec.NELLYMOSER (デフォルト)に設定すると、オーディオの圧縮に Nellymoser コーデックが選択されます。

詳しくは、 http://www.adobe.com/jp/support/documentation からオンラインで提供されている Flash Media Server のドキュメントを参照してください。