Распознавание голоса на основе анализа сигнала / спектра

Я работаю над решением для распознавания звукового слова путем сравнения сигнала и спектра.
Чтобы декодировать аудио, я использую libavcodec и libavformat, и я использую одно справочное слово и сравниваю с другим.
Пример:

# Must return true
./vrecog --file_ref chocolat.wav --file_cmp chocolat_2.wav
# Must return false
./vrecog --file_ref chocolat.wav --file_cmp banana.wav

Мой шаг:

  1. Я положил сигнал в std::vector
  2. Я преобразую сигнал в спектр с помощью быстрого преобразования Фурье
  3. Я вычисляю [мин, макс, среднее, стандартное отклонение, дисперсию] моего спектра
  4. Я использую значения в шаге 3 для расчета коэффициента корреляции

Правильно ли рассуждение? Коэффициент всегда равен 1, и я не знаю, что я могу использовать для эффективного сравнения данных, чтобы сказать, являются ли слова одинаковыми или нет.

Это мои сюжеты:
Сигналы (шоколад, шоколад_2 и банан): шоколадный сигнал сигнал chocolat_2 банановый сигнал
Спектрум (шоколад, шоколад_2 и банан):
шоколадный спектр chocolat_2 спектр банановый спектр

Мы легко видим, что сигнал и спектр кажутся близкими для обоих слов "шоколад", но я не могу получить процентное сходство.

1 ответ

Для сигналов это обычно делается через функцию взаимной корреляции (из двух сигналов), которая очень похожа на свертку. Таким образом, это может быть математически сделано через FFT, который специально разработан, чтобы быть эффективным. После того, как вы возьмете функцию корреляции, вы можете решить, какой порог вы хотите сделать "совпадающим" и т. Д. Для получения дополнительной информации я прочитал бы по адресу: http://www.aip.de/groups/soe/local/numres/bookcpdf/c13-2.pdf так как то, о чем мы говорим, довольно тяжелая математика и преподавалась в течение нескольких недель на одном из моих курсов в колледже.

Другие вопросы по тегам