2010-09-24 14 views
5

Attualmente sto cercando di implementare il riconoscimento vocale di base in AS3. Ho bisogno che questo sia completamente client-side, in quanto tale non posso accedere a potenti strumenti di riconoscimento vocale lato server. L'idea che avevo era di rilevare le sillabe in una parola e usarle per determinare la parola pronunciata. Sono consapevole che questo consentirà di limitare le capacità di riconoscimento, ma ho solo bisogno di riconoscere alcune parole chiave e posso assicurarmi che abbiano tutte un numero diverso di sillabe.Rilevamento di picco multiplo 1D?

Attualmente sono in grado di generare una matrice 1D di livello vocale per una parola pronunciata e posso chiaramente vedere, se in qualche modo la disegno, che nella maggior parte dei casi vi sono picchi distinti per le sillabe. Tuttavia, sono completamente bloccato su come vorrei scoprire quelle vette. Ho davvero bisogno solo del conteggio, ma suppongo che venga fornito con loro. All'inizio ho pensato di prendere alcuni valori massimi e confrontarli con la media dei valori, ma mi ero dimenticato di quel picco che è più grande degli altri e come tale, tutti i miei "picchi" si trovavano su un picco effettivo.

Mi sono imbattuto in some Matlab code che sembra quasi troppo breve per essere vero, ma non posso farlo perché non riesco a convertirlo in nessuna lingua che conosco. Ho provato AS3 e C#. Quindi mi chiedo se voi ragazzi potreste iniziare sulla strada giusta o avere qualche pseudo-codice per il rilevamento del picco?

risposta

4

Il codice MATLAB è piuttosto semplice. Proverò a tradurlo in qualcosa di più pseudocodico.

Dovrebbe essere facile tradurre in ActionScript/C#, dovresti provare questo e postare domande di follow-up con il tuo codice se ti blocchi, in questo modo avrai il miglior effetto di apprendimento.

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

Trovare i picchi e le valli di una curva significa osservare la pendenza della linea. In una tale posizione la pendenza è 0. Come immagino che una curva della voce sia molto irregolare, deve prima essere livellata, fino a quando esistono solo picchi significativi.

Quindi come vedo io la curva dovrebbe essere presa come un insieme di punti. Gruppi di punti dovrebbero essere mediati per produrre una curva semplice e liscia. Quindi occorre confrontare la differenza di ogni punto e i punti non molto diversi tra loro e le aree identificate come un picco, valli o altipiani.

1

Se qualcuno vuole il codice finale in AS3, eccolo:

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

Questa funzione non restituisce nulla, ma se lo facesse, non sarebbe solo restituire l'indice del picco più alto - non tutti i picchi? – Matt