среда, 10 декабря 2014 г.

Работа с микрофоном в Unity. Часть 1.


Работа с микрофоном в мобильных играх может стать вполне неплохим занятием. На днях возникла такая задача и была найдена англоязычная статья на этот счет. Оставив в глубине души пизд*ж про то, что надо знать английский, чтобы плодотворно работать в айти сфере, решил перевести эту статью (возможно где-то что-то сократить, без утери смысла), ибо давно ничего не переводил, скилл (небольшой) начал становиться еще меньше. Ну что же, хватит разговоров, поговорим о том, как работать с микрофоном в Unity.

С версии Unity 3.5, в Unity есть класс для работы с микрофонным вводом. Этот класс так и называется - Microphone. Класс, сам по себе, предоставляет базовые методы для доступа и работы с аудиопотоком, который поступает через микрофон (в том числе, на мобильных девайсах). Для того, чтобы начать захват звука с аудиоустройства по умолчанию, нужно написать следующий код (в ходе урока создадим простой класс-обертку, для работы с микрофоном (надстройка над Microphone)):

using UnityEngine;
using System.Collections;

public class MicrophoneInput : MonoBehaviour {
    void Start() {
        audio.clip = Microphone.Start(null, true, 10, 44100);
    }
}

Что делает этот код? Он начинает запись со стандартного (дефолтного) аудио устройства (так как мы передали null в качестве параметра) на 10 секунд, при частоте сэмплирования 44 килогерц, и продолжает запись путем возврата в начало записи (второй параметр - true) каждые 10 секунд. Но это вы и так могли обнаружить в хелпе Unity. Это все классно, но как это юзать на практике? Ответ кроется в классе AudioSource.

Давайте расширим скрипт. Сначала убедимся, что объект содержит AudioSource, это можно сделать, написав следующую строку над нашим классом:

[RequireComponent(typeof(AudioSource))]

Далее, мы поработаем с некоторыми атрибутами самого аудиоклипа и настроим ожидание проигрывания, чтобы игралось после записи. Добавим следующие строчки в функцию Start.

audio.loop = true; //  Делаем наш AudioClip зацикленным
audio.mute = true; // Глушим звук
while (!(Microphone.GetPosition(AudioInputDevice) > 0)){} // Ждем, пока запись не начнется 
audio.Play(); // Проигрываем наш звук

Давайте создадим новую функцию - GetAveragedVolume, которую мы можем использовать для получения значения, которое будет обозначать громкость сигнала, идущего с микрофона. Нам надо взять абсолютно значение громкости + мне нравится идея сделать это значение усредненным, для того, чтобы исключить всякие скачки и сгладить всякие переходы. Для начала мы получим данные из AudioSource в некий массив заданной длины (я выбрал 256). 

float GetAveragedVolume()
    float[] data = new float[256];
    audio.GetOutputData(data,0);
}

Комментариев нет:

Отправить комментарий