マイクを選択して録音する

2020/09/21
Unity
audio

Unityでマイクデバイスを選択肢て録音する方法

環境

  • Unity 2020.1.3f1

デバイス一覧の取得

Microphone.devices[1]でデバイス名の一覧を取得する。

public class MicrophoneDropdown : MonoBehaviour
{
    [SerializeField] private Dropdown dropdown;

    void Start()
    {
        dropdown.AddOptions(Microphone.devices.ToList());

        dropdown.onValueChanged.AddListener((index) =>
        {
            string selectedMic = dropdown.options[index].text;
            //  use selected mic
        });
    }
}

特にハンドラがあるわけではなくデバイス名を識別子として引きまわす。

録音

Microphone.Start[2]で取得できるAudioClipをaudioSource.clipに設定することで録音したデータを再生できる。

[SerializeField] private AudioSource audioSource;
private string deviceName;

private void StartRecording()
{
    StartCoroutine(StartRecordingCoroutine());
}

private IEnumerator StartRecordingCoroutine()
{
    const int Samples = 2 << 12;
    Microphone.GetDeviceCaps(deviceName, out int minFreq, out int maxFreq);
    int lengthSec = minFreq / Samples;
    audioSource.clip = Microphone.Start(
        deviceName: deviceName,
        loop: true,
        lengthSec: minFreq / Samples,
        frequency: minFreq
    );
    audioSource.loop = true;

    yield return new WaitUntil(() => Microphone.GetPosition(deviceName) > 0);

    audioSource.Play();
}

録音データの利用には再生の必要があるので、audioSource.Play()は必須。
継続的に録音するなら、Microphone.Startのloop引数とaudioSource.loopを両方trueにする。
固定時間で良いならloopをfalseにして録音時間をlengthSecに設定する。

Microphone.GetDeviceCapsはデバイスの最小周波数と最大周波数を取得できる。

上記の例でサンプル数と時間を指定しているのはスペクトルの利用を想定しているため。 単に録音だけで良いなら適当でいい。

WaitUntilで待っているところは一瞬なので、録音開始までのラグはさほど気にする必要は無い。

そのままだと入力がそのままスピーカーから出力されるので、音量を0に設定したAudioMixerGroupをAudioSourceのOutputに設定して、音が出ないようにする。 Muteでは再生そのものがされなくなるのでNG。

mixer

© 2019-2022 hassakulab.com, built with Gatsby