1D обнаружение множественных пиков? - PullRequest
5 голосов
/ 24 сентября 2010

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

В настоящее время я могу сгенерировать одномерный массив уровня голоса для произнесенного слова, и я могу ясно видеть, если я каким-то образом его рисую, что в большинстве случаев для слогов есть четкие пики. Тем не менее, я полностью застрял в том, как я узнаю эти пики. Мне нужен только счет, но я полагаю, что это связано с их поиском. Сначала я подумал о том, чтобы взять несколько максимальных значений и сравнить их со средними значениями, но я забыл об этом пике, который больше других, и поэтому все мои «пики» были расположены на одном действительном пике.

Я наткнулся на некоторый код Matlab , который выглядит почти слишком коротким, чтобы быть правдой, но я не могу этого сделать, поскольку я не могу перевести его на любой язык, который я знаю. Я пробовал AS3 и C #. Так что мне интересно, если вы, ребята, могли бы направить меня по правильному пути или у вас был какой-нибудь псевдокод для обнаружения пиков?

Ответы [ 3 ]

4 голосов
/ 25 сентября 2010

Код Matlab довольно прост.Я попытаюсь перевести это на что-то более псевдокодистское.

Это должно быть легко перевести на ActionScript / C #, вы должны попробовать это и опубликовать последующие вопросы с вашим кодом, если вы застряли, таким образомбудет иметь лучший учебный эффект.

Param: delta (defines kind of a tolerance and depends on your data, try out different values)
min = Inf (or some very high value)
max = -Inf (or some very low value)
lookformax = 1
for every datapoint d [0..maxdata] in array arr do
  this =  arr[d]
  if this > max
    max = this
    maxpos = d
  endif
  if this < min
    min = this
    minpos = d
  endif

  if lookformax == 1
    if this < max-delta
      there's a maximum at position maxpos
      min = this
      minpos = d
      lookformax = 0
    endif
  else
    if this > min+delta
      there's a minimum at position minpos
      max = this
      maxpos = d
      lookformax = 1
    endif
  endif
1 голос
/ 25 сентября 2010

Если кто-то хочет получить окончательный код в AS3, вот он:

function detectPeaks(values:Array, tolerance:int):void
{


var min:int = int.MIN_VALUE;
var max:int = int.MAX_VALUE;
var lookformax:int = 1;
var maxpos:int = 0;
var minpos:int = 0;

for(var i:int = 0; i < values.length; i++)
{
    var v:int = values[i];
    if (v > max)
    {
        max = v;
        maxpos = i;
    }
    if (v < min)
    {
        min = v;
        minpos = i;
    }

    if (lookformax == 1)
    {
        if (v < max - tolerance)
        {
            canvas.graphics.beginFill(0x00FF00);
            canvas.graphics.drawCircle(maxpos % stage.stageWidth, (1 - (values[maxpos] / 100)) * stage.stageHeight, 5);
            canvas.graphics.endFill();

            min = v;
            minpos = i;
            lookformax = 0;
        }
    }
    else
    {
        if (v > min + tolerance)
        {
            canvas.graphics.beginFill(0xFF0000);
            canvas.graphics.drawCircle(minpos % stage.stageWidth, (1 - (values[minpos] / 100)) * stage.stageHeight, 5);
            canvas.graphics.endFill();

            max = v;
            maxpos = i;
            lookformax = 1;
        }
    }
}

}

1 голос
/ 25 сентября 2010

Поиск вершин и долин кривой - это все равно, что смотреть на наклон линии.В таком месте наклон равен 0. Как я полагаю, кривая голоса очень нерегулярна, сначала ее нужно сгладить, пока не будут существовать только значительные пики.

Итак, на мой взгляд, кривая должна быть принята за набор точек.Группы точек должны быть усреднены для получения простой гладкой кривой.Затем следует сравнить различие каждой точки, и точки, не сильно отличающиеся друг от друга, обнаружены, и те области, которые определены как пик, долины или плато.

...