Flashゲームプログラミング講座 for ActionScript3.0

 

マイクを使用する

 

サンプルをダウンロード
 


■Flash Player の設定について

 
■マイクへのアクセス許可
 
マイクを使用するには、ユーザーがマイクへのアクセスを許可する必要があります
 
Flash Player の設定画面から、マイクへのアクセスを設定することができます。
 
 
■マイクの種類を選択
 
Flash Player の設定画面から、マイクの種類を選択することができます。
 
 

■マイクから入力した音をスピーカーから出力する

 
1.Microphone オブジェクトを取得する

Microphone オブジェクトを取得するには、Microphone.getMicrophone() メソッドを使用します。
 
第01引数を省略した場合、Flash Player の設定画面で選択したマイクデバイスを取得できます。
 
マイクが利用できない場合、null が得られます。
 
Microphone.getMicrophone ( 番号 ) :Microphone
第01引数(略可)int取得したいマイクデバイスを 0 からの番号で指定。(複数のマイクデバイスが存在する場合)
戻り値 MicrophoneMicrophone オブジェクトが得られる。マイクが利用できない場合 null
 
デフォルトのマイクオブジェクトを取得

import flash.media.Microphone;

// デフォルトのマイクオブジェクトを取得
var mic_obj:Microphone = Microphone.getMicrophone();

// 出力テスト
trace(mic_obj);
 
複数のマイクオブジェクトを取得

import flash.media.Microphone;

// 0 番目のマイクオブジェクトを取得
var mic_obj0:Microphone = Microphone.getMicrophone(0);

// 1 番目のマイクオブジェクトを取得
var mic_obj1:Microphone = Microphone.getMicrophone(1);

// 出力テスト
trace(mic_obj0);
trace(mic_obj1);
 
2.マイクから入力した音をスピーカーから出力する
 
マイクから入力した音を、同じ環境にあるスピーカーから出力するには、setLoopBack() メソッドを使用します。
 
Microphone.setLoopBack ( ループバックを有効にするか? ) :void
第01引数(略可)Booleanマイクから入力した音を出力する場合 true を指定。出力を止めたい場合 false を指定。(デフォルトは true)
戻り値 voidなし
 
マイクから入力した音をスピーカーから出力する

import flash.media.Microphone;

// デフォルトのマイクオブジェクトを取得
var mic_obj:Microphone = Microphone.getMicrophone();

// マイクが利用可能
if(mic_obj){

	// マイクから入力した音をスピーカーから出力
	mic_obj.setLoopBack(true);

	// スピーカー出力を止める
	//mic_obj.setLoopBack(false);

}
 

■ユーザーがマイクへのアクセスを許可しているか調べる


■マイクへのアクセス許可設定について
 
プログラムからマイクへのアクセスを試みると、以下の様な確認ダイアログが表示されます。
 
ユーザーが、マイクへのアクセスを拒否した場合、マイク機能を利用することはできません。
 
 
■マイクへのアクセス許可設定を調べる
 
ユーザーが、マイクへのアクセスを許可しているか調べるには、muted プロパティを使用します。
 
true であれば、利用できません。
 
マイク機能のミュート設定を調べる

import flash.media.Microphone;

// デフォルトのマイクオブジェクトを取得
var mic_obj:Microphone = Microphone.getMicrophone();

// マイクが利用可能
if(mic_obj){

	trace("マイク機能のミュート設定:" + mic_obj.muted);

}
 
■「マイクへのアクセス許可設定」の変更を監視する
 
「マイクへのアクセス許可設定」の変更を監視するには、StatusEvent.STATUS イベントを使用します。
 
このイベントは、Adobe AIR では動作しません。
 
引数から得られるオブジェクトの、code プロパティから結果を取得できます。
 
以下の種類があります。
 
文字列 名称
"Microphone.Muted" マイクへのアクセスが拒否に変化した
"Microphone.Unmuted" マイクへのアクセスが許可に変化した
 
マイクのアクセス許可設定の結果を取得する

import flash.media.Microphone;
import flash.events.StatusEvent;

// デフォルトのマイクオブジェクトを取得
var mic_obj:Microphone = Microphone.getMicrophone();

// マイクが利用可能
if(mic_obj){
	// マイクから入力した音をスピーカーから出力
	mic_obj.setLoopBack();

	// マイクへのアクセス許可が変化した時に実行されるイベント
	mic_obj.addEventListener(StatusEvent.STATUS,function (e:StatusEvent):void{
		switch(e.code){
		case "Microphone.Unmuted":
			trace("マイク利用可能");
			break;
		case "Microphone.Muted":
			trace("マイク利用不可能");
			break;
		}
	});
}
 

