Оригиналът е на полския програмист Томек Рекавек, който работи върху

...
Оригиналът е на полския програмист Томек Рекавек, който работи върху
Коментари Харесай

Полски специалист създава AdBlock за радиото

Оригиналът е на полския програмист Томек Рекавек, който работи върху плана Jackrabbit Oak в границите на Apache Software Foundation за Adobe. Статията е оповестена в неговия персонален блог на 24 февруари 2016 година. Но е забавна и настояща до през днешния ден.
Полското „Радио-3“, известно и като „Тройката“ предлага хубава музика и има интелигентни водещи. От друга страна, предаването изобилства от шумни и дразнещи рекламни блокове, предлагащи от електроника до медикаменти. Томек обича и слуша това радио съвсем непрестанно и като програмист, преди време си е задал въпроса, а дали не мога да махна тази реклама? Изглежда че решение има.
Цифрова обработка на сигналите
Целта е да се сътвори приложение, което заглушава рекламата в радиопредаванията. Рекламният блок стартира и завършва със специфични „джингли“, които програмата би трябвало да разпознае и да изключи звука сред тях.



Известно е, че тази област на математиката и информатиката се назовава цифрова обработка на сигналите, само че за мнозина DSP е нещо като магия. Но това е и една отлична опция да се научи нещо ново и потребно. Най-подходящият механизъм за нашия случай е потреблението на крос-корелация (cross-correlation).
Octave
Всички материали показват реализацията на другите логаритми в MATLAB. Но MATLAB е едно огромно, тежко и скъпо приложение, което в действителност улеснява изпълняването на комплицираните математически интервенции, в това число и DSP. За благополучие, съществува безплатната опция Octave. В Octave напълно не е комплицирано да се започва взаимната корелация на два аудиофайла. Необходими са единствено следните пет команди:
pkg load signal jingle = wavread(`jingle.wav`)(:,1); audio = wavread (`audio.wav`)(:,1); [R, lag] = xcorr(jingle, audio); plot(R);
Получава се и следната диаграма:



Добре се вижда пика, показващ мястото на jingle.wav в audio.wav. Всичко става напълно елементарно: цялата работа прави функционалността xcorr(). Останалият код служи за четене на файловете и проявление на резултата.

Сега остава същият логаритъм да се осъществя на Java. Ще се получи инструмент, който:
Чете аудиопотока от общоприетия вход, да вземем за пример благодарение на ffmpegАнализира го и намира джинглитеИзвежда този аудиопоток към общоприетия stdout и/или краткотрайно го изключва
Използването на stdin и stdout дава опция за включването на новия анализатор и към други приложения за възпроизвеждане и обработка на звука.
Четене на звуковите файлове
Първата работа, която би трябвало да свърши Java програмата е прочитането на джингъла, показан като.wav файл и слагането му в масив. Във файла има спомагателна информация, като заглавие, метаданни и други. Но на нас ни би трябвало единствено звука. Подходящият за тази цел формат е PCM – това е просто лист с цифри. Преобразуването на WAV във PCM може да стане благодарение на ffmpeg:
ffmpeg -i input.wav -f s16le -acodec pcm_s16le output.raw
Тук всеки обикновен се съхранява във тип на 16-битово число с противоположна разпоредба на байтове (little endian). В Java е уместно да се употребява вида short. А за автоматизираното превръщане на входния поток в short смисли може да се употребява класа ByteBuffer:
ByteBuffer buf = ByteBuffer.allocate(4); buf.order(ByteOrder.LITTLE_ENDIAN); buf.put(bytes); short leftChannel = buf.readShort(); // stereo stream short rightChannel = buf.readShort(); Дизасемблиране на xcorr
За да се осъществя функционалността xcorr() на Java е належащо да се прегледа сорс кода на Octave. Всичко е много елементарно. Ето по какъв начин наподобява тази функционалност на Java:
N = length(audio); M = 2 nextpow2(2 * N - 1); pre = fft(postpad(prepad(jingle(:), length(jingle) + N - 1), M)); post = fft(postpad(audio(:), M)); cor = ifft(pre.* conj(post)); R = real(cor(1:2 * N));
Изглежда малко ужасно, само че това са най-вече тривиални интервенции с масиви. В основата на крос-корелацията е потреблението на бързото превръщане на Фурие.
Бързото превръщане на Фурие
Без никакъв опит в DSP е задоволително да се гледа на FFT като функционалност, която на входа си приема масива, описващ звуковия фрагмент и го преобразува в масив с сложни цифри, показващи честотите. Този минималистичен метод работи доста добре. Сравнението на този Java логаритъм с Octave демонстрира едни и същи резултати. А това е премного.
Използването на xcorr в стрийминг предаванията
Представеният нагоре логаритъм допуска, че audio е някакъв масив, в който търсим jingle. Но това не е уместно за стрийминговите излъчвания на радиата. За да се проучва сходен поток е задоволително потреблението на повтаряем буфер с малко по-голям от джингъла размер. Входният поток запълва буфера и откакто бъде напълнен се започва теста за крос-корелацията. Ако нищо не бъда открито, най-старата част на буфера се отстранява. След това той се запълва още веднъж.

Експериментите демонстрират, че най-хубави резултати се получават когато размерът на буфера е 1,5 пъти по-голям от размера на джингъла.
Обединяваме всичко на едно място
Да се преобразува радио стрийма в PCM формат също не е комплицирано. Това още веднъж може да стане благодарение на ffmpeg. Показаната по-долу команда трансферира аудиопотока към общоприетия Java вход и по-късно извежда Got jingle 0 или Got jingle 1, когато в потока бъде открит съответния пример.
ffmpeg -loglevel -8 -i http://stream3.polskieradio.pl:8904/;stream -f s16le -acodec pcm_s16le - | java -jar target/analyzer-1.0.0-SNAPSHOT-jar-with-dependencies.jar 2 src/test/resources/commercial-start-44.1k.raw 500 src/test/resources/commercial-end-44.1k.raw 700 Автономната версия
Вече е подготвена несложна самостоятелна версия на анализатора, която независимо се включва към потока на „Тройката (без да се употребява външен ffmpeg), като резултатът се извежда благодарение на javax.sound. Всичко е събрано единствено в един JAR и съдържа напълно базов интерфейс с бутони Start и Stop. Файлът може да бъде изтеглен отсам. А в случай че не обичате да пускане на своите устройства непознати jar файлове (което е напълно правилно), то можете да вземете сорс кодовете от GitHub.



Изглежда, че всичко работи както би трябвало.
Следващи цели
Крайната цел е да се сътвори неголямо хардуерно устройство, което може да изключва рекламата от ефирните излъчвания, а освен от интернет потоците. Това се изяснява в идната публикация.

Програмата на Томек Рекавек за блокиране на рекламата в другите аудио потоци, както и хардуерния блокатор на реклами за случаен аудиосигнал, провокираха извънреден интерес измежду потребителите, който не стихва и до през днешния ден. Простотата на логаритъма и неговата напълно лесна реализация повдигнаха забавни въпроси по отношение на основаването на сходни блокатори освен за радио, само че и за телевизионните излъчвания. При това освен за блокиране на звука, само че и на изображението по време на рекламния блок.

Обсъждане на тематиката в Hacker News
Разглеждане на тематиката във Wykop
Обсъждане на тематиката в Reddit
Източник: kaldata.com

СПОДЕЛИ СТАТИЯТА


Промоции

КОМЕНТАРИ
НАПИШИ КОМЕНТАР