using System; using Adrenak.UniMic; using UnityEngine; namespace Adrenak.UniVoice.UniMicInput { /// /// An implementation based on UniMic. /// For more on UniMic, visit https://www.github.com/adrenak/unimic /// public class UniVoiceUniMicInput : IAudioInput { const string TAG = "UniVoiceUniMicInput"; public event Action OnSegmentReady; public int Frequency => Mic.Instance.Frequency; public int ChannelCount => Mic.Instance.AudioClip == null ? 0 : Mic.Instance.AudioClip.channels; public int SegmentRate => 1000 / Mic.Instance.SampleDurationMS; public UniVoiceUniMicInput(int deviceIndex = 0, int frequency = 16000, int sampleLen = 100) { if (Mic.Instance.Devices.Count == 0) throw new Exception("Must have recording devices for Microphone input"); Mic.Instance.SetDeviceIndex(deviceIndex); Mic.Instance.StartRecording(frequency, sampleLen); Debug.unityLogger.Log(TAG, "Start recording."); Mic.Instance.OnSampleReady += Mic_OnSampleReady; } void Mic_OnSampleReady(int segmentIndex, float[] samples) { OnSegmentReady?.Invoke(segmentIndex, samples); } public void Dispose() { Mic.Instance.OnSampleReady -= Mic_OnSampleReady; } } }