Audio Recorder
AudioRecorder Class
AudioRecorder ClassOverview
Class Definition
using System;
using System.IO;
using UnityEngine;
namespace SkillfulAI.API
{
/// <summary>
/// A static class for recording audio using the microphone and encoding it to WAV format.
/// </summary>
public static class AudioRecorder
{
private static AudioClip clip;
private static bool recording;
/// <summary>
/// Indicates whether audio is currently being recorded.
/// </summary>
public static bool IsRecording => recording;
/// <summary>
/// Starts recording audio from the microphone.
/// </summary>
/// <param name="duration">The duration of the recording in seconds (default is 10 seconds).</param>
/// <param name="frequency">The sample rate of the recording in Hz (default is 44100 Hz).</param>
public static void StartRecording(int duration = 10, int frequency = 44100)
{
clip = Microphone.Start(null, false, duration, frequency);
recording = true;
}
/// <summary>
/// Stops the recording and returns the audio data as a byte array in WAV format.
/// </summary>
/// <returns>A byte array containing the recorded audio in WAV format, or null if not recording.</returns>
public static byte[] StopRecordingAndGetBytes()
{
if (!recording) return null;
var position = Microphone.GetPosition(null);
Microphone.End(null);
var samples = new float[position * clip.channels];
clip.GetData(samples, 0);
recording = false;
return EncodeAsWAV(samples, clip.frequency, clip.channels);
}
/// <summary>
/// Encodes the provided audio samples to WAV format.
/// </summary>
/// <param name="samples">An array of audio samples.</param>
/// <param name="frequency">The sample rate of the audio in Hz.</param>
/// <param name="channels">The number of audio channels.</param>
/// <returns>A byte array containing the audio data in WAV format.</returns>
private static byte[] EncodeAsWAV(float[] samples, int frequency, int channels)
{
using (var memoryStream = new MemoryStream(44 + samples.Length * 2))
{
using (var writer = new BinaryWriter(memoryStream))
{
writer.Write("RIFF".ToCharArray());
writer.Write(36 + samples.Length * 2);
writer.Write("WAVE".ToCharArray());
writer.Write("fmt ".ToCharArray());
writer.Write(16);
writer.Write((ushort)1);
writer.Write((ushort)channels);
writer.Write(frequency);
writer.Write(frequency * channels * 2);
writer.Write((ushort)(channels * 2));
writer.Write((ushort)16);
writer.Write("data".ToCharArray());
writer.Write(samples.Length * 2);
foreach (var sample in samples)
{
writer.Write((short)(sample * short.MaxValue));
}
}
return memoryStream.ToArray();
}
}
}
}Detailed Explanation
Usage Example
Conclusion
Last updated