В этой статье я хочу рассказать о процессе создания медиаплеера UrbanDenoiser Player. Помимо всяких «прелестей и красивостей» (о которых лучше почитать на практически одноимённом официальном сайте) плеер имеет новаторские режимы воспроизведения:

  • Denoiser — повышение разборчивости аудиосигнала несмотря на внешний шум;
  • Noise Around — одновременное прослушивание медиаконтента и звуков окружающего пространства;
  • Natural — в котором плеер адаптирует выходной сигнал не только к АЧХ конкретных наушников, но и персональным особенностям слуха пользователя.

image

Версия для iPhone

Естественно, эти возможности были бы невозможны без новаторского алгоритма обработки сигнала. О его создании и пойдёт речь.

От слуховых аппаратов к медиаплеерам


В начале 2014 года дружная команда разработчиков трудилась над выпуском приложения Petralex Hearing Aid, реализующего цифровой слуховой аппарат на базе смартфона/планшета. Изначально приложение было адресовано людям, которые вынуждены (но стесняются) носить слуховой аппарат. Ведь гарнитуру смартфона за слуховой аппарат никто принять не подумает. К тому же у смартфона/планшета есть вся аппаратная часть (как и у настоящего – и весьма недешевого! – цифрового слухового аппарата). Дело лишь за «софтом», способным в реальном времени обрабатывать аудиосигнал в соответствии с персональной аудиограммой пользователя (характеризующей нарушения слуха), снятие которой – тоже дело «софта».

Так вот, в самый жаркий период окончания работ над Petralex два человека из команды разработчиков, после тяжёлого трудового дня, ехали в метро. И один дал товарищу наушник – послушать песенку с забавным содержанием. Правда из-за шума (кто ездил в метро, знает!) товарищ не разобрал ни одного слова! И сгоряча предложил идею: анализировать окружающий шум и обрабатывать полезный сигнал так, чтобы повышать его разборчивость (несмотря на внешний шум!).

Идея друзей вдохновила. К дальнейшему обсуждению подключились математики – с целью создать нужный алгоритм обработки сигнала (используя, в том числе опыт, полученный с Petralex).

Битва над алгоритмом


Самой главной проблемой была неординарность задачи – ни одной публикации по данной тематике найти не удалось! В первый момент разработчики вообще не знали об имеющихся аналогах. Возможно поэтому, решили задачу гораздо более оригинальным способом. А о похожих решениях (по материалам западных конференций) узнали уже в момент оформления собственного патента.
Но это было позже. Поначалу алгоритм обработки сигнала был ещё очень сырой. Ни о каком «реал-тайме» не шло речи вообще. Впрочем, для начальной отладки это нормально – целью было заставить работать программный модуль в принципе, чтобы получить желаемый результат.

urbandenoiser splash

Первый прототип приложения, готовый к установке на телефон, вышел спустя пять месяцев после возникновения самой идеи – в июне 2014 года. И сразу же выявились его недостатки – математический алгоритм обработки сигнала оказался очень «тяжёлым»!
Ведь основная проблема при обработке звука в режиме реального времени – требуется простой и эффективный алгоритм. Чтобы мобильный телефон успевал обрабатывать довольно стремительный поток данных (44.1 кГц в нашем случае). Обычно, в обработке речи ограничиваются частотами 8 или 16 кГц. Но поскольку в нашем приложении обрабатывается и музыка, то частота должна быть выше.

Так вот, получившийся алгоритм отказывался работать на iPhone 4. Пришлось разработчикам вновь засучивать рукава и оптимизировать код на Си. В результате удалось снизить загрузку процессора с 55% до 35% на iPhone 5. На тот момент этого оказалось достаточно (хотя сейчас ребята трудятся над ещё большим снижением загрузки CPU, чтобы приложение запускалось на любом «захудалом Android»).

Искания «меломанов»


