Pull to refresh

Comments 20

Есть какие-то веские причины, по которым вы пишите свой проект, а не участвуете в уже существующих? Например, есть CMUSphinx и Kaldi.
Да. Мне было просто интересно попробовать разобраться во всём самому! )
Плюс за труд. Очень одобряю такие статьи и уважаю тех, кто их пишет. Но есть замечания, привел некоторые ниже. Некоторые придирочные, но главное замечание в том, что автору нужно находиться хотя бы на голову выше своей статьи. Есть некоторые моменты, в которых вы описываете как это делать, но не говорите зачем (на глубоком уровне). И хромает русский язык.
Поэтому мой рассказ будет изобиловать неточностями, ошибками и разочарованиями
Честно говоря, немного расстраивает такой подход. Вроде бы здорово — человек старался, написал статью с отличной и интересной темой. Но почему бы не потратить время на повышение ее качества? Конечно, лучше заранее предупредить, чем потом слышать упреки. Но таким образом, вы сильно уменьшаете доверие к своей статье и желание ее читать. Какой же выход из этого? Просто сделать так, чтобы не было неточностей и ошибок, хотя бы свести их вероятность к минимуму. Если не уверены в каком-то предложении, изучите подробнее соответствующий материал. Да, это время, но оно будет работать на вас. И статья принесет больше пользы. По крайней мере, гораздо сильнее отразится на вашем рейтинге в положительную сторону.
Волна же, как нам известно из физики, характеризуются двумя атрибутами — амплитудой и частотой
И начальной фазой.
Для того, что бы сохранить звуковой сигнал на цифровом носителе, его необходимо разбить на множество промежутков и взять некоторое «усредненное» значение на каждом из них
Это подойдет для самого простого случая оцифровки. Но может сложиться впечатление, что АЦП работает так просто.
Фреймы являются более подходящей единицей анализа данных, чем конкретные значения сигнала, так как анализировать волны намного удобней на некотором промежутке, чем в конкретных точках.
Скорее не то, что бы удобнее, а возможность получить спектр сигнала, ограниченного фреймом. Спектр конкретной точки не очень полезен.
Мы знаем (из данных об аудиоформате), что частота звука в данной фрейме 16000hz
Имелась в виду частота дискретизации?
построим гистограмму (плотность распределения) значений сигнала фрейма
Гистограмма — верно, но плотность распределения — понятие, обычно относящееся к непрерывным сигналам. Эти понятия часто путают.
Так же к полученным значениям рекомендуется применить оконную функцию Хэмминга, что бы “сгладить” значения на границах фреймов.
главная цель — уменьшить утечку спектра
Спектр конкретной точки не очень полезен

Спектр конкретной точки очень даже полезен, но вычислить его невозможно. Спектр нестационарного сигнала, каким является речь, вообще невозможно вычислить. Его можно только приблизительно оценивать. И тут у нас есть выбор — вычислить преобразование Фурье длинного куска сигнала, что даст нам усредненный спектр этого куска и тем самым ухудшит разрешение по времени; или вычислить БПФ короткого куска, но это ухудшит разрешение по частоте. Таким образом, разрешение по времени и разрешение по частоте — это взаимно конкурирующие показатели, улучшение одного из них приводит к ухудшению другого. См. принцип неопределенности Гейзенберга. Поэтому приходится искать какие-то компромиссы.

Кроме преобразования Фурье, существуют и другие способы оценки спектра, иногда позволяющие получить лучшие результаты. Есть методы, основанные на параметрических моделях (метод Юла-Уолкера, метод Берга, ковариационный, модифицированный ковариационный метод), вейвлет-преобразование Морлета, банки специально подогнанных фильтров и др. Еще есть очень многообещающий новый метод: Sparse Time-Frequency Representations.
Почему невозможно вычислить? На всякий случай уточню, что под спектром я понимаю Фурье-образ сигнала. Принцип неопределенности просто ограничивает частотно-временную локализацию, поэтому для конечной выборки мы не можем точно указать значение частоты, а лишь параметры локализации — ее среднее и дисперсию. Но в нашем случае и не нужно этого делать. Точка в дискретном случае — это импульс умноженный на константу, поэтому ПФ точки: F{a*δ[n-b]} = a*e-iωb. Представляет ли это выражение само по себе (как спектр) большой интерес? Но оно может быть полезным, если мы рассматриваем композицию импульсов, тогда их спектр может быть получен с помощью вышеуказанной формулы.
Преобразование Фурье используется в процессе распознавания речи не как самоцель, а как метод оценки спектра сигнала. Поэтому ПФ длиной в 1 отсчет ничего не дает в плане оценки спектра, но тем не менее сам по себе мгновенный спектр — он объективно существует, хоть и неизвестен, и именно на его оценку направлены методы время-частотного анализа. И они далеко не всегда основаны на преобразовании Фурье.
В качестве примера для иллюстрации, рассмотрим сигнал {x = sin(2*pi*f1*t) при t<0, x=sin(2*pi*f2*t) при t>=0. Это нестационарный сигнал, его спектр меняется скачкообразно в точке t=0. Нам известен истинный спектр этого сигнала — он представляет собой δ(f-f1) при t<0 и δ(f-f2) при t>=0. Однако попытки «вычислить» этот спектр, имея доступ только к значениям функции x(t) не позволят найти истинный спектр точно. Всегда будут как погрешности при определении частот f1 и f2, возможна некоторая «утечка спектра», а в окрестности t=0 эта утечка достигнет максимума.
Да, я понял вас. Просто мы говорили о разных вещах. Конечно, спектральная и мгновенная частота не одно и то же.
Спасибо за комментарий. Да я действительно не являюсь профессионалом в данной области, и да — я абсолютно согласен с тем, что автор должен быть «выше» своей статьи перед тем, как начать её писать. Единственная причина, по которой я, не будучи специалистом, решился на описание данного вопроса — отсутствие во интернете (по крайней мере во обозримой мною его части) информации для «чайников» во этом вопросе.

Если вы поделитесь со мной ссылкой, где подобный материал «для начинающих» освещен лучше — я немедленно удалю эту статью :)
Что касается алгоритма распознавания — DTW совершенно не годится для дикторо-независимого распознавания, инфомации в MFCC-векторе просто недостаточно. Обычно, этот алгоритм используется для распознавания голосовых меток для одного и того же диктора. Например, голосовой набор адресной книги в телефоне. Но это только в случаях, где вычислительная мощность ограничена. Например, в Nokia Series 40. В Android для адресной книни используется GMM + грамматика, старая версия движка от Nuance. Эта же компания работает над распознаванием для Siri.

