Есть изображения такого рода (градиент только в направлении 1D и строго параллелен):
Необходим алгоритм (целевой язык - Си, разрешено использовать только математику), который находит и расставляет границы.
Вот так:
Границы строго прямые, без наклона. Якрость каждого пиксела ЧБ 0..255.
Собственно - КАК ?
Пробовал через разности, не выходит: пороги в некторых случаях дают несколько ложных границ. А возведение в степень производной - даёт в итоге много шума...
Увеличил картинку:
А для чего это?
Можно взять 1D Sobel Filter для ряда в 1 пиксель. И где будут пики - там граница.
Или идешь sliding window с каким-то шагом, и так где ~0 - там граница.
Хотя по рисунку видно, что граница сама логику нарушает. Где-то она по середине белого. Где-то на границе.
fake.pdf
> Можно взять 1D Sobel Filter для ряда в 1 пиксель. И где будут пики - там граница.
> Или идешь sliding window с каким-то шагом, и так где ~0 - там граница.
> Хотя по рисунку видно, что граница сама логику нарушает. Где-то она по середине белого. Где-то на границе.
Не совсем ясно как выглядит этот фильтр для 1D. Видел такую матрицу: [-1,0,1] - ну тоесть это найти разницу между соседними значениями, игнорируя текущее. Тоесть производная.
Blueprint
> А для чего это?
Решаю вопросы, связянные с сегментацией речевого сигнала. Фонограмму перевёл в спектрограмму вейвлетным преобразованием. Затем посчитал энергию в каждой полосе. Проквантовал логарифм энергии на 256 значений. В итоге получилась картинка.
Теперь надо разбить слова на фонемы/слоги. Для этого надо правильно определять границы между звуками.
На самом деле, если проинвертировать картинку и вытянуть её по вертикали, то будет более нагляднее:
Это я сказал пять раз слово "КОТ". Пофонемно это : К-О-тишина-Т. Моменты перехода из одного звука в другой визуально видно. Теперь надо программно разделить.
Я не силён в обработке сигналов, но думаю, что есть готовые алгоритмы и библиотеки для такого. Слова же как-то распознают. Прогнать через FFT несколько раз.
fake.pdf
> Я не силён в обработке сигналов, но думаю, что есть готовые алгоритмы и библиотеки для такого. Слова же как-то распознают.
Готовые библиотеки в лесу в кулак не сожмёшь :) Нужно автономное решение, которое не долбится через сеть в облака и работает на ARM A7.
Сейчас ничего не нужно распознавать. Нужно поделить на звуки слова. Спектрограмма получена в вещественных коэффициентах. С этого момента работа ведётся с графическими образами.
Вейвлет-преобразование выбрал не просто так. Оно учитывает динамику речевого сигнала, что не делают Фурье и MFCC.
С помощью бпф слова распознают, но это слова произнесенные одним человеком и в одном примерно состоянии организма. Без нейросетей оно долгие десятилетия так и оставалось, несмотря на оптимизм некоторых товарищей о скором прорыве в технологиях.
А вейвлеты сводят одну нерешенную задачу, распознание звука, к другой нерешенной, распознанию образов. Человеческий глаз эти образы легко распознает, а комп - нет.
Кстати, роботы мой голос упорно не понимают, несмотря ни на какие нейросети. Не знаю почему. Возможно тут играет роль въевшаяся привычка не давать односложных ответов. На военно-морской кафедре когда-то натаскали, так и осталось. Вместо простого подтверждения или отрицания, расскажи кратко что делать намерен, чтобы имели возможность поправить, если увидят что ты понял не то. Такие привычки спасти могут не только твою жизнь, но и жизнь всех вокруг.
Zab
> Такие привычки спасти могут не только твою жизнь, но и жизнь всех вокруг.
Или совсем наоборот. Когда ты "отвечаешь" не о том, что спрашивали - тебя перестают слушать.
Der FlugSimulator
Если им что-то от меня надо и они не желают слушать, наверное им ничего не надо, на самом деле. Тогда можно ничего и не делать. "Получив приказание, не спеши его выполнять, ибо может последовать отмена".
На флоте тебе часто приказывают "репетовать". Настолько часто, что лучше репетовать не дожидаясь приказа. Все здоровее будут. Но глупые роботы такого не понимают.
Нужно, чтобы на том конце говорило. Тоесть звук в слова(грамматика) - не нужно. Нужна фонетика.
Необязательно распознавать, можно сформировать ограниченный алфавит слогов/звуков и передавать их индексы из кодовой книги.
Кодовая книга создаётся путём векторного квантования - из всех звуковых нарезок (диктор - один! Пока это -я.) определяется определённое количество новых векторов слогов/звуков, которые с заданной степенью погрешности схожи с образцами нарезки.
Всё в духе лучших традиций вокодеров MELP, LPC, Codec2 и CELP :) От 4800 бит/c до 450 бит/c.
Только у них размер фрейма фиксирован : 16 - 22.5 мс и не учитывают фонетику языка.
От того фрейм у них не больше вышеозначенного времени (до 25 мс ) и чисто в квази-стационарном режиме.
Если учесть фонетику языка и выравнять голосовые примитивы, то можно векторно заквантовать звуки русского языка и передавать разом не один фрейм до 22 мс, а группы смежных, которые создают звук. И снизить скорость передачи речевых параметров до 150 - 100 бит/c.
Gradius
Это так не работает. Образцы записать можно, но они будут очень разными для разных людей. И даже один человек если в другом состоянии, пьян, взволнован, устал, у него голос другой и с его же образцами уже не совпадает.
Без нейросетей задача распознания произвольного голоса решена не была. Распознание образов - тоже.
По гуглению audio syllables recognition, пишут всякое про нормализовать сигнал по громкости, получить явные пики и там уже будет видно.
Gradius
Тут стали говорить про распознавание речи, передачу и кодирование(сигнала)...
Может я не прав, но мне показплось, что нужно разделит речь на фонемы.
То есть не надо разделять на слоги!!! - это плохо и ничего не получится путного.
Для компиляционного фонемного синтеза речи делают так:
(для распознавания тоже справедливо...)
Разбиваются слова по гласным.
Слова(например КОТ) разбиваются - > согласная, часть гласной - оставшаяся часть гласной, согласная, или другой случай =гласная(если начало слова, или часть, если середина), согласная, гласная(часть, или целая в зависимости это середина, или конец слова).
То есть получаются трибанки. Со словами из одной двух, или трёх букв надеюсь всё понятно.
Какие есть нюансы, чтобы речь была естественной:
1. Разбивать гласную надо не по середине, а после пика, где то 2\3.
2. Разбивать надо по точкам, когда фаза переходит через ноль.
3. Ударные и безударные гласные звучат по разному, по этому должны быть экземпляры с ударными и безударными.
4. одни и те же фонемы в окончаниях и в середине слова тоже звучат по разному.
(К счастью, окончаний не так много.) Но...
5. окончания звучат по разному на знаках препинания ( (, ;) ? ! (. :) ... )
Есть ещё нюансы, но это уже касается ударений в словах, словах омографах(зАмок-замОк) и интонации, а не в разбиении.
Сейчас некогда, но могу привести примеры, но нужно ли?
Оно и так работает.
Имея набор озвученных предложений по аналогии с фонтами "съешь же ещё этих мягких французских булок, да выпей чаю", можно даже вручную всё сделать даже на Audacity. ))
Средства голосового управления уже почти 30 лет как в винду встроены. Начиная с 486х компов ресурсов для этого хватало, хотя поначалу и жалко было их на такую ерунду тратить. Но образцы должен надиктовать именно тот, кто будет командовать, другой голос оно не примет.
Всерьез распознавать любые голоса научились где-то после 2015 года, для этого требуются нейросети. Всякие эвристики, которые вы тут приводите, не работают. Не вы первые пробуете, люди десятилетиями безуспешно бились лбом о стену в этом направлении.
Применение вейвлетов я тоже когда-то пробовал, когда впервые о них узнал. Оно хорошо работает только если в качестве распознающей компоненты использовать человека, наш мозг хорошо ищет закономерности в таких картинках. Но для компа опять таки нужны нейросети, чтобы такую задачу решать. Эвристики не работают. Нет одного образца для одного слога, к примеру, если он произносится разными людьми. Какие-то закономерности есть, мы то их видим просто глазом, но они очень многовекторные.