イナヅマTVログ

ActionScript 3, マイクから音声を録音する – Wave

| 0件のコメント

没ネタ供養シリーズ、お楽しみいただけたでしょうか。
中途半端な作り込みで少々お恥ずかしいのですが、没ネタということでお許しください。

ActionScriptでの録音処理です。
flash.media.Microphone を使います。

まずマイクを取得します。

var microphone:Microphone = Microphone.getMicrophone();

ゲインとレートを設定します。

microphone.gain = 100;
microphone.rate = 44;

ゲインはMaxの100にしています。
CDなどのレートは44.1KHzなので、44.1と設定したいところですがレートはint型なので44です。

フィードバック(ハウリング)対策のためにsetSilenceLevelを指定します。

microphone.setSilenceLevel(0, 3000);

public function setSilenceLevel(silenceLevel:Number, timeout:int = -1):void

via API Document : http://help.adobe.com/ja_JP/AS3LCR/Flex_4.0/flash/media/Microphone.html?allClasses=1

サウンドと見なす最小入力レベルと、実際に無音状態が始まったと見なすまでの無音時間の長さを設定します。後者は省略可能です。

サウンドと見なす最小入力レベルを 0 にしました。

無音時間の長さは 3000ms(3sec)にしています。
デフォルトの -1 は 2000ms(2sec)になります。

SampleDataEvent.SAMPLE_DATAのリスナーを設定します。

microphone.addEventListener(SampleDataEvent.SAMPLE_DATA, onSampleData);

イベントハンドラ

var byteArray:ByteArray = new ByteArray();
function onSampleData(event:SampleDataEvent):void
{
	while(event.data.bytesAvailable > 0) {
		byteArray.writeFloat(event.data.readFloat());
	}
}

API Documentのサンプルコードにならいwhileを使わず単純に以下のような1行にすると音飛びが発生してしまいました。

byteArray.writeFloat(event.data.readFloat());

SampleDataEvent.SAMPLE_DATA発生間隔にたまっているデータを吐き出させないといけないようです。

最後にWaveへのエンコードですが sazameki を参考にさせてもらいました。
org.sazameki.audio.format.wav.Wav

【おまけ】
夕方に「できる?」な問い合わせがあり時計の針がシンデレラタイムを過ぎた頃にデモができあがったのですが、残念ながら翌朝あっさりキャンセル。

もうひとつ残念なお知らせはじっくり探してみるとライブラリがすでにあったことです。
bytearray.org : MicRecorder, a tiny microphone library

マイクから入力した音声をWave形式で保存したいなら bytearray.org MicRecorder を使うといいよ。

本当に残念なお話でした。
半年近く溜め込んでたものが吐き出せて少しスッキリしています。

コメントを残す

必須欄は * がついています