メインコンテンツまでスキップ
バージョン: 1.0.4

MiRZAでストリーミング音声を取得する方法

WARNING

本ページに記載の環境は本記事執筆時点(2025/3/14)のものです。
アップデートによって変更が生じている可能性がある点ご留意ください。

はじめに

自社グループであるNTTコノキューデバイスから**MiRZA(ミルザ)**というXRグラスが発売されています。

今回は、このMiRZAに搭載されている IP接続マイクを使用してストリーミング音声を取得する方法についてご紹介します!

本記事の対象

  • MiRZAのマイクから音声を取得したいエンジニア
  • WebRTCやWebSocketで送る音声をAndroidから取得したいエンジニア

構築環境

  • Windows 11
  • Unity 2022.3.27f1

構成図

Unityで利用できる標準マイクを利用しないため、Android機能を利用してMiRZAについているマイクにアクセスします。詳細はMiRZAでIP接続マイクの音声を録音する方法に記載されています。なので、Unityで使える標準マイクで問題ない場合はUnityだけで完結します。

今回はストリーミング音声を取得するため、ボタンのオンオフで録音を制御し、オンの場合は一定間隔ごとに音声バッファをUnityに送信できるような実装をしていこうと思います。録音した音声はUnity側で再生できるようにします。

実装

Unity

以下のような画面構成で作成しました。

  • ONボタン:録音開始
  • OFFボタン:録音停止
  • テキストスペース:音声データのログを表示

録音開始

ONボタンに以下の関数を登録しています。

処理の流れ

  1. ステータス更新:
    録音開始時に、ユーザーに状況を伝えるために画面上のステータスを「Recording Status: Start recording」に更新します。
  2. Androidのコンテキスト取得とオーディオマネージャーへのアクセス:
    Unityの UnityPlayer クラスを介して、現在のAndroidアクティビティを取得し、そこからアプリケーションコンテキストおよびオーディオサービスにアクセスします。
  3. オーディオデバイスのリストアップ:
    オーディオマネージャーの getDevices メソッドを用いて、利用可能な入力デバイス(AudioDeviceInfoの配列)を取得します。
  4. 特定のデバイスの選定:
    取得したデバイスの中から、getType() メソッドを利用してTYPE_IPに該当するデバイスを探し、該当するデバイスがあればそのデバイスを対象にします。
  5. 録音の開始とAudioClipの生成:
    対象デバイスが見つかった場合、Android側の startStreamingRecording メソッドを呼び出して録音を開始します。同時に、Unity側では AudioClip.Create を用いて録音データを受け取るためのAudioClipを生成し、オーディオソースにセットします。

録音停止

OFFボタンに以下の関数を登録しています。

処理の流れ

録音停止の実行:
Android側の特定のメソッド(例:stopStreamingRecording など)を呼び出して、録音を終了します。

音声取得

以下の関数でAndroidから音声データを受け取っています。

今回の実装では、2つのメソッドがあります。

  • OnAudioDataReceivedメソッド:
    Android側から受信したBase64文字列の音声データを処理し、AudioClipにデータをセットして再生します。
  • ConvertByteArrayToFloatArrayメソッド:
    Base64文字列から変換したbyte配列の音声データを、16ビットPCMフォーマットに基づいてfloat配列へ変換します。
処理の流れ
  1. Base64→byte[]変換:
    Convert.FromBase64String を使用して、Base64文字列をbyte配列にデコードします。
  2. byte[]→float[]変換:
    続いて、変換メソッド ConvertByteArrayToFloatArray を呼び出し、16ビットPCMのデータを正規化されたfloat配列に変換します。
  3. AudioClipへの反映と再生:
    変換したfloat配列を _audioClip.SetData に渡し、AudioClipにデータをセットする。その後、オーディオソースにAudioClipをセットし、Play() メソッドで再生を開始します。

Android

以下のコードを用いて、.aarファイルを作成し、Unityプロジェクトに配置してください。
(.aarファイルの作成方法の詳細は省略します。)

処理の流れ
  1. 録音開始処理:

    Unity側のONボタンが押下されると発火します。

  2. 録音データの読み込みと送信:

    1秒ごとに音声データを送信しています。Unity側に送信する頻度を調整したい場合は、こちらのコードで変更を加える必要があります。

  3. 録音停止処理:

    Unity側のOFFボタンが押下されると発火します。

リポジトリ

Unityプロジェクトが含まれています。Unity側の詳細については記載していないため、気になる方はリポジトリ内のファイルをご確認ください。

本来はAndroid Studioのファイルも含める予定でしたが、謎のエラーにより断念しました…

ただし、ビルド済みの .aar ファイルがUnityプロジェクトに入っているため、Android Studioなしでも利用可能です。

🔹 .aarファイル(GitHub)
recordlibrary-debug.aar

🔹 リポジトリ全体(GitHub)
mirza-stream-rec