{31 день с Mango} День 27: API микрофона

Это День 27 в серии статей 31 день с Mango (перевод оригинальной серии 31 Days of Mango), и был написан приглашенным автором Parag Joshi. Вы можете найти Parag в твиттере  @ilovethexbox.
Распознавание речи или создание заметок является очень распространенной практикой в зависимости от вашей профессии или сферы применения. Надо понимать, что мобильные устройства сейчас предлагают некоторые возможности распознавания речи и управления приложениями, будь то команды, набор номера или другие наиболее общеупотребимые действия, управление проигрыванием музыки.
Звуковые заметки дают еще одну возможность, которая будет полезна при записи результатов своей работы для дальнейшего использования.

Самый первый шаг для задейстования всех этих сфер применения — это иметь возможность захвата звука через микрофон и обработать его по мере необходимости.

Итак, сегодня мы рассмотрим API микрофона, которое предусмотрено в Mango, и мы разберем очень простой пример, чтобы вы могли начать его использовать.

Как минимум, мы должны записать звук и сохранить его для воспроизведения. Это дает пользователю самую основную возможность вести звуковые заметки.
Следует отметить следующие ключевые моменты:
1) Microphone class: это класс из пространства имён Microsoft.Xna.Framework.Audio , который предоставляет нам доступ к api микрофона.
2) public event EventHandler<EventArgs> BufferReady: это событие, когда микрофон готов выдать буферизованное аудио. Нам нужно обработать это событие и сохранить аудио для воспроизведения.
3) Microphone.Start: как и следует из названия — это метод, вызываемый для начала записи.
4) Microphone.Stop: метод, вызываемый для завершения записи. Ключевой момент здесь в том, что вызов Microphone.Stop сразу же очищает буфер.

Как будет показано в приложении, мы не вызываем останов немедленно, когда пользователь переключает микрофон или нажимает кнопку воспроизведения. Вместо этого мы позволяем микрофону отдать содержимое буфера по событию готовности содержимого буфера в выбранной длительности буфера, чтобы захватить последние биты аудио данных до остановки записи.
using Microsoft.Xna.Framework->Как вы догадываетесь, чтобы задействовать пространство имён микрофона, нам нужно подключить фреймворк XNA. API микрофона это часть фреймворка XNA и требует организации игрового цикла используемого в XNA. If you are not familiar with XNA, XNA is a rich framework provided by Microsoft for game and graphics based applications. Если вы не знакомы с XNA, знайте — это богатый фреймворк, созданный в Microsoft для игровых и графических приложений.

Необходимые условия: Установить инструменты разработки Манго с сайта http://create.msdn.com . Это даст вам Visual Studio Express 2010 и Windows Phone SDK, которые нужны вам для разработки приложений для Windows Phone.
1. Запустите Visual Studio и перейдите к файлу решения (расширение sln) и откройте его. Приложение создано с помощью шаблона Silverlight «Windows Phone Application» . Откройте проект и запустите в эмуляторе. Вы увидите следующий экран, когда приложение запустится:

2. Элементы экрана:
a. Кнопка переключения микрофона, которая запускает и останавливает микрофон.
b. Кнопка для воспроизведения записанного звука.
c. Три ползунка для регулировки громкости (Volume), высоты (Pitch) и стереоэффект(Pan) воспроизводимого звука. Эти свойства могут быть скорректированы только перед началом воспроизведения.
3. Как это работает:
a. Дотроньтесь до кнопки микрофона на экране для начала записи. Вы можете остановить запись, нажав на  микрофон снова или же нажав на кнопку воспроизведения.
b. Отрегулируйте громкость, высоту и стереоэффект, и проверьте влияние изменений, проиграв записаный звук.

Декларирование: скриншот деклараций


Мы будем использовать объект класса SoundEffectInstance для воспроизведения записанного звука. Мы могли бы также воспользоваться SoundEffect однако класс SoundEffectInstance позволяет нам отслеживать состояние (воспроизведение или остановка).
Другая декларация здесь для объекта MemoryStream. Буфер микрофона постоянно записывается в MemoryStream, пока не понадобится воспроизвести. В это время, мы передаем содержимое MemoryStream к объекту SoundEffectInstance для воспроизведения.
Инициализация:

