マイクを選択して録音する
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。