📑

MiRZAデバイスのマイクを利用する

2025/01/15に公開

MiRZA搭載のマイクで録音できます。

Snapdragon Spaces用のデバイスとしてMiRZAは提供されているのですが、ハードウェアとして一部独自の機能を有しています。例えば、テンプル部分のタッチセンサーによるジェスチャー操作等があります。
こういったMiRZA固有の機能についてはMiRZA Libraryが提供されておりこれを利用することで自身が作成したアプリの中でMiRZAの固有機能を利用することができます。
本記事ではMiRZAデバイスに搭載されているマイクを使った収音とそのデータを再生するために実装方法を紹介します。

MiRZA Libraryについて

MiRZA Libraryは冒頭で説明した通りMiRZA固有機能にアクセスするためのAPIで構成されたライブラリです。
公式のサイトからモジュールなどをダウンロード可能です。

https://www.devices.nttqonoq.com/developer/doc/mirza-library/overview

ただし、MiRZAデバイスに搭載されたマイクで録音するためには上記の手順で書かれているライブラリだけではその機能を利用することができません。上記のサイトで提供されているライブラリはマイクの指向性に関する設定をおこなうために利用します。実際のマイクの収音については別のライブラリを導入する必要があります。
マイク収音に利用するライブラリについてはQONOQのサンプルコードの中に入っています。サンプルは以下のリンク先にある「グラスのマイクの録音 (実験的)」から導入可能です。

https://www.devices.nttqonoq.com/developer/doc/samples-qonoq/glass-microphone-recording/

このサンプルにはMiRZA Library経由でマイクを収音しその結果をファイルで保存するサンプルコードがあるので音声の保存についてはサンプルそのままでOKです。

収音した情報の再生について

録音された情報はPCM形式となっています。サイトには書かれていないのですが、録音データは44.1KHz,16Bit,モノラル形式で記録されています。よって保存されたファイルを上記の形式でAudioClipに読み込ませればアプリで再生することが可能です。
以下は再生するための実装の抜粋です。MiRZA Libraryで収音したPCM形式のファイルを読み込み、上記仕様でエンコードした情報でAudioClipを作成し、再生させます。音量が不足している場合は必要に応じて波形を大きくします。


    private void PlayOneShot()
    {
        if (isRecording)
        {
            return;
        }

        using var fileStream = new FileStream(filePath, FileMode.Open);
        var audioClipData = new byte[fileStream.Length];
        fileStream.Read(audioClipData, 0, audioClipData.Length);
        var audioClip = AudioClip.Create("MiRZA Audio", audioClipData.Length, 1, 44100, false);
        audioClip.SetData(Create16BITAudioClipData(audioClipData, amplifire), 0);
        audioSource.clip = audioClip;
        audioSource.Play();
    }

    private static float[] Create16BITAudioClipData(byte[] data, float amp)
    {
        var audioClipData = new float[data.Length / 2];
        var memoryStream = new MemoryStream(data);

        for (var i = 0;; i++)
        {
            var target = new byte[2];
            var read = memoryStream.Read(target);

            if (read <= 0) break;

            audioClipData[i] = (float)BitConverter.ToInt16(target) / short.MaxValue * amp;
        }

        return audioClipData;
    }

UnityのMicrophoneクラスも一応使えます。

Snapdragon Spaces対応アプリとして音声を録音するだけであれば、UnityのMicrohoneクラスを利用することも可能です。この場合MiRZA Libraryで提供されている指向性等の設定を使ったMiRZA固有処理は利用することができないことに注意してください。

Discussion