1D обнаружение множественных пиков?

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

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

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

Ответы на вопрос(3)

Решение Вопроса

псевдокодеистическое.

Это должно быть легко перевести на 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

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

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

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;
        }
    }
}

}

 Matt31 мар. 2011 г., 07:54
Эта функция ничего не возвращает, но если она это сделала, то не вернет ли она индекс самого высокого пика - не все пики?

Ваш ответ на вопрос