ForgeVision Engineer Blog

フォージビジョン エンジニア ブログ

Unityで任意の再生デバイスに音声を出力する

こんにちは!VR事業部の長谷川(id:waffle_maker)です。今回はUnityで任意の再生デバイスに音声を出力する方法について紹介します。

はじめに

Unityでは、任意の録音デバイス(マイクロフォンなど)から音声を取得することができますが、任意の再生デバイス(スピーカー、ヘッドフォンなど)に音声を出力することができません。

振動デバイスを使用する場合や、ボイスチャット機能を実装する場合、これでは困ります。
※Windowsであれば、アプリの音量とデバイスの設定で設定する事が出来ますが、使い勝手があまり良くありません。

そこで、AudioStream [PCM audio for Unity](以下、AudioStream)を使用して、任意の再生デバイスに音声を出力してみましょう。
assetstore.unity.com

なお、AudioStreamはFMOD for Unityを使用しており、FMODのライセンス規約に従う必要があります。
※確認した時点では、開発期間中はライセンス料がかからないようです。

assetstore.unity.com

バージョン情報など

各種バージョン情報は以下の通りです。

実際に試してみる

幾つかの方法があるようですが、本記事ではAudio Mixerを使用する方法を試してみましょう。

Unityプロジェクトのセットアップ

  1. 新規プロジェクトを作成し、AudioStream [PCM audio for Unity]とFMOD for Unityをインポートします。
    ※FMOD Setup Wizardが表示されますが、今回はそのまま閉じてしまって大丈夫です。

Audio Mixerのセットアップ

  1. 新しくAudio Mixerを作成します。
  2. 作成したNewAudioMixerの子のMasterを選択し、Inspector ViewのAdd Effectボタンをクリックし、コンテキストメニューからAudioStream OutputDeviceを選択します。
  3. OutputDevice IDを右クリックし、コンテキストメニューからExpose 'OutputDevice ID~を選択します。
  4. 作成したNewAudioMixerをダブルクリックしてAudio Mixer Viewを開き、左上のExposed parameters(1)内のMyExposedParamを右クリック、コンテキストメニューからRenameを選択してOutputDevice IDに変更します。

テストコードのセットアップ

ドロップダウンで再生デバイスを選択する簡単なテストアプリを作ってみましょう。

  1. 新しくAudio Sourceを作成し、以下の様に設定します。
    • AudioClip:6chaudio
    • Mixer:作成したNewAudioMixerの子のMaster
    • Loop:On
  2. 新しくDropdown - TextMeshProを作成します。
    ※TMP Importer Viewが表示されたら、Import TMP Essentialsと、Import TMP Examples & Extrasを実行しましょう。
  3. 新しく作成したGameObjectに下記サンプルコードをアタッチし、以下の様に設定します。
    • Audio Mixer:作成したAudio Mixer
    • Dropdown:作成したDropdown - TextMeshPro
using AudioStream;
using AudioStreamSupport;
using TMPro;
using UnityEngine;
using UnityEngine.Audio;

public class AudioStreamTest : MonoBehaviour
{
    [SerializeField] private AudioMixer audioMixer;
    [SerializeField] private TMP_Dropdown dropdown;

    private void Start()
    {
        // ドロップダウンの内容をクリアし、列挙した再生デバイスを追加
        dropdown.options.Clear();

        var availableOutputs = FMOD_SystemW.AvailableOutputs(LogLevel.DEBUG, gameObject.name, null);
        foreach (var availableOutput in availableOutputs)
        {
            dropdown.options.Add(new TMP_Dropdown.OptionData(availableOutput.name));
        }

        // ドロップダウンの変更イベントを設定
        dropdown.onValueChanged.AddListener(OnValueChanged);
    }

    private void OnValueChanged(int value)
    {
        // AudioMixerの再生デバイスを設定
        audioMixer.SetFloat("OutputDevice ID", (float)value);
    }
}


実行すると、Dropdownには再生デバイスが表示されました!
※文字化けしていますが、動作に支障はありません。気になる方はTextMesh ProのFontAssetsを作成しましょう。

Dropdownで選択した再生デバイスから音声が出力されました!

再生デバイスが1つしか無い場合は、Game ViewでMute Audioしてみましょう。
指定した再生デバイスに音声が直接出力されていることが確認できます。

トラブルシューティング

Build Settingsにデモシーンが追加される
  • Demoフォルダを削除しましょう
StreamingAssets以下にファイルが追加される
  • AudioStreamEditorSupport.csを削除しましょう

まとめ

長々と解説しましたが、Audio Mixerに追加したAudioStream OutputDevice内のOutputDevice IDを変えるだけで再生デバイスを切り替えられる素晴らしいアセットです。

メタバースアプリの開発などで、ぜひご活用下さい!!