Ну и конечно же, я задам уже традиционный вопрос для этой рубрики: зачем, не являесь экспертом в этой области, вы пытаетесь что-то объяснить? Я никоим образом не связан с Яндекс, но примерно так я бы хотел видеть статьи «для начинающих».
Ещё фраза
Кто-то ратует за Скрытые Марковские Модели, кто-то — за нейронные сети...
не совсем корректна. Традиционно фонемы моделировались смесью гауссианов. Там действительно основной алгоритм — Витерби для цепей Маркова. В последнее время популярность приобрело глубокое обучение. Но в любом случае — всё это происходит на этапе распознавания фонем. На этапе моделирования языка для свободной речи обычно используют N-граммные языковые модели, где используются всё те же скрытые марковские модели.
Спасибо за статью. У вас очень хорошо получилось подать материал «для чайников», вы быстро и понятно переходите от основ цифровой обработки сигналов к собственно распознаванию речи. И пусть действительно в статье имеются неточности, она представляет большой интерес для желающих понять подходы к распознаванию речи. Думаю, из вас вышел бы хороший преподаватель.

Теперь о неточностях. Выше уже указали на некоторые из них. Я отмечу следующее:
Для того, что бы сохранить звуковой сигнал на цифровом носителе, его необходимо разбить на множество промежутков и взять некоторое «усредненное» значение на каждом из них.

Это в корне неверно. Сигнал ни в коем случае нельзя усреднять перед дискретизацией во времени. Это приведет к искажениям частотной характеристики, так как эквивалентно применению фильтра типа «скользящее среднее». На самом деле, для дискретизации сигнала необходимо взять отсчеты (мгновенные значения сигнала) через равные промежутки времени. Вся информация об уровне сигнала между взятыми отсчетами теряется. Но у нас есть теорема Котельникова, которая определенных условиях позволяет полностью восстановить сигнал, так что такое выбрасывание информации не страшно.
Вот интересно, каждый язык характеризуется своим набором произносимых звуков человеком. Звуки эти разные: например, в русском языке есть звуки, которых нет в английском (и наоборот). Можно ли проранжировать языки по трудности их распознавания? Где окажется русский язык? Где окажется английский язык?
я думаю очень много зависит от самого говорящего.
Спасибо за статью, написано хорошо и понятно. Но хотелось бы посмотреть результаты на правильном бенчмарке — насколько ваш препроцессинг (выглядит он убедительно) хорош по сравнению со state-of-the-art подходами.
Если проговаривать в распознавалку от Google четко и ясно — он понимает большинство слов. Но если натравить его на обычную речь по радио или телевидении — он ничего не может распознать. Какие-то программы могут справиться с такой задачей?
Нужна тонкая настройка модели и распознавателя. Основы распознавания речи несколько более сложны, чем описал тут автор. В первом посте я привёл ссылки на два наиболее активно развиваемых проекта. У обоих есть хорошая документация и список рассылки, куда можно задавать вопросы. В CMUSphinx можете задавать их по-русски.
Спасибо за статью. Хочу добавить зачем вообще нужны MFCC.
Как многие знают, алгоритм распознавания — это черный ящик. Что-то на входе, что-то на выходе. На вход идет вектор свойств (feature vector), а на выходе мы получаем решение алгоритма. И в задачах распознавания сложность состоит не самом алгоритме (как было сказано, алгоритмов много и они хорошо изучены), а именно в формировании вектора свойств. Вектор свойств должен быть некоторой фиксированной длины, поэтому напрямую отсчеты сигнала отправить нельзя. К тому же понятно, что по отсчетам напрямую распознать речь очень сложно — варьируется амплитуда, длительность звуков и т.д. Можно было бы отправить в алгоритм спектр. Но тут тоже возникают сложности — частот очень много, по ним сложно отличать звуки, просто каша получается. Кстати, насколько я знаю, в настоящий момент в распознавании речи распространены методы, основанные на вейвлетах, которые характеризуют сигнал и по частоте и по времени.
В общем, теперь вы можете понять, почему были разработаны кепстральные коэффициенты, как некоторый вектор, способный качественно охарактеризовать речь. Кстати, MFCC это лишь один из многих других вариантов feature vector.
Теперь возьмем в руки айфон/андроид и пройдёмся по L коллегам с просьбой продиктовать эти слова под запись. Далее поставим в соответствие (в какой-нибудь локальной БД или простом файле) каждому слову L наборов mfcc-коэффициентов соответствующих записей.

А можно ли вместо того, чтобы записывать голос коллег, синтезировать слова с помощью специальных программ- или сервисов- синтезаторов? Ведь получается слишком много слов. А вообще, скорее всего, синтезировать нужно не все слова, а отдельные сочетания букв.
Sign up to leave a comment.

Articles