2010-09-24 6 views
5

Ich versuche derzeit, grundlegende Spracherkennung in AS3 zu implementieren. Ich brauche das vollständig clientseitig, so kann ich nicht auf leistungsfähige serverseitige Spracherkennungswerkzeuge zugreifen. Ich hatte die Idee, Silben in einem Wort zu erkennen und daraus das gesprochene Wort zu bestimmen. Ich bin mir bewusst, dass dies die Möglichkeiten der Anerkennung einschränken wird, aber ich muss nur ein paar Schlüsselworte erkennen und sicherstellen, dass sie alle eine unterschiedliche Anzahl von Silben haben.1D Mehrfachspitzenerkennung?

Ich bin derzeit in der Lage, eine 1D-Array von Sprachniveau für ein gesprochenes Wort zu generieren, und ich kann klar sehen, wenn es irgendwie zeichnen, dass es in den meisten Fällen deutliche Spitzen für die Silben gibt. Allerdings bin ich völlig fest, wie ich diese Spitzen herausfinden würde. Ich brauche die Zählung nur wirklich, aber ich nehme an, das kommt daher, sie zu finden. Zuerst dachte ich daran, ein paar Maximalwerte zu nehmen und sie mit dem Durchschnitt der Werte zu vergleichen, aber ich hatte den Gipfel vergessen, der größer ist als die anderen, und so befanden sich alle meine "Spitzen" auf einem tatsächlichen Peak.

Ich stolperte auf some Matlab code, die fast zu kurz, um wahr zu sein, aber ich kann nicht sehr, da ich nicht in der Lage bin, es in jede Sprache zu konvertieren, die ich kenne. Ich habe AS3 und C# ausprobiert. Ich frage mich also, ob ihr mich auf dem richtigen Weg starten könntest oder einen Pseudo-Code für die Peak-Erkennung hattest?

Antwort

4

Der Matlab-Code ist ziemlich einfach. Ich werde versuchen, es in etwas Pseudododeisch zu übersetzen.

Es sollte einfach sein, in ActionScript/C# zu übersetzen, Sie sollten dies versuchen und Folgefragen mit Ihrem Code posten, wenn Sie nicht weiterkommen, so haben Sie den besten Lerneffekt.

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

Um Spitzen und Täler einer Kurve zu finden, müssen Sie nur die Steigung der Linie betrachten. An einem solchen Ort ist die Steigung 0. Da eine Stimmkurve sehr unregelmäßig ist, muss sie zuerst geglättet werden, bis nur noch signifikante Spitzen existieren.

So wie ich es sehe, sollte die Kurve als eine Reihe von Punkten genommen werden. Gruppen von Punkten sollten gemittelt werden, um eine einfache glatte Kurve zu erzeugen. Dann sollte der Unterschied von jedem Punkt verglichen werden, und Punkte, die sich nicht sehr voneinander unterscheiden, und jene Bereiche, die als Spitze, Täler oder Plateau identifiziert wurden.

1

Wenn jemand den endgültigen Code in AS3 will, hier ist sie:

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

Diese Funktion nichts zurückliefert, aber wenn es, täte, würde es nicht nur zurück, den Index der höchster Gipfel - nicht alle Gipfel? – Matt