🎙️

Unityマイク入力をOSのシステム設定に合わせる(PhotonVoice2)

2021/10/30に公開

概要

  • マイク抜き差ししたら喋れなくなった。
  • デフォルトのマイクがうまく設定されなかった。
    というような問題に直面してUnityアプリ側のマイク入力がOS側のマイク入力に応じても動的に変わるようにしたかったので調べました

前提条件

  • PhotonVoice2を使ったボイスチャットのマイク設定
    • マイクの取得とかについてはPhotonVoice関係ないので参考になるかも
  • 環境
    • Windows10(おそらくMacでも大丈夫ですが未確認)
    • Unity2020.3.21.f1

Windowsならここの設定を変えたときにこの設定通りのマイクにしたかった。

初期設定

今回はPhotonVoice2のアセットをインポートしセットアップしたのちDemoVoicePun-Sceneを使って実装します。

Photonの設定やDemoシーンを動かすまでの設定は他の方の記事がたくさんあるので省略します。

スクリプト

DemoVoicePun-Sceneに追加するのは以下スクリプトをアタッチしたオブジェクトのみです。

using Photon.Voice.Unity;
using UnityEngine;

public class VoiceManager : MonoBehaviour
{
    [SerializeField]
    private Recorder _recorder;

    private void OnEnable()
    {
        AudioSettings.OnAudioConfigurationChanged += OnListenAudioConfigurationChanged;
    }
    private void OnDisable()
    {
        AudioSettings.OnAudioConfigurationChanged -= OnListenAudioConfigurationChanged;
    }

    private void OnListenAudioConfigurationChanged(bool deviceWasChanged)
    {
        var micDevices = Microphone.devices;
        var deviceCount = 0;

        foreach (var device in micDevices)
        {
            if (deviceCount == 0)
            {
                _recorder.UnityMicrophoneDevice = device;
            }
            Debug.Log(deviceCount + ":" + device);
            deviceCount++;
        }

        var forceRestart = true;
        // if (_recorder.RequiresRestart)
        // {
        _recorder.RestartRecording(forceRestart);
        // }
    }
}

OS側のマイク入力変更イベントの取得

OS側でマイク入力を手動変更したりマイクを抜き差ししたときはAudioSettings.OnAudioConfigurationChangedで通知されます。

この通知を受け取ったときにマイクのリストを取得してOSで選択中のマイクに設定を変えてあげれば良いだけです。

OS側で選択中のマイクの取得

取得可能なマイクの配列は Microphone.devices で取得できます。
このとき選択されているものが配列0番目になるので0番目を取得すればOSで選択中のものになります。上記サンプルコードでは順番を確認するためにDebug.Logでコンソール出力していますが0さえ取れれば不要です。

PhotonVoice2でのマイク設定

ちなみに上記Microphone.devices以外にPhotonVoice2を使用している場合PhotonVoiceのRecorderコンポーネントを使用することでマイクを取得することも可能なようです。
この場合Microphone.devicesと違って順番が必ずしも選択順にならないようで苦労しました。
PhotonVoiceのRecorder.UnityMicrophoneDeviceに上記で取得したマイクを割り当ててRecorderを再起動します。
※本来Recorder.RequiresRestartはUnityMicrophoneDeviceを設定したタイミングでtrueになるはずと思ったのですがなぜかうまく動かず強制的に再起動しています。原因わかったら追記します。参考

切り替えられました。

今回はデフォルトマイクがOculusVirtualAudioDeviceになっており「マイクが効かないなんで?」となったのをきっかけに調査しました。音声まわりはデバッグが大変ですね…

何か間違いだったりありましたらTwitterのDMかzennのコメントか何かでご連絡頂ければと。

Discussion