📰

MiRZAのマイク音声を使うためのライブラリを作成した話

に公開

MiRZAはマイクを持っています。

ARグラスでマイクからの音声データを利用したいことはありませんか?Unityで開発できるデバイスであれば、Unity標準の方法でも可能ではあるのですが、少し手間をかけるとMiRZA本来のマイク機能を利用することが出来ます。今回はそんなMiRZAのマイクを使えるライブラリを作った話です。

MiRZAのマイク機能

MiRZAはグラス部分にマイクを搭載しています。そして録音をすることも可能です。また、最近のアップデートで指向性を持たせて音声データを録音することも可能なのでMiRZAのマイク機能を使いたい。。。
となるのですが、ちょっと手間が必要です。
MiRZAのマイクをつかうための手段としてはJava上でMiRZA上のマイクにアクセスし、Unity上でそのJavaライブラリを使う形をとる必要があります。公式サイトにはサンプルも参考にしてみてください。

https://www.devices.nttqonoq.com/developer/doc/samples/samples-qonoq/unity-packages/mirza-library/glasses-microphone-recording/

ただ、毎回Javaライブラリから構築するのも少し面倒ではあるので、Javaライブラリとそれを利用してUnity上でMiRZAのマイク音声データを扱えるUnityパッケージを作りました。パッケージをインポートしてUnity用のコンポーネントを利用すれば、ストリーミング、一括で音声データを取得することができます。

MiRZAUnityLibraryの概要

MiRZAUnityLibraryは、Unity向けに設計されたライブラリで、音声データの収集や処理を効率的に行うためのツールとして提供します。現状パッケージには特にSnapdragon Spaces SDKが必要としているのですが、サンプルとして提供しているコードの中で一部つかっているため依存ライブラリとして記載しています。サンプルを導入しないのであればSnapdragon Spaces SDK自体は不要にはなります。

提供機能

ライブラリとして提供しているものは、MiRZAのマイクを利用する為のJavaライブラリと、それをUnity上で呼び出して録音制御やデータ取得を行うコンポーネント'Glass Microphone Recorder'で構成されています。
'Glass Microphone Recorder'の主な機能は以下の通りです。

1. 音声データの収集モード

  • バッチモード: 録音終了後に音声データを一括取得。
  • ストリーミングモード: 録音開始時から定期的に音声データを取得。

2. 録音条件

マイクで録音する音声データの形式を指定することができます。

  • サンプリング周波数
  • チャネル数
  • PCMビット数

3. イベントハンドリング

  • OnBuffering: 音声データの差分を定期的に取得するイベント。
  • OnComplete: 録音終了時に音声データを保存するイベント。

使用方法

ライブラリはGithubで公開しています。GithubからUnity Packageとしてインポートすることも可能です。

https://github.com/TakahiroMiyaura/MiRZANativeLibrary.git

Unityプロジェクトへの導入手順

導入方法としては作成したUnityプロジェクトにMiRZAUnityPackageをインポートし、コンポーネントを追加。
録音の制御を実装するという流れになります。

  1. Unityプロジェクトを作成。
  2. MiRZA Libraryをインポート。
  3. MiRZA Unity Libraryのインポート
    以下のURLを使用して、Unityのパッケージマネージャーからライブラリをインポートします。
https://github.com/TakahiroMiyaura/MiRZANativeLibrary.git#upm
  1. Snapdragon Spaces SDKをインポート(サンプルを使用する場合のみ)。
  2. 空のGameObjectを作成し、Glass Microphone Recorderコンポーネントを追加。
  3. 録音の開始・終了、音声データ取得処理を実装します。

実装例

以下は簡単な実装例です。

録音の開始と停止

録音の開始と終了は、GlassMicrophoneRecorderのStartRecordingとStopRecordingで行います。StartRecordingメソッドを実行するとGlassMicrophoneRecorderのプロパティ設定に合わせて録音条件と音声データの送信が開始されます。録音を終了する際にはStopRecordingを呼び出します。

void Start()
{
    var microphoneRecorder = GetComponent<GlassMicrophoneRecorder>();
    microphoneRecorder.StartRecording();
}

public void OnClicked()
{
    microphoneRecorder.StopRecording();
}

バッファリングイベントの処理

録音の開始後、モード設定応じてOnBufferingイベントとOnCompletedイベントが発生します。Insector等で録音データ(バイナリ)を処理する為のメソッドを登録することで音声データを利用することが可能です。どちらのイベントもbyte[]が引数になります。OnBufferingイベントはbatchModeがfalseの時に、音声データが都度差分で取得できます。ストリーミングで音声処理を行う場合の利用を想定しています。batchModeがtrueにするとこのイベントは発生せず、録音終了時に、OnCompletedイベントが発生し音声データが一括で取得可能です

 public void OnCompleted(byte[] audioData)
 {
     string filePath = SaveWavFile(audioData, microphoneRecorder.SampleRate, microphoneRecorder.Channels, microphoneRecorder.BitDepth);
     lastSavedFilePath = filePath;
     PlayLastSavedAudio();
 }

Discussion