Ключевой момент здесь в том, что игровой цикл мы создали с использованием DispatcherTimer. Этот цикл имеет важное значение для захвата звука с микрофона.
Мы установили изображение для значка воспроизведения на основе светлой или темной темы, используемой в телефоне.
На данном этапе мы также установим параметры микрофона по умолчанию для нашего приложения следующим образом:

Длина буфера по времени установлена ​​в 1/2 секунды, а затем мы используем метод GetSampleSizeInBytes и передаем длину буфера, чтобы получить нужный размер буфера в байтах. Это важно для обеспечения плавного захвата аудио.
Мы подключаемся к событию готовности буфера и установливаем изображение микрофона по умолчанию.
Мы готовы начать запись!

Запись звука:
Когда пользователь нажимает кнопку микрофона вызывается следующий код:


Есть несколько вещей, которые происходят здесь:
1. Микрофон останавливается: ​​если микрофон остановлен, мы должны запустить его для начала записи. Изменим фон кнопки микрофона. Затем мы сбрасываем  MemoryStream, чтобы удалить ранее записанный звук. Мы проверяем и остановливаем воспроизведение записанного звука.
Достаточно несколько простых шагов. Как минимум мы должны вызвать Microphone.Start ().Остальные шаги связаны с пользовательским интерфейсом и внешним видом приложения.
2. Микрофон находится в режиме записи: Как минимум мы должны остановить запись. Как мы уже упомянули, мы не можем вызвать Microphone.Stop сразу же, пока все записанные данные не были сброшены на MemoryStream. Поэтому мы используем логическое переменные для отслеживания и откладывания действия остановки по событию DispatchTimer.
Две вещи должны произойти здесь. Во-первых, мы должны выполнить в первую очередь действия для события готовности буфера микрофона, также мы должны прочитать последние биты аудио, а затем нам нужно запустить воспроизведение. Мы делаем это следующим образом:
По событию готовности буфера, мы проверяем, если запись была остановлена ​​с помощью наших логических переменных и тогда мы вызываем Stream.Flush (). Это очищает данные, оставшиеся в MemoryStream. Тогда мы останавливаем микрофон.
Однако мы не можем вызвать воспроизведение по этому событию. Это обрабатывается по событию DispatchTimer tick следующим образом:
Событие tick (такт) происходит каждые 33 мс. Так что для пользователя  воспроизведение не вызовет относительно никаких признаков отставания. Конечно же преимуществом является то, что мы может воспроизводить все аудио не деля его на части.
Мы проверяем, если пришло время воспроизводить запись и был ли поток очищен. Если это так мы начинаем новый поток для воспроизведения аудио. Это важно отметить здесь.
Мы запускаем воспроизведение звука в другом потоке, чтобы разрешить обновление пользовательского интерфейса.  Это означает, что любой код внутри нашей процедуры воспроизведения, который используется для обновления элементов пользовательского интерфейса, должен сделать это вызывая Dispatch.BeginInvoke как показано ниже.

Воспроизведение:

Мы создаем объект класса SoundEffectInstance, передавая ему захваченый аудио поток, частота дискретизации микрофона и звукового канала.
Так как мы хотим использовать ползунки для регулировки громкости, высоты звука и стереоэффекта, мы должны использовать Dispatcher.BeginInvoke , поскольку они обрабатываются в другом потоке.
Наконец мы вызываем метод Play.

Таким образом, довольно просто создать приложение для записи аудио. Мы можем расширить это приложение, чтобы сохранить записанный звук в изолированном хранилище и дать ему название по выбору пользователя. Мы можем добавить список из записей в изолированным хранилище и превратить это в приложение с аудиозаметками.
Основные шаги для записи аудио:
a) Подключиться к событию микрофона для захвата звука
b) Записать звук в поток
c) Когда пользователь останавливает запись, очистить поток и сохранить его или воспроизвести.
Мы также можем расширить этот пример, взяв записанный звук и отправив его  службе распознования речи или обработчику голосовых команд.

Вы можете скачать рабочую версию проекта, описанного в этой статье: скачать.

Завтра мы поговорим о мультимедиа библиотеке.
До встречи!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *