Микрофон и Unity
Недавно у меня появилась идея для написания маленькой простенькой игры - VoiceJump где управлять персонажем нужно при помощи голоса. Юнити даёт нам возможность записывать звук из микрофона в AudioClip с которым потом можно сделать все что угодно. Из минусов только то что он не работает на WebGL что было б мне очень кстати... Класс Microphone имеет всеволишь два главных метода: StartRecording и End. Немного... но этого хватит. Метод StartRecording возвращает AudioClip и принимает 4 аргумента: имя устройства с которого нужно записывать (можно получить из массивы Microphone.devices), сколько времени нужно записывать, закольцевать ли запись и частоту(от 16000 Гц и до 44000 Гц). Но самое интересное здесь это пост обработка звука. Дальше все нужно делать ручками. Как должна работать игра? Она должна взависимоти от громкости звуков поднимать объект вверх-вниз. Здесь уже всё идёт посложнее чем из записью звуков. Сначала нам нужно записывать звук в AudioClip и в реальном времени его обрабатывать. Это звучит сложно но на деле это не так страшно.
audioSource.clip = Microphone.Start(Microphone.devices[0], true, 1000, 16000); while (!(Microphone.GetPosition(null) > 0)) { } audioSource.Play();
Проигрывать звук обезательно чтобы нам было что изменять. Так устроен аудио движок в Юнити. Для того чтобы мы не слышали собственный голос можно создать Audio Mixer и почепить его на наш Audio Source а потом в Master выкрутить Volume на ноль.
Настоящего риалтайма нам не добиться так как всеравно небольшая задержка будет но она не будет особо мешать.
Теперь самое интересное как же узнать тишина сейчас или есть какие-то звуки?
Очень просто, сначала создадим нужные переменные:
bool IsNoisily=false;
Первая будет хранить звуковой спектр из нашего микрофона, вторая результат нашей функции.
Теперь сама функция для проверки звуков
bool CheckNoise(float MinimumVolume)
{
float audioData = new float[1024]; audioSource.GetSpectrumData(audioData, 0,FFTWindow.Rectangular);
float CurrentVolume = audioData.Average();
//Debug.Log(CurrentVolume.ToString());
if (CurrentVolume>MinimumVolume)
return true;
else
return false;
}
Теперь давайте разберемся что сдесь и как. Сначала разбиваем наш звук на спектр. Потом сохраняем текущую громкость звука. Теперь если текущая громкость выше минимальной то возвращаем истину а если нет то возвращаем ложь.
Теперь о минимальной громкости. Она регулируется от 0.004 (низкая чувствительность) и до 0.001 (высока чувствительность) я рекомендую 0.0025
Чтобы использовать функцию нужно дописать в Update строку
IsNoisily = CheckNoise();
Вот так как-то. О игре которую я придумал расскажу в отдельной статье когда завершу её, могу сказать лишь то что это не очередной клон Flappy Bird.
Что такое Average()?
ОтветитьУдалитьЯ понял, для того чтобы это работала в unity, подключите using System.Linq;
ОтветитьУдалить