Тестирование плеера с обновлённым алгоритмом показало себя замечательно. Первый режим (получивший название Denoiser) был готов. Однако дальше опять встретились трудности. К примеру, какую степень быстроты реакции алгоритма на изменения окружающего шума выбрать? Если сделать алгоритм очень «чувствительным», то звук плеера будет изменяться стремительно – при смене внешней шумовой обстановки. С одной стороны это хорошо – если шум возник резко и остаётся на неизменном уровне длительное время. Но для «внезапных» шумов (типа стука молотка, резких ударов, вообще любых единичных «возмущений») высокая чувствительность плеера не подходит. С другой стороны очень медленная реакция тоже плохо – слушатель будет вынужден долго ожидать, пока алгоритм плеера адаптируется к новой обстановке. «Золотую середину» в настройках алгоритма разработчикам приходилось кропотливо выбирать вручную – методом проб и ошибок.

image

Ещё одной проблемой была необходимость учитывать специфику конкретной аппаратуры (т.е. собственный уровень шума микрофона гарнитуры). На этот шум алгоритм обработки вообще не должен реагировать! Однако беда в том, что у каждого телефона свой, «индивидуальный» уровень шума. Все это нужно было как-то учесть в конечном варианте приложения. Хорошо ещё, что звуковая система iPhone характеризуется довольно малым уровнем шума.

На данном этапе разработки приняли решение считать уровень собственных шумов для всех «яблочных» устройств одинаковым. Хотя в дальнейшем (и сейчас эта работа продолжается) ставится задача «научить» плеер не реагировать на голос пользователя, который также фиксируется микрофоном телефона – наряду с внешними шумами.

На этом, математический алгоритм обработки звука был закончен. Помимо режима Denoiser («без шумов») разработчики придумали функции одновременного прослушивания музыки и окружающих звуков (например, в метро – полезно слышать названия передаваемых станций).

Но особой гордостью разработчиков стал режим Natural («натуральное звучание»). В этом режиме достигается сглаживание искажений, вносимых в аудиосигнал аппаратной частью воспроизводящего устройства, а также индивидуальными особенностями слуха пользователя (исключая случаи явного нарушения слуха).

image image

Эффект Natural также достигается благодаря «хитрому» математическому алгоритму обработки аудиосигнала. Его суть заключается в оценке АЧХ воспроизводящего устройства относительно субъективного порога слышимости в тишине (для каждого пользователя этот порог свой) – и ввода поправочного коэффициента. На практике это означает, что потратив пару минут на настройку плеера (с помощью встроенной процедуры определения порога слышимости), можно наслаждаться живой окраской музыки. И почувствовать себя в настоящем концертном холе!

Ещё немного радужных красок и…


Математический алгоритм плеера был отлажен. Но для его превращения в полноценное мобильное приложение требовался дружелюбный интерфейс. И вновь появились трудности. Разработчики очень долго мучились над синхронизацией рисования анимации (в частности спектрума – чтобы он не «дёргался» и совпадал с обновлениями экрана мобильника). Класс CADisplayLink нигде явно не описан. То есть документация конечно есть. Но попробуй найти конкретные указания, что вот «именно это очень важно и нужно»!

Следующей «ступенькой» к успеху стала борьба с интерфейсом. В частности в iOS при включении микрофона (когда ваше приложение свёрнуто) отображается красная полоса. Микрофон можно выключить вызовом одной функции, но полоса при этом не пропадает. Чтобы её убрать приходится делать кучу ненужных, да еще и часто мешающих работе, манипуляций (останавливать AudioGraph и перезапускать снова, что не есть хорошо – эту остановку можно услышать на слух). Ну, и общей загвоздкой было отсутствие простеньких приложений (типа «Hello world», работа с БД, работа с Аудио, Видео и т.д.). Хотя в целом уже ничто не могло остановить победного шествия приложения!

image

Вот вкратце история создания UrbanDenoiser Player – первого в мире плеера с уникальными режимами воспроизведения. Результат многомесячной работы дружной команды специалистов теперь доступен каждому – плеер распространяется свободно!

PS: Из последних новостей — приложение UrbanDenoiser Player стало победителем Европейского кубка разработчиков проводимого Microsoft, в категории B2С http://appcup.eu

Спасибо за внимание!

