Unityで録音して、録音したサウンドを再生する最小実装


Unityでサウンドを録音して、また録音した音声を再生させた事がなかったので調査しました。

録音開始

MicrophoneクラスをStartすると録音状態となります。

// 10・・・録音最大秒数
// 44100・・・サンプリング周波数
_recordedClip = Microphone.Start("(録音機材名)", false, 10, 44100);

そして録音を終了する、または録音最大時間を越えると戻り値に録音済みのAudioClipが返却されます。使い方はとってもシンプルです。

録音する際は録音機材名の指定が必要です。上記のソースコードの中の"(録音機材名)"の部分です。

録音機材名の取得

Microphone.devices配列から録音機材名を取得できます。

foreach (string device in Microphone.devices)
{
    // 録音機材名リストに保持
    _micNames.Add(device);
}

録音の終了

Microphone.End("(録音機材名)");

ちなみに録音の終了は、Endメソッドに使用したデバイス名をセットします。

成果物

OnGUIで超シンプルなUIをデバッグ用として用意しています。

僕のMacはSoundfloowerをインストールしているので、マイクが複数あり、それに気づかず最初動作しなくて戸惑いました。

なぜこんな事をしているか?

経緯としては、子供がトランシーバーがほしいとせがんでくるため、家にあるものでそれっぽいものが作れないか今まさに模索している最中でございます。以下経緯Tweet。

2台のスマホアプリで音声を直接やり取りする、またはサーバーに一旦保持させるなど、やり方は色々ありそうです。

どちらにしても声の録音が必要だったので備忘録として残しました。

Unityじゃなくても良いのだが..

そうです。Unityでやる必要は一切ありません。しかしiOS、Androidに両方ビルドできるメリット、僕が Unityに慣れているという点、納期が短い(明日子供が学校から返ってくるまで)という点から採用しています。

時間が許せば、最近気になっているFlutterで実装し直してみようと思います。

全ソースは以下にアップしています。
https://gist.github.com/baobao/4e5d1332e030828d141c492f93ea3c06