■マイクデバイスの総数を取得する

 
マイクデバイスの総数を調べるには、Microphone.names.length プロパティを使用します。
 
マイクデバイスの総数を取得

import flash.media.Microphone;

// マイクデバイスの総数を取得
var num:int = Microphone.names.length;

// 出力テスト
trace(num);
 

■マイクデバイスの名称を取得する

 
■マイクデバイスの名称をまとめて取得する
 
マイクデバイスの名称を、配列としてまとめて取得するには、Microphone.names プロパティを使用します。
 
マイクデバイスの名称を順番に列挙する

import flash.media.Microphone;

// マイクデバイスの名称をまとめて取得する
var camera_names:Array = Microphone.names;

var i:int;
var num:int = camera_names.length;
for(i=0;i < num;i++){
	// デバイス名を出力
	trace("id:" + i + " name:" + camera_names[i]);
}
 
■マイクオブジェクトからデバイスの名称を取得する
 
マイクオブジェクトから、デバイスの名称を取得するには、name プロパティを使用します。
 
マイクデバイスの名称を順番に列挙する

import flash.media.Microphone;

var i:int;
var num:int = Microphone.names.length;
for(i=0;i < num;i++){

	// マイクオブジェクトを取得
	var mic_obj:Microphone = Microphone.getMicrophone(i);

	// デバイス名を出力
	trace("id:" + i + " name:" + mic_obj.name);
}
 
 


■マイク機能が利用可能か調べる


実行環境でマイク機能をサポートしているかを調べるには、Microphone.isSupported プロパティを使用します。
 
この確認用のプロパティは、Flash Player 10.1 以降、Adobe AIR 2.0 以降で利用可能です。
 
モバイルなどの環境で動作させる場合、マイク機能をサポートしていない事があります。
 
実行環境ごとのサポート状況については、公式リファレンスが参考になります。
 
http://help.adobe.com/ja_JP/FlashPlatform/reference/actionscript/3/flash/media/Microphone.html
 
マイク機能が利用可能か調べる

import flash.media.Microphone;
import flash.text.TextField;

// テキストフィールドを作成
var text_field:TextField = new TextField();
text_field.x = 10;
text_field.y = 10;
text_field.width = stage.stageWidth - 20;
text_field.height = 20;
text_field.border = true;
stage.addChild(text_field);

text_field.text = "マイク機能が利用可能:" + Microphone.isSupported;
 

■「AIR for Android」でマイク機能を使用する


「AIR for Android」でマイク機能を使用するには、以下のパーミッション設定を追加します。
 
権限名説明
RECORD_AUDIOマイクデバイスへのアクセス
 
■Adobe Flash による設定方法
 
「AIR for Android 設定」の「権限」タブにある、「RECORD_AUDIO」のチェックを有効にします。
 
 
■アプリケーション記述ファイルを直接編集する方法
 
アプリケーション記述ファイルに、以下のパーミッション設定を追加します。
 
アプリケーション記述ファイルに autoOrients タグを追加する

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<application xmlns="http://ns.adobe.com/air/application/2.0">

  ~略~

  <android>
    <manifestAdditions>
      <![CDATA[<manifest>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
      </manifest>]]>
    </manifestAdditions>
  </android>

</application>
 


 

拡張マイク機能を使用する(Flash 10.3 以降)

 
 


■強化された機能を利用するには?


Flash Player 10.3 以降、AIR 2.7 以降から、音声エコー除去などの強化機能が追加されました。
 
強化された機能を利用するには、「強化版 Microphone オブジェクト」を取得する必要があります。
 

■「強化版 Microphone オブジェクト」を取得する

 
「強化版 Microphone オブジェクト」を取得するには、Microphone.getEnhancedMicrophone() メソッドを使用します。
 
第01引数を省略した場合、Flash Player の設定画面で選択したマイクデバイスを取得できます。
 
マイクが利用できない場合、null が得られます。
 
Microphone.getEnhancedMicrophone ( 番号 ) :Microphone
第01引数(略可)int取得したいマイクデバイスを 0 からの番号で指定。(複数のマイクデバイスが存在する場合)
戻り値 Microphone強化版 Microphone オブジェクトが得られる。マイクが利用できない場合 null
 
デフォルトの「強化版マイクオブジェクト」を取得

import flash.media.Microphone;

// デフォルトの「強化版マイクオブジェクト」を取得
var mic_obj:Microphone = Microphone.getEnhancedMicrophone();

// 出力テスト
trace(mic_obj);
 
複数の「強化版マイクオブジェクト」を取得

import flash.media.Microphone;

// 0 番目の「強化版マイクオブジェクト」を取得
var mic_obj0:Microphone = Microphone.getEnhancedMicrophone(0);

// 1 番目の「強化版マイクオブジェクト」を取得
var mic_obj1:Microphone = Microphone.getEnhancedMicrophone(1);

// 出力テスト
trace(mic_obj0);
trace(mic_obj1);
 

■ MicrophoneEnhancedOptions オブジェクトを取得する

 
強化された機能は、MicrophoneEnhancedOptions クラスにまとめられています。
 
MicrophoneEnhancedOptions オブジェクトにアクセスするには、enhancedOptions プロパティを使用します。
 
MicrophoneEnhancedOptions オブジェクトを取得

import flash.media.Microphone;
import flash.media.MicrophoneEnhancedOptions;

// デフォルトの「強化版マイクオブジェクト」を取得
var mic_obj:Microphone = Microphone.getEnhancedMicrophone();

// マイクが利用可能
if(mic_obj){

	// MicrophoneEnhancedOptions オブジェクトを取得
	var mic_enhanced_options:MicrophoneEnhancedOptions = mic_obj.enhancedOptions;

	// 出力テスト
	trace(mic_enhanced_options);
}
 
■ MicrophoneEnhancedOptions オブジェクトの変更を反映する
 
MicrophoneEnhancedOptions オブジェクトのプロパティを変更しただけでは反映されません。
 
変更を反映するには、enhancedOptions プロパティに、MicrophoneEnhancedOptions オブジェクトをセットする必要があります。
 
MicrophoneEnhancedOptions オブジェクトの変更を反映

import flash.media.Microphone;
import flash.media.MicrophoneEnhancedOptions;

// デフォルトの「強化版マイクオブジェクト」を取得
var mic_obj:Microphone = Microphone.getEnhancedMicrophone();

// マイクが利用可能
if(mic_obj){

	// MicrophoneEnhancedOptions オブジェクトを取得
	var mic_enhanced_options:MicrophoneEnhancedOptions = mic_obj.enhancedOptions;

	// MicrophoneEnhancedOptions オブジェクトの変更を反映する
	mic_obj.enhancedOptions = mic_enhanced_options;

}
 
 


■拡張マイクモードを設定する


拡張マイクモードを設定するには、mode プロパティを使用します。
 
以下の、MicrophoneEnhancedMode 定数をセットします。
 
定数 文字列 効果
MicrophoneEnhancedMode.OFF "off" すべての拡張マイク機能を無効化します。
MicrophoneEnhancedMode.SPEAKER_MUTE "speakerMute" スピーカーをミュートしている場合に指定します。
音声エコー除去機能は、無効となります。
MicrophoneEnhancedMode.HEADSET "headset" ヘッドセットを使用時に指定します。
音声エコー除去機能は、低エコーモードとなります。
軽負荷で動作します。
MicrophoneEnhancedMode.HALF_DUPLEX "halfDuplex" ボイスチャットなどで、片方ずつ話す場合に使用します。
音声エコー除去機能は、半二重モードとなります。
中負荷で動作します。
低品質のマイクとスピーカーでも動作します。
MicrophoneEnhancedMode.FULL_DUPLEX "fullDuplex" ボイスチャットなどで、両方が同時に話す場合に使用します。
音声エコー除去機能は、全二重モードとなります。
高負荷で動作します。
高品質なマイクとスピーカーが必要です。
 
拡張マイクモードを設定する

import flash.media.Microphone;
import flash.media.MicrophoneEnhancedOptions;
import flash.media.MicrophoneEnhancedMode;

// デフォルトの「強化版マイクオブジェクト」を取得
var mic_obj:Microphone = Microphone.getEnhancedMicrophone();

// マイクが利用可能
if(mic_obj){
	// マイクから入力した音をスピーカーから出力
	mic_obj.setLoopBack();

	// MicrophoneEnhancedOptions オブジェクトを取得
	var mic_enhanced_options:MicrophoneEnhancedOptions = mic_obj.enhancedOptions;

	// 拡張マイクモードを設定する
	mic_enhanced_options.mode = MicrophoneEnhancedMode.HALF_DUPLEX;

	// MicrophoneEnhancedOptions オブジェクトの変更を反映する
	mic_obj.enhancedOptions = mic_enhanced_options;

}
 

