Получение амплитуды (или среднеквадратичного напряжения) аудиосигнала, захваченного в C ++ с помощью wavin lib. - PullRequest
2 голосов
/ 02 апреля 2011

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

Я знаю, что с помощью wavin я могу записывать аудио.но я хочу провести анализ амплитуды в реальном времени для звукового сигнала, как это можно сделать, волна будет введена как 8-битная, моно.

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

Как это можно реализовать?если вы можете предоставить мне и другое предложение, было бы здорово.

Спасибо, заранее.

Ответы [ 2 ]

3 голосов
/ 03 апреля 2011

Нет простого способа распознать слова, потому что они в основном представляют собой последовательность фонем, которые могут различаться по времени и частоте.

Классические изолированные системы распознавания слов используют сигнал MFCC (кепстральные коэффициенты) в качестве входных данных и пытаются распознать шаблоны, используя алгоритмы HMM (скрытые марковские модели) или DTW (динамическое искажение времени).

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

Например, Инструментарий Edimburgh University предоставляет некоторые из этих инструментов (с хорошей документацией).

Если вы не хотите создавать его «с нуля» или у вас есть источник вдохновения, здесь - это (старая, но бесплатная) реализация такой системы (которая использует собственный инструментарий) с полное объяснение и практические примеры о том, как это работает.

Эта система является LVCSR (Распознавание непрерывной речи с большим словарным запасом), и вам нужна только ее часть. Если кто-то знает сокращенную словарную систему с открытым исходным кодом (например, простой IVR), это будет приветствоваться.

Если вы хотите создать базовую систему самостоятельно, я рекомендую вам использовать MFCC и DTW:

  • Для каждого целевого слова для моделирования:
    • запишите несколько экземпляров слова
    • вычислить некоторую (например, каждые 10 мс) дельта-MFCC через слово, чтобы получить модель
  • Когда вы хотите распознать сигнал:
    • вычислить некоторую дельта-MFCC этого сигнала
    • используйте DTW для сравнения этих дельта-MFCC с дельта-MFCC каждого смоделированного слова
    • вывести слово, которое подходит лучше всего (используйте порог для удаления мусора)
1 голос
/ 03 апреля 2011

Если вы просто хотите распознать несколько команд, вы можете использовать множество коммерческих и бесплатных продуктов. См. Нужны средства преобразования текста в речь и распознавания речи для Linux или В чем разница между System.Speech.Recognition и Microsoft.Speech.Recognition? или Распознавание речи на iPhone . Ответы на эти вопросы связаны со многими доступными продуктами и инструментами. Распознавание речи и понимание списка команд - очень распространенная проблема, решаемая коммерчески. Многие голосовые автоматизированные телефонные системы, которые вы вызываете, используют этот тип технологии. Та же технология доступна для разработчиков.

Наблюдая за этими вопросами в течение нескольких месяцев, я видел, что большинство вариантов для разработчиков распадаются так:

Конечно, это также может быть полезно - http://en.wikipedia.org/wiki/List_of_speech_recognition_software

...