Комментарии (30)


  1. grozaman
    16.06.2015 12:55

    С наушниками-ёлочками проблема исчерпывает себя на корню :)
    Но работа проведена интересная, куча народу ходит в обычных AirPods. За дизайн отдельный плюс.


    1. o_nix
      16.06.2015 16:21

      А бывают ли ёлочки разных размеров? И где вообще их именно брать?


    1. SLY_G
      16.06.2015 16:22
      +1

      Впервые от вас узнал про такие наушники, как «ёлочки». У них улучшенная звукоизоляция?


      1. grozaman
        16.06.2015 21:31
        +1

        Они на любителя, так скажем. То есть некоторым не нравится такое глубокое «проникновение» беруши в уши.
        Но звукоизоляция отличная, что одновременно и плюс, и минус. Плюс — ну тут объянять не надо, а вот минус так это то, что можно даже не услышать сиренящую машину переходя через дорогу.


        1. ayakovlev
          17.06.2015 17:53
          +1

          Теперь надо для ёлочек написать программу, которая будет из внешнего шума выделять важные звуки и транслировать их в наушник.
          Например, гудки автомобилей, объявления и речь, начинающуюся только с вежливого обращения.


  1. NeGO
    16.06.2015 13:12
    +1

    Планируется ли версия для андроид?


    1. glazik
      16.06.2015 13:26
      -2

      В андройде есть большая проблемма с Latency (http://superpowered.com/latency/)
      Звуковые драйвера андройда не позволяют обработать звук с микрофона и выдать его на наушники быстрей чем 10 ms. И именно это задержку и ниже наш мозг перестаёт замечать. Так, что думаю пока гугал не сделют шаг в этом направлении, рынок програм основаных на обработке звука в реальном времени на андройде, развиваться не будет.

      Хотя, возможно, у ITforyou есть како-то алгоритм «угадывающий» искажения на перёд


    1. ITforyou Автор
      16.06.2015 14:38
      +4

      Версия для android находится в разработке и ожидается в ближайшее время. А задержка не так важна, потому что учитывается не шум в текущий момент, а его статистика, которая усредняется на продолжительном интервале времени.


      1. glazik
        16.06.2015 14:48
        +1

        Здорово! Ждём! :)


  1. NikitOS9
    16.06.2015 15:30
    -2

    >уникальный медиаплеер…
    любая обработка исходника и будет уже не битперфект на выходе, при этом еще говорить о повышении качестве музыки — слишком уж рекламно,
    шумодавы для разговоров еще подходят, но не для музона, хотя в случае прослушки mp3 в затычках это все не важно имхо


    1. Newbilius
      16.06.2015 15:33

      В каких наушниках и на какой громкости должен фанат идеального звука слушать музыку в изначально зашумлённом помещении, транспорте и т.п.?


      1. NikitOS9
        16.06.2015 15:44
        -5

        еще важны вопросы на каком железе и какой аудио формат,
        фанату нужно самому слушать и сравнивать, айфон, ведроид и тд… точно не для фанатов качественного музона


  1. artoym
    16.06.2015 15:35
    +1

    Всю статью не оставляло ощущение, что автор никогда-никогда-никогда не слышал словосочетание «активное шумоподавление».

    Интересно насколько хорошо он работает — ведь обработка сигнала требует времени, а это критично.


    1. SADKO
      16.06.2015 18:12

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


      1. netmaxed
        17.06.2015 08:30
        +1

        ах вот оно что!
        а то я статью прочитал и вообще ничего не понял :)
        а почему

        активный шумодав даже на айфоне врядли получится
        ?


        1. artoym
          17.06.2015 08:48

          Айфон крутой и быстрый, но даже он не успеет получить сигнал, обработать и выдать свой.
          То есть здесь просто те частоты на которых внешний шум в плеере увеличиваются? Всё?


  1. SystemXFiles
    16.06.2015 15:37

    Установил.
    Понравилось то, что можно слышать окружение, для меня важно это в условиях города, если еду на велосипеде (сейчас так понимаю задержки уже меньше не сделать, ибо они ощутимы, что немного беспокоит, т.е. если машина резко появится рядом, то пару миллисекунд могут быть решающими).

    Небольшие замечания и предложения:

    • Плейлисты показываются без учета вложенности сразу все в корне, это отталкивает от использования вашего плеера на постоянной основе.
    • Определение слухового порога не позволяет сбалансировать звук верно, потому есть мысль после определения уровня на обоих ушах, дать возможность отрегулировать баланс вручную для каждой частоты, дабы каждая частота начала звучать одинаково на обоих ушах (по ощущениям)
    • Статистический анализ шума это хорошо в транспорте, но хотелось бы, чтобы плеер мог реагировать чуточку быстрее для подавления некоторых неожиданных относительно длительных шумов (добавить настройку к примеру).
    • Вообще иметь возможность тонкой ручной настройки работы плеер, в том числе алгоритма. Так сказать для любителей покопаться в конфиге.


    1. SystemXFiles
      16.06.2015 17:37

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


    1. ITforyou Автор
      16.06.2015 19:33

      Спасибо за замечания. Учтем в будущих версиях. Не хотелось запутывать пользователя дополнительными настройками, хотя мысли такие были.


  1. o_nix
    16.06.2015 16:22

    WP версия не видит песен (или очень странно находит пяток Unknown) и не работает в фоне.


    1. ITforyou Автор
      17.06.2015 10:26

      На WP выделяется мало памяти для фоновых процессов, но мы работаем над этим


  1. mrThe
    16.06.2015 16:47

    Так вот, получившийся алгоритм отказывался работать на iPhone 4. Пришлось разработчикам вновь засучивать рукава и оптимизировать код на Си. В результате удалось снизить загрузку процессора с 55% до 35% на iPhone 5

    Требуется iOS 8.0 или более поздняя версия.


    Я так понимаю, с iphone4 так и не получилось? :(


    1. ITforyou Автор
      16.06.2015 17:12
      +1

      У iOS 7 другой audio api и пришлось бы поддерживать несколько версий приложения.


  1. entze
    16.06.2015 17:17

    Тестировал одно из приложений «заточенное под наушники». Предлагалось выбрать производителя и модель и в демо режиме сравнить с «чудо-фичей» и без. Затем купить «чудо» через in-app.
    Конечно, с «чудом» звук был значительно лучше. Вот только «без чуда» звук был значительно хуже звука из стандартного плеера. Т.е. Разработчики сознательно портили звук.

    По поводу активного шумодава — разве микрофон не должен быть рядом с ушами?


    1. SADKO
      16.06.2015 18:09
      +1

      Должен и не один, но здесь как я понял нет активного подавления шума, а скорее динамическая частотная коррекция сигнала исходя из спектрального состава окружающих шумов…


  1. ilyak
    16.06.2015 18:18

    А что если телефон в кармане лежит? В микрофон будет попадать много громкого шуршания, что будет только портить звук.
    На единичные громкие звуки программа никак не реагирует, получается?

    В общем, выпускайте андройд версию скорей, пока не потрогаешь не поймешь.


    1. ITforyou Автор
      16.06.2015 19:32

      По умолчанию предполагается использование микрофона гарнитуры, который находится около лица. В плеере есть возможность переключения микрофонов — с гарнитуры на встроенный в телефон.


      1. SystemXFiles
        16.06.2015 19:36

        Еще бы хорошо автоматический выбирать, если подключены например наушники и в них нет микрофона, то выбирать телефон.


  1. crwin
    16.06.2015 20:29

    Из замеченного на iOS 8.4 (последняя бета) — красная полоска имеется.
    В остальном же качество услышенного меня даже расстроило. Возможно для некоторых типов музыки и подходит, но для электроники это полный атас — всё булькает, сцена то отдаляется, то приближается, то высокие, то низкие. Мне лично не подходит с моим кейсом, но использовал, если бы это были не_динамические преднастройки, например как это реализовано в плеере Radsone.


  1. ganzmavag
    17.06.2015 16:46

    Попробовал на Windows Phone. Даже без учета фич, получился самый красивый плеер на этой операционке. Хотелось бы только воспроизведение музыки по папкам, а то библиотека не всегда корректно работает. Ну и, конечно, работы в фоне.

    По поводу теста слуха — сделайте поплавнее увеличение громкости. А то задержки толком нет, только нажал, что слышишь один тон — уже другой слышно. Разница получается в скорости реакции, а не в реальной слышимости.
    Идея просто очень понравилась. У меня на одном ухе завал по ВЧ, очень здорово будет, если удастся с помощью вашего алгоритма нормально начать музыку слушать, как она должна быть. Спасибо огромное)