■音声エコー除去機能のエコーパスを設定する


音声エコー除去機能のエコーパスを設定するには、echoPath プロパティを使用します。
 
単位はミリ秒です。128 か 256 を指定します。デフォルトは、128 です。
 
数値が大きいほど、遅延が大きくなり、高品質で、高負荷となります。
 
音声エコー除去機能のエコーパスを設定する

import flash.media.Microphone;
import flash.media.MicrophoneEnhancedOptions;

// デフォルトの「強化版マイクオブジェクト」を取得
var mic_obj:Microphone = Microphone.getEnhancedMicrophone();

// マイクが利用可能
if(mic_obj){
	// マイクから入力した音をスピーカーから出力
	mic_obj.setLoopBack();

	// MicrophoneEnhancedOptions オブジェクトを取得
	var mic_enhanced_options:MicrophoneEnhancedOptions = mic_obj.enhancedOptions;

	// 音声エコー除去機能のエコーパスを設定する
	mic_enhanced_options.echoPath = 256;

	// MicrophoneEnhancedOptions オブジェクトの変更を反映する
	mic_obj.enhancedOptions = mic_enhanced_options;

}
 

■ノンリニア処理を設定する


ノンリニア処理を設定するには、nonLinearProcessing プロパティを使用します。
 
ノンリニア処理を有効にする場合、true をセットします。(デフォルトは、true)
 
ノンリニア処理は、音声ソースに効果的です。
 
音楽ソースの場合は、無効にします。
 
ノンリニア処理を設定する

import flash.media.Microphone;
import flash.media.MicrophoneEnhancedOptions;

// デフォルトの「強化版マイクオブジェクト」を取得
var mic_obj:Microphone = Microphone.getEnhancedMicrophone();

// マイクが利用可能
if(mic_obj){
	// マイクから入力した音をスピーカーから出力
	mic_obj.setLoopBack();

	// MicrophoneEnhancedOptions オブジェクトを取得
	var mic_enhanced_options:MicrophoneEnhancedOptions = mic_obj.enhancedOptions;

	// ノンリニア処理を設定する
	mic_enhanced_options.nonLinearProcessing = true;

	// MicrophoneEnhancedOptions オブジェクトの変更を反映する
	mic_obj.enhancedOptions = mic_enhanced_options;

}
 

■オートゲイン処理を設定する


オートゲイン処理を設定するには、autoGain プロパティを使用します。
 
オートゲイン処理を有効にする場合、true をセットします。(デフォルトは、false)
 
オートゲイン処理を設定する

import flash.media.Microphone;
import flash.media.MicrophoneEnhancedOptions;

// デフォルトの「強化版マイクオブジェクト」を取得
var mic_obj:Microphone = Microphone.getEnhancedMicrophone();

// マイクが利用可能
if(mic_obj){
	// マイクから入力した音をスピーカーから出力
	mic_obj.setLoopBack();

	// MicrophoneEnhancedOptions オブジェクトを取得
	var mic_enhanced_options:MicrophoneEnhancedOptions = mic_obj.enhancedOptions;

	// オートゲイン処理を設定する
	mic_enhanced_options.autoGain = true;

	// MicrophoneEnhancedOptions オブジェクトの変更を反映する
	mic_obj.enhancedOptions = mic_enhanced_options;

}
 

■音声を検出したか調べる


音声を検出したか調べるには、isVoiceDetected プロパティを使用します。
 
-1 が得られる場合、マイクの準備ができていません。
 
0 が得られる場合、音声未検出です。
 
1 が得られる場合、音声を検出しています。
 
音声を検出したか調べる

import flash.media.Microphone;
import flash.media.MicrophoneEnhancedOptions;
import flash.events.Event;

// デフォルトの「強化版マイクオブジェクト」を取得
var mic_obj:Microphone = Microphone.getEnhancedMicrophone();

// マイクが利用可能
if(mic_obj){
	// マイクから入力した音をスピーカーから出力
	mic_obj.setLoopBack();

	// 毎フレーム実行されるイベント
	stage.addEventListener(Event.ENTER_FRAME,function (e:Event):void{

		// MicrophoneEnhancedOptions オブジェクトを取得
		var mic_enhanced_options:MicrophoneEnhancedOptions = mic_obj.enhancedOptions;

		trace("音声検出:" + mic_enhanced_options.isVoiceDetected);
	});
}
 


 

マイクのサウンド出力を設定する

 


■マイクのサウンド出力を設定する


マイクのサウンド出力を設定するには、soundTransform プロパティを使用します。
 
SoundTransform クラスについては、こちらで解説します。
 
ボリュームの制御が可能です。パンの制御は反映されないようです。
 
マイクのサウンド出力を設定する

import flash.media.Microphone;
import flash.media.SoundTransform;

// デフォルトのマイクオブジェクトを取得
var mic_obj:Microphone = Microphone.getMicrophone();

// マイクが利用可能
if(mic_obj){
	// マイクから入力した音をスピーカーから出力
	mic_obj.setLoopBack();

	// サウンドトランスフォームオブジェクトを取得
	var sound_transform : SoundTransform = mic_obj.soundTransform;

	// ボリュームを設定 (0.0 ~ 1.0)
	sound_transform.volume = 0.5;

	// サウンドトランスフォームオブジェクトをセットして反映
	mic_obj.soundTransform = sound_transform;
}
 


 

マイクの増幅率を設定する

 


■マイクのゲイン(増幅率)を設定する

 
マイクの入力ボリュームを増幅させるには、gain プロパティを使用します。
 
0 ~ 100 までの値を指定します。0 に近いほど無音となります。
 
デフォルト値は 50 です。
 
シグナルの増幅率を指定

import flash.media.Microphone;

// デフォルトのマイクオブジェクトを取得
var mic_obj:Microphone = Microphone.getMicrophone();

// マイクが利用可能
if(mic_obj){
	// マイクから入力した音をスピーカーから出力
	mic_obj.setLoopBack();

	// ゲインを設定
	mic_obj.gain = 50;
}
 

■Flash Player の設定 (マイクの録音ボリューム)

 
Flash Player の設定の、マイクの録音ボリュームに相当します。
 
 


 

マイクのキャプチャーレートを設定する

 


■キャプチャするレート (kHz) を指定する

 
マイクのキャプチャレートを設定するには、rate プロパティを使用します。
 
以下の数値を指定します。デフォルトは 11 です。
 
指定したレートに対応していない場合、実際にサポートする最も近いレートが採用されます。
 
指定する数値実際のサンプリングレート
4444100 Hz
2222050 Hz
1111025 Hz
8 8000 Hz
5 5512 Hz
 
キャプチャレートを変更する

import flash.media.Microphone;

// デフォルトのマイクオブジェクトを取得
var mic_obj:Microphone = Microphone.getMicrophone();

// マイクが利用可能
if(mic_obj){
	// マイクから入力した音をスピーカーから出力
	mic_obj.setLoopBack();

	// キャプチャーレートを設定
	mic_obj.rate = 44;
}
 


 

マイクのエコー抑制を設定する

 


■エコー抑制機能とは?

 
スピーカの近くでマイクを使用すると、キーンという音が発生します。
 
マイクがスピーカーの音を拾い、入力と出力がループして、音が増幅され続ける為に起こります。
 
この現象を、ハウリングといいます。
 
エコー抑制機能を使用すると、ハウリングを軽減する事ができます。
 
スピーカー環境の場合、有効にすると効果的です。
 

■エコー抑制を設定する

 
エコー抑制を設定するには、setUseEchoSuppression() メソッドを使用します。
 
Microphone.setUseEchoSuppression ( 有効か? ) :void
第01引数 Booleanエコー抑制機能を有効にする場合 true を指定、無効にする場合 false を指定。(デフォルト値は false)
戻り値 voidなし
 
エコー抑制を設定する

import flash.media.Microphone;

// デフォルトのマイクオブジェクトを取得
var mic_obj:Microphone = Microphone.getMicrophone();

// マイクが利用可能
if(mic_obj){
	// マイクから入力した音をスピーカーから出力
	mic_obj.setLoopBack();

	// エコー抑制を設定する
	mic_obj.setUseEchoSuppression(true);
}
 

■エコー抑制の状態を取得する

 
エコー抑制の状態を取得するには、useEchoSuppression プロパティを使用します。
 
このプロパティは、読み取り専用です。
 
エコー抑制の状態を取得する

import flash.media.Microphone;

// デフォルトのマイクオブジェクトを取得
var mic_obj:Microphone = Microphone.getMicrophone();

// マイクが利用可能
if(mic_obj){
	// マイクから入力した音をスピーカーから出力
	mic_obj.setLoopBack();

	// エコー抑制を設定する
	mic_obj.setUseEchoSuppression(true);

	// エコー抑制の状態を取得する
	trace(mic_obj.useEchoSuppression);
}
 

■Flash Player の設定 (エコーを減らす)

 
Flash Player の設定の、エコーを減らすに相当します。
 
 


 

マイクのアクティビティを検出する

 
 


■アクティビティとは?

 
アクティビティとは、活動を意味します。
 
マイクの入力音量の大きさから、有音状態、無音状態であるかを検出します。
 
ボイスチャット利用時に効果的です。
 
無音状態の時は、オーディオデータを送信する必要が無いので、帯域を節約する事ができます。
 

■アクティビティの有無の切り替わりを検出する

 
アクティビティの有無の切り替わりを検出するには、ActivityEvent.ACTIVITY イベントを使用します。
 
イベントに登録した関数の引数から得られる、ActivityEvent オブジェクトの activating プロパティから、Boolean 値が得られます。
 
true … 有音状態
 
false … 無音状態
 
アクティビティの有無の切り替わりを検出する

import flash.media.Microphone;
import flash.events.ActivityEvent;

// デフォルトのマイクオブジェクトを取得
var mic_obj:Microphone = Microphone.getMicrophone();

// マイクが利用可能
if(mic_obj){
	// マイクから入力した音をスピーカーから出力
	mic_obj.setLoopBack();

	// アクティビティの有無が切り替わると呼び出されるイベント
	mic_obj.addEventListener(ActivityEvent.ACTIVITY,function (e:ActivityEvent):void{
		if(e.activating){
			trace("有音状態");
		}else{
			trace("無音状態");
		}
	});
}
 

■アクティビティ検出のしきい値を設定する

 
アクティビティ検出のしきい値を設定するには、setSilenceLevel() メソッドを使用します。
 
Camera.setSilenceLevel ( しきい値 , タイムアウト ) :void
第01引数 int0 ~ 100 までのしきい値を指定。0 に近いほど少しの変化でも有音状態として検出する。(デフォルトは 50)
第02引数(略可)int無音状態と判定するまでのタイムアウト時間を指定(単位:ミリ秒)(デフォルトは 2000)
戻り値 voidなし
 
アクティビティ検出のしきい値を設定する

import flash.media.Microphone;
import flash.events.ActivityEvent;

// デフォルトのマイクオブジェクトを取得
var mic_obj:Microphone = Microphone.getMicrophone();

// マイクが利用可能
if(mic_obj){
	// マイクから入力した音をスピーカーから出力
	mic_obj.setLoopBack();

	// アクティビティ検出のしきい値を設定
	mic_obj.setSilenceLevel(10,0);

	// アクティビティの有無が切り替わると呼び出されるイベント
	mic_obj.addEventListener(ActivityEvent.ACTIVITY,function (e:ActivityEvent):void{
		if(e.activating){
			trace("有音状態");
		}else{
			trace("無音状態");
		}
	});
}
 

■アクティビティ検出のしきい値を取得する

 
アクティビティ検出のしきい値を取得するには、silenceLevel プロパティを使用します。
 
無音状態と判定するまでの時間(単位:ミリ秒)を取得するには、silenceTimeout プロパティを使用します。
 
これらのプロパティは、読み取り専用です。
 
アクティビティ検出のしきい値を取得する

import flash.media.Microphone;
import flash.events.ActivityEvent;

// デフォルトのマイクオブジェクトを取得
var mic_obj:Microphone = Microphone.getMicrophone();

// マイクが利用可能
if(mic_obj){
	// マイクから入力した音をスピーカーから出力
	mic_obj.setLoopBack();

	// アクティビティ検出のしきい値を設定
	mic_obj.setSilenceLevel(10,0);

	// アクティビティ検出のしきい値を取得する
	trace(mic_obj.silenceLevel);

	// 無音状態と判定するまでの時間を取得
	trace(mic_obj.silenceTimeout);
}
 

■マイク入力音量の実測値を取得する

 
マイク入力音量の実測値を取得するには、activityLevel プロパティを使用します。
 
0 から 100 までのボリューム値が得られます。
 
-1 が得られる場合、マイクデバイスの準備ができていません。
 
アクティビティレベルを取得する

import flash.media.Microphone;
import flash.events.Event;
import flash.events.ActivityEvent;

// デフォルトのマイクオブジェクトを取得
var mic_obj:Microphone = Microphone.getMicrophone();

// マイクが利用可能
if(mic_obj){
	// マイクから入力した音をスピーカーから出力
	mic_obj.setLoopBack();

	// アクティビティ検出のしきい値を設定
	mic_obj.setSilenceLevel(10,0);

	// アクティビティの有無が切り替わると呼び出されるイベント
	mic_obj.addEventListener(ActivityEvent.ACTIVITY,function (e:ActivityEvent):void{
		trace("アクティビティ:" + e.activating);
	});

	// 毎フレーム実行されるイベント
	stage.addEventListener(Event.ENTER_FRAME,function (e:Event):void{
		trace("アクティビティレベル:" + mic_obj.activityLevel);
	});
}
 


 

マイクからサウンドを録音する (Flash 10.1 以降)

 
 


■マイクから入力された音を、バイナリ形式(PCM)で取得する

 
マイクから入力されたサウンドを、バイナリ形式(PCM)で取得するには、SampleDataEvent.SAMPLE_DATA イベントを使用します。
 
■イベントの動作について
 
このイベントに関数を登録した時点で、録音が開始されます。
 
登録した関数は、比較的頻繁に呼び出されます。以下の、A→B→C の流れが繰り返されます。
 
A.バッファにサウンドデータが貯められる
 
B.一定の量まで貯まると、イベントが発火しバッファにアクセスできる。
 
C.バッファの中身が不要になったのでクリアされる。
 
■SampleDataEvent クラスのプロパティについて
 
登録した関数の引数から、SampleDataEvent オブジェクトが得られます。
 
SampleDataEvent クラスには、以下のプロパティがあります。
 
プロパティ 解説
position Number 現在のサンプリング位置(録音を開始した時点を 0 とする)
data ByteArray position のサンプリング位置から蓄積された、サウンドのバイナリデータ(PCM)。
 
■取得例
 
サウンドデータを取得する

import flash.media.Microphone;
import flash.utils.ByteArray;
import flash.events.Event;
import flash.events.SampleDataEvent;

// デフォルトのマイクオブジェクトを取得
var mic_obj:Microphone = Microphone.getMicrophone();

// マイクが利用可能
if(mic_obj){
	// マイクから入力した音をスピーカーから出力
	mic_obj.setLoopBack();

	// サウンドデータが一定量貯まるたびに呼び出されるイベント
	mic_obj.addEventListener(SampleDataEvent.SAMPLE_DATA, function (e:SampleDataEvent):void{

		// 現在のサンプリング位置
		var pos:Number = e.position;

		// サウンドのバイナリデータ
		var data:ByteArray = e.data;

		// 出力テスト
		trace("現在のサンプリング位置:" + pos);
		trace("サウンドバッファのサイズ:" + data.length);
	});
}
 

■サウンドデータ(PCM)のフォーマットについて

 
position プロパティについて
 
録音を開始してから、現在までに経過したサンプリングの位置を取得するには、position プロパティを使用します。
 
単位は、サンプリング数です。バイト数ではありません。
 
無音状態と判定されている間の注意点
 
アクティビティにより、無音状態と判定されている間は、SampleDataEvent.SAMPLE_DATA イベントは発火しません
 
関数は呼び出されませんが、position プロパティのカウントは、止まること無く進み続けます。
 
これにより、サウンドデータが得られない区間が発生する事になります。
 
サウンドデータが得られない区間は、すべて 0.0 と考えるといいでしょう。
 
サンプリングレートについて
 
position プロパティの増加していく量は、キャプチャーレートと関係があります。
 
キャプチャーレートの設定については、こちらで解説しています。
 
キャプチャーレートを取得するには、rate プロパティを使用します。
 
取得値実際のサンプリングレート
4444100 Hz
2222050 Hz
1111025 Hz
8 8000 Hz
5 5512 Hz
 
例えば、キャプチャーレートが 44 である場合、サンプリング数は、44100 Hz となります。
 
1 秒につき 44100 ずつ、サンプリング位置が増える事になります。
 
例えば、キャプチャーレートが 11 である場合、サンプリング数は、11025 Hz となります。
 
1 秒につき 11025 ずつ、サンプリング位置が増える事になります。
 
バイナリのフォーマットについて
 
サウンドバッファには、モノラル(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 に格納し続ける例です。
 
マイクから得られるサウンドデータを、 ByteArray に格納し続ける

import flash.media.Microphone;
import flash.utils.ByteArray;
import flash.events.Event;
import flash.events.SampleDataEvent;

// 録音用バッファ
var record_buffer:ByteArray = new ByteArray();

// デフォルトのマイクオブジェクトを取得
var mic_obj:Microphone = Microphone.getMicrophone();

// マイクが利用可能
if(mic_obj){
	// キャプチャレートを設定する
	mic_obj.rate = 44;

	// マイクから入力した音をスピーカーから出力
	mic_obj.setLoopBack();

	// サウンドデータが一定量貯まるたびに呼び出されるイベント
	mic_obj.addEventListener(SampleDataEvent.SAMPLE_DATA, function (e:SampleDataEvent):void{
		var data:ByteArray = e.data;

		// 欠落区間があれば 0.0 で埋める
		var add:Number = e.position * 4 - record_buffer.length;
		if(add > 0){
			record_buffer.length += add;
		}

		// サウンドデータを録音用バッファの最後尾に追加
		data.readBytes(record_buffer,record_buffer.length,data.length);
	});
}
 

■サウンドデータ(PCM)を使って、サウンドを再生する

 
サウンドデータ(PCM)を使って、サウンドを再生するには、Sound クラスを使用します。
 
Sound クラスについては、こちらで解説しています。
 
再生時のフォーマットについて
 
サウンドデータ(PCM)を再生するには、サンプリング数が 44100 Hz のステレオ(2チャンネル)形式である必要があります。
 
このフォーマットに一致するように、サウンドデータを変換します。
 
キャプチャレート 44 の変換例
 
例えば、キャプチャーレートが 44 であるサウンドデータを再生する場合です。
 
モノラルからステレオに変換する必要があります。
 
よって、以下の図のように 2 個ずつ同じデータを埋めていきます。
 
 
キャプチャレート 22 の変換例
 
例えば、キャプチャーレートが 22 であるサウンドデータを再生する場合です。
 
モノラルからステレオに変換する必要があります。
 
サンプリング数が 2 倍に増加します。
 
よって、以下の図のように 4 個ずつ同じデータを埋めていきます。
 
 
キャプチャレート 11 の変換例
 
例えば、キャプチャーレートが 11 であるサウンドデータを再生する場合です。
 
モノラルからステレオに変換する必要があります。
 
サンプリング数が 4 倍に増加します。
 
よって、以下の図のように 8 個ずつ同じデータを埋めていきます。
 
 
■再生例
 
マイクから得られたサウンドデータを使って、サウンドを再生する例です。
 
マイクから得られたサウンドデータを画面クリックで再生する

import flash.media.Microphone;
import flash.media.Sound;
import flash.utils.ByteArray;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.events.SampleDataEvent;

// 録音用バッファ
var record_buffer:ByteArray = new ByteArray();

// デフォルトのマイクオブジェクトを取得
var mic_obj:Microphone = Microphone.getMicrophone();

// マイクが利用可能
if(mic_obj){
	// マイクから入力した音をスピーカーから出力
	mic_obj.setLoopBack();

	// キャプチャレートを設定する
	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 data:ByteArray = e.data;

		// 欠落区間があれば 0.0 で埋める
		var add:Number = e.position * 4 - record_buffer.length;
		if(add > 0){
			record_buffer.length += add;
		}

		// サウンドデータを録音用バッファの最後尾に追加
		data.readBytes(record_buffer,record_buffer.length,data.length);
	});


	// ------------------------------------------------------------
	// マウスの左ボタンを押下すると実行されるイベント
	// ------------------------------------------------------------
	stage.addEventListener(MouseEvent.MOUSE_DOWN,function (e:MouseEvent):void{

		// 1 度に転送するサンプリング数
		var sampling:int = 2048;

		// ------------------------------------------------------------
		// サウンドオブジェクト
		// ------------------------------------------------------------
		// サウンドオブジェクトを作成
		var sound_obj:Sound = new Sound();

		// サウンドデータ要求時に呼び出されるイベント
		sound_obj.addEventListener(SampleDataEvent.SAMPLE_DATA, function (e:SampleDataEvent):void{
			var i:int;
			var d:Number;
			var data:ByteArray = e.data;

			// 録音バッファの位置を残す
			var record_buffer_pos:Number = record_buffer.position;

			try{
				for(i=0;i < sampling;i++){
					// 再生サンプリング位置から録音バッファの位置を計算
					record_buffer.position = Math.floor((i + e.position) * (capture_rate / 44100)) * 4;

					// 録音バッファから1つ分のデータを取得
					d = record_buffer.readFloat();

					// L と R に書き込み
					data.writeFloat(d);
					data.writeFloat(d);
				}

			}catch(e:Error){
				// 0.0 で埋める
				data.length = sampling * 2 * 4;
			}

			// 録音バッファの位置を戻す
			record_buffer.position = record_buffer_pos;
		});

		// 再生開始
		sound_obj.play();
	});
}