マイクについて
| ・ | マイクを使用する |
| ・ | マイクのサウンド出力を設定する |
| ・ | マイクの増幅率を設定する |
| ・ | マイクのキャプチャーレートを設定する |
| ・ | マイクのエコー抑制を設定する |
| ・ | マイクのアクティビティを検出する |
| ・ | マイクからサウンドデータ(PCM)を取得する(Flash 10.1 以降) |
マイクを使用する
サンプルをダウンロード
■マイクを使用するには?
Flash Player の設定画面からマイクの使用を許可します。
Flash Player の設定画面からマイクで使用する録音デバイスを選択することができます。
■マイクをサポートしているか調べる(Flash 10 以降)
Flash Player を実行している環境でマイクをサポートしているかを調べるには、Microphone.isSupported プロパティを使用します。
モバイル用のデバイスでは対応していないことがあります。
マイクを利用できるか調べる
var text_field = new TextField();
text_field.x = 10;
text_field.y = 10;
text_field.width = 500;
text_field.height = 20;
text_field .border = true;
stage.addChild(text_field);
text_field.text = "マイクのサポート:" + Microphone.isSupported;
■ローカル環境でマイクを使用する
ローカル環境でマイクを使用してみます。
1.Microphone オブジェクトを取得する
Microphone.getMicrophone()メソッドを使用して、Microphone オブジェクトを取得します。
マイクデバイスが複数存在する場合、引数に番号を指定すると、使用するマイクデバイスを選択する事ができます。
引数を省略するとFlash Player の設定画面で設定したデバイスが適用されます。
利用可能なマイクデバイスが存在しない場合、null が得られます。
Microphone オブジェクトを取得する
// Microphone オブジェクトを取得
var mic_obj:Microphone = Microphone.getMicrophone();
0 番目の Microphone オブジェクトを取得する
// 0 番目の Microphone オブジェクトを取得
var mic_obj:Microphone = Microphone.getMicrophone(0);
現在使用しているマイクのデバイス名を取得するには、name プロパティを使用します。
現在使用しているマイクデバイス名を取得する
// マイクデバイス名を取得
var mic_obj:Microphone = Microphone.getMicrophone();
trace("NAME:" + mic_obj.name);
複数あるマイクのデバイス名をすべて取得するには、Microphone.names プロパティを使用します。
配列に格納されたデバイス名称が得られます。
「配列の順番」と 「Microphone.get() メソッドの引数に渡す番号」は同じです。
マイクデバイス名をすべて取得する
// マイクデバイス名を取得
var mic_name:Array = Microphone .names;
var i:Number;
for(i=0;i < mic_name.length;i++){
trace("id:" + i + " NAME:" + mic_name[i]);
}
2.スピーカから出力する
マイクから録音したオーディオデータをスピーカから出力するようにするには、setLoopBack() メソッドを使用します。
引数に true を指定するとスピーカから出力されます。false を指定するとスピーカから出力されません。
スピーカから出力する
// Microphone オブジェクトを取得
var mic_obj:Microphone = Microphone.getMicrophone();
// マイク入力をスピーカから出力する
mic_obj.setLoopBack(true);
■Flash Player のマイクの設定
ActionScript3.0 からマイクへのアクセスを試みると、以下の確認画面が表示されます。
ユーザーにより、拒否ボタンを押された場合マイクを利用することはできません。
ユーザーによるアクセス許可の結果を取得するには、StatusEvent.STATUS イベントを使用します。
引数から得られる StatusEvent オブジェクトの、code プロパティから結果を取得できます。
マイクのアクセス許可設定の結果を取得する
// Microphone オブジェクトを取得
var mic_obj:Microphone = Microphone.getMicrophone();
// マイク入力をスピーカから出力する
mic_obj.setLoopBack(true);
// アクセス許可を調べる
mic_obj.addEventListener(StatusEvent.STATUS,function(e:StatusEvent):void {
switch(e.code){
case "Microphone.Unmuted":
trace("マイク利用可能");
break;
case "Microphone.Muted":
trace("マイク利用不可能");
break;
};
});
また、muted プロパティを使用して調べることもできます。
false であれば利用可能です。true であれば利用できません。
マイクのアクセス許可を取得する
// Microphone オブジェクトを取得
var mic_obj:Microphone = Microphone.getMicrophone();
// マイク入力をスピーカから出力する
mic_obj.setLoopBack(true);
// アクセス許可を取得する
trace(mic_obj.muted);
マイクのサウンド出力を設定する
■マイクのサウンド出力を設定する
SoundTransform クラスの設定例です。
シグナルの増幅率を指定
// Microphone オブジェクトを取得
var mic_obj:Microphone = Microphone.getMicrophone();
// マイク入力をスピーカから出力する
mic_obj.setLoopBack(true);
// サウンドトランスフォームオブジェクトの取得
var trans : SoundTransform = mic_obj.soundTransform;
trans.volume = 0.5; // ボリューム
// サウンドトランスフォームオブジェクトをセットして反映
mic_obj.soundTransform = trans;
マイクの増幅率を設定する
■マイクのゲイン(増幅率)を設定する
マイクの入力ボリュームを増幅させるには、gain メソッドを使用します。
有効な値は 0 ~ 100 で、デフォルト値は 50 です。
0 で無音になります。
シグナルの増幅率を指定
// Microphone オブジェクトを取得
var mic_obj:Microphone = Microphone.getMicrophone();
// マイク入力をスピーカから出力する
mic_obj.setLoopBack(true);
// ゲインを設定
mic_obj.gain = 50;
// ゲインを取得
trace(mic_obj.gain);
Flash Player 設定のマイクの録音ボリュームに相当します。
メータを操作すると連動して ActionScript 内の増幅率も変化します。
ActionScript からボリュームを変更してもメータは連動して変化しないようです。
マイクのキャプチャーレートを設定する
■キャプチャするレート (kHz) を設定する
マイクのキャプチャレートを設定するには、rate プロパティを使用します。
引数に、5、8、11、22、44 の好きな数値を指定します。単位は kHz です。
デフォルトは 11 です。録音デバイスが対応していない場合、最も近い設定に丸められます。
| 表示される値 | 実際のサンプリングレート |
| 44 | 44100 Hz |
| 22 | 22050 Hz |
| 11 | 11025 Hz |
| 8 | 8000 Hz |
| 5 | 5512 Hz |
キャプチャレートを変更する
// Microphone オブジェクトを取得
var mic_obj:Microphone = Microphone.getMicrophone();
// マイク入力をスピーカから出力する
mic_obj.setLoopBack(true);
// キャプチャレートを設定
mic_obj.rate = 44;
// キャプチャレートを取得
trace(mic_obj.rate);
マイクのエコー抑制を設定する
■エコー抑制を設定する
スピーカ環境の近くでマイクを使用すると、マイクがスピーカーの音を拾ってしまい、キーンという音が発生してしまいます。
このハウリング現象を抑制する為の機能です。
エコーの抑制を設定するには、setUseEchoSuppression() メソッドを使用します。
true でエコー抑制が有効になります。false でエコー抑制が無効になります。デフォルトは false です。
エコー抑制を設定する
// Microphone オブジェクトを取得
var mic_obj:Microphone = Microphone.getMicrophone();
// マイク入力をスピーカから出力する
mic_obj.setLoopBack(true);
// エコー抑制を設定する
mic_obj.setUseEchoSuppression(false);
Flash Player 設定のマイクの「エコーを減らす」に相当します。ActionScript からエコーの抑制を変更してもチェックボックスは連動して変化しないようです。
■エコー抑制設定を取得する
エコーの抑制設定を取得するには、useEchoSuppression プロパティを使用します。
true でエコー抑制が有効、false でエコー抑制が無効である事がわかります。
エコー抑制設定を取得する
// Microphone オブジェクトを取得
var mic_obj:Microphone = Microphone.getMicrophone();
// マイク入力をスピーカから出力する
mic_obj.setLoopBack(true);
// エコー抑制を設定する
mic_obj.setUseEchoSuppression(false);
// エコー抑制設定を取得する
trace(mic_obj.useEchoSuppression);
Flash Player 設定のマイクの「エコーを減らす」に相当します。チェックボックスを操作すると、連動して ActionScript 内のエコーの抑制も変化します。
マイクのアクティビティを検出する
■アクティビティとは?
アクティビティとは、活動を意味します。人がしゃべったりしたときに入力された音量の大きさから判断して有音、無音状態であるかを検出します。
これは、ボイスチャット利用時に効果的です。無音状態ではオーディオデータを送信する必要が無いので帯域を節約する事ができます。
■無音状態とみなすボリュームのしきい値を設定する
無音状態とみなすボリュームのしきい値を設定するには、setSilenceLevel() メソッドを使用します。
第01引数に、0 ~ 100 までのボリューム値を設定します。デフォルトは 10 です。100 に設定すると常に無音状態となります。
第02引数には、無音状態とみなすまでの時間をミリ秒で設定します。デフォルトは 2000 です。省略可能です。
無音状態とみなすボリュームのしきい値を設定する
// Microphone オブジェクトを取得
var mic_obj:Microphone = Microphone.getMicrophone();
// マイク入力をスピーカから出力する
mic_obj.setLoopBack(true);
// 無音状態とみなすボリュームのしきい値を設定
mic_obj.setSilenceLevel(0,1000);
■アクティビティを検出する
サウンドの有音と無音状態を検出するには、ActivityEvent.ACTIVITY イベントを使用します。
登録した関数の引数の、ActivityEvent オブジェクトの activating プロパティからアクティビティの状態が得られます。
true であれば有音状態
false であれば無音状態である事がわかります。
アクティビティを検出する
// Microphone オブジェクトを取得
var mic_obj:Microphone = Microphone.getMicrophone();
// マイク入力をスピーカから出力する
mic_obj.setLoopBack(true);
// 無音状態とみなすボリュームのしきい値を設定
mic_obj.setSilenceLevel(50,1000);
// アクティビティを検出する
mic_obj.addEventListener(ActivityEvent.ACTIVITY,function(e:ActivityEvent):void{
if(e.activating){
trace("有音状態");
}else{
trace("無音状態");
}
});
■マイクが検出した音量を取得する
マイクが検出した音量(アクティビティレベル)を取得するには、activityLevel プロパティを使用します。
0 から 100 までの範囲となります。
マイクデバイスの準備ができていない場合、-1 が得られます。
アクティビティレベルを取得する
// Microphone オブジェクトを取得
var mic_obj:Microphone = Microphone.getMicrophone();
// マイク入力をスピーカから出力する
mic_obj.setLoopBack(true);
// 無音状態とみなすボリュームのしきい値を設定
mic_obj.setSilenceLevel(20,1000);
// 毎フレーム実行されるイベント
addEventListener(Event.ENTER_FRAME,function(e:Event):void{
trace("アクティビティレベル:" + mic_obj.activityLevel);
});
■アクティビティ検出用のボリュームのしきい値を取得する
アクティビティ検出用のボリュームのしきい値を取得するには、silenceLevel プロパティを使用します。
アクティビティ検出用のボリュームのしきい値を取得する
// Microphone オブジェクトを取得
var mic_obj:Microphone = Microphone.getMicrophone();
// マイク入力をスピーカから出力する
mic_obj.setLoopBack(true);
// 無音状態とみなすボリュームのしきい値を設定
mic_obj.setSilenceLevel(50,1000);
// アクティビティ検出用のボリュームのしきい値を取得する
trace(mic_obj.silenceLevel);
また、無音状態とみなすまでの時間(単位:ミリ秒)を取得するには、silenceTimeout プロパティを使用します。
無音状態を検出するまでの時間を取得
// Microphone オブジェクトを取得
var mic_obj:Microphone = Microphone.getMicrophone();
// マイク入力をスピーカから出力する
mic_obj.setLoopBack(true);
// 無音状態とみなすボリュームのしきい値を設定
mic_obj.setSilenceLevel(50,1000);
// 無音状態を検出するまでの時間を取得
trace(mic_obj.silenceTimeout);
マイクからサウンドデータ(PCM)を取得する(Flash 10.1 以降)
■マイクからサウンドデータを取得する
マイクからサウンドデータを取得するには、SampleDataEvent.SAMPLE_DATA イベントを使用します。
このイベントに関数を登録した時点から録音が開始されます。
┌┐
│↓
│バッファにサウンドデータが貯められる
│↓
│一定量まで貯まれば関数が呼び出される
│↓
│貯めた分は不要になるのでバッファがクリアされる
└┘
この流れが繰り返されます。
比較的頻繁に関数が呼び出され、少しずつデータを取り出していく事になります。
サウンドデータを取得する
// Microphone オブジェクトを取得
var mic_obj:Microphone = Microphone.getMicrophone();
// マイク入力をスピーカから出力する
mic_obj.setLoopBack(true);
// サウンドバッファが一定量貯まれば実行されるイベント
mic_obj.addEventListener(SampleDataEvent.SAMPLE_DATA, function(e:SampleDataEvent):void{
trace("現在の録音の位置:" + e.position);
// サウンドバッファ
var data:ByteArray = e.data;
trace("サウンドバッファのサイズ:" + data.length);
});
■SampleDataEvent クラスのプロパティ
SampleDataEvent クラスには以下のプロパティがあります。
| プロパティ | 解説 |
| position | 録音を開始してから現在のサンプリング位置 |
| data | position からのサウンドデータ(PCM) |
■マイクのサウンドデータを取り出す
SampleDataEvent.SAMPLE_DATA イベントへ関数を登録した時点から、録音が開始されます。
現在録音しているサンプリングの位置は、position プロパティから得られます。
この position プロパティの増加していく量は、キャプチャーレートと関係があります。
キャプチャーレートを取得するには、rate プロパティを使用します。
キャプチャレートを取得する
// Microphone オブジェクトを取得
var mic_obj:Microphone = Microphone.getMicrophone();
// マイク入力をスピーカから出力する
mic_obj.setLoopBack(true);
// キャプチャレートを設定
mic_obj.rate = 44;
// キャプチャレートを取得
trace(mic_obj.rate);
| 表示される値 | 実際のサンプリングレート |
| 44 | 44100 Hz |
| 22 | 22050 Hz |
| 11 | 11025 Hz |
| 8 | 8000 Hz |
| 5 | 5512 Hz |
例えば、キャプチャーレートが 44 である場合、サンプリング数は、44100 Hz となります。
つまり 1 秒につき、44100 ずつ位置が増えることになります。
また、キャプチャーレートが 11 である場合、サンプリング数は、11025 Hz となります。
つまり 1 秒につき、11025 ずつ位置が増えることになります。
アクティビティの検出により、無音状態と判定されている間は、イベントに登録した関数は実行されなくなります。
しかしこの間は、 position プロパティのカウントは止まることなく進み続けます。
よって、データが得られない空白の期間が出来ることになりますが、この区間は無音状態なので、すべて 0 で埋めてしまいます。
サウンドバッファには、モノラル(1channel)としてデータが蓄積されます。
データは、32bit浮動小数点数(-1.0 ~ 1.0)の連続したデータとなります。readFloat() メソッドを何度も呼び出して取り出すといいでしょう。
1 つのデータ(電圧を-1.0 ~ 1.0 に変換した値)が 4Byte で表され、これが 1 チャンネルだけなので 1 サンプリングにつき 4Byte 使用する事になります。
例えば、キャプチャーレートが 44 である場合、
1 秒につき、1 ch × 4 Byte × 44100 Hz = 176400 Byte ずつデータが増えていく事になります。
例えば、キャプチャーレートが 11 である場合、
1 秒につき、1 ch × 4 Byte × 11025 Hz = 44100 Byte ずつデータが増えていく事になります。
以上の事を踏まえたデータの取得例です。
マイクから得られるサウンドデータを ByteArray に格納する
// マイク用サウンドバッファ
var mic_buffer:ByteArray = new ByteArray();
// マイク用サンプリング位置
var mic_position:int = 0;
// Microphone オブジェクトを取得
var mic_obj:Microphone = Microphone.getMicrophone();
// マイク入力をスピーカから出力する
mic_obj.setLoopBack(true);
// キャプチャレートを設定する
mic_obj.rate = 44;
// サウンドバッファが一定量貯まれば実行されるイベント
mic_obj.addEventListener(SampleDataEvent.SAMPLE_DATA, function(e:SampleDataEvent):void{
var i:int = 0;
var p:int = e.position;
var d:ByteArray = e.data;
// 空白の期間を 0 で埋める
for(i=mic_position;i < p;i++){
mic_buffer.writeFloat(0.0);
}
// データを取り出す
mic_buffer.writeBytes(d,0,d.length);
// 次のサンプリング位置
mic_position = p + d.length / 4;
});
■マイクのサウンドデータを再生する
マイクから得られたサウンドデータを、Flash 上で再生するには、Sound クラスの SampleDataEvent.SAMPLE_DATA イベントを使用します。
サウンドデータ(PCM)を使って再生する(Flash 10以降)
Sound クラスの再生は、サンプリング数が 44100 Hz のステレオ(2チャンネル)となります。
このデータフォーマットにあわせてサウンドデータを変換する必要があります。
例えば、キャプチャーレートが 44 であるサウンドデータを再生する場合、モノラルからステレオに変換することになります。
以下の図のように 2 個ずつ同じデータを埋めていきます。
キャプチャーレートが 22 であるサウンドデータを再生する場合、モノラルからステレオ変換に加え、サンプリング数が 2 倍増加することになります。
以下の図のように 4 個ずつ同じデータを埋めていきます。
キャプチャーレートが 11 であるサウンドデータを再生する場合、モノラルからステレオ変換に加え、サンプリング数が 4 倍増加することになります。
以下の図のように 8 個ずつ同じデータを埋めていきます。
マイクのサウンドデータの再生例です。
マイクから得られたサウンドデータを画面クリックで再生する
// 1 度に転送するサンプリング数
var sampling = 2048;
// マイク用サウンドバッファ
var mic_buffer:ByteArray = new ByteArray();
// マイク用サンプリング位置
var mic_position:int = 0;
// Microphone オブジェクトを取得
var mic_obj:Microphone = Microphone.getMicrophone();
// マイク入力をスピーカから出力する
mic_obj.setLoopBack(true);
// キャプチャレートを設定する
mic_obj.rate = 44;
// キャプチャーレートを取得する
var capture_rate:Number = mic_obj.rate;
switch(capture_rate){
case 5: capture_rate = 5512; break;
case 11: capture_rate = 11025; break;
case 22: capture_rate = 22050; break;
case 44: capture_rate = 44100; break;
default: capture_rate = capture_rate * 1000; break;
};
// サウンドバッファが一定量貯まれば実行されるイベント
mic_obj.addEventListener(SampleDataEvent.SAMPLE_DATA, function(e:SampleDataEvent):void{
var i:int = 0;
var p:int = e.position;
var d:ByteArray = e.data;
// 空白の期間を 0 で埋める
for(i=mic_position;i < p;i++){
mic_buffer.writeFloat(0.0);
}
// データを取り出す
mic_buffer.writeBytes(d,0,d.length);
// 次のサンプリング位置
mic_position = p + d.length / 4;
});
// マウスの左ボタンを押下すると実行されるイベント
stage.addEventListener(MouseEvent.MOUSE_DOWN,function(e:MouseEvent):void{
// サウンドオブジェクト
var sound_obj = new Sound();
// サンプルデータイベント登録
sound_obj.addEventListener(SampleDataEvent.SAMPLE_DATA, SampleDataFunc);
// 再生開始
sound_obj.play();
// サウンドデータ要求時に呼び出されるイベント
function SampleDataFunc(e:SampleDataEvent):void{
// サウンドバッファ
var buffer = e.data;
var p:Number = mic_buffer.position;
var i:int = 0;
for(i=0;i < sampling;i++){
// 取得位置
mic_buffer.position = Math.floor((i + e.position) * (capture_rate / 44100)) * 4;
// バッファオーバーチェック
if(mic_buffer.position >= mic_buffer.length) return;
// 録音データを取り出して再生データに書き込み
var d:Number = mic_buffer.readFloat();
buffer.writeFloat(d);
buffer.writeFloat(d);
}
mic_buffer.position = p;
};
});

