2010-09-24 8 views
5

Actualmente estoy tratando de implementar el reconocimiento de voz básico en AS3. Necesito que esto sea completamente del lado del cliente, como tal no puedo acceder a poderosas herramientas de reconocimiento de voz del lado del servidor. La idea que tenía era detectar sílabas en una palabra, y usar eso para determinar la palabra hablada. Soy consciente de que esto limitará enormemente las capacidades para el reconocimiento, pero solo necesito reconocer algunas palabras clave y puedo asegurarme de que todas tengan una cantidad diferente de sílabas.¿Detección de pico múltiple 1D?

Actualmente puedo generar una matriz 1D de nivel de voz para una palabra hablada, y puedo ver claramente, si de alguna manera la dibujo, que hay picos distintivos para las sílabas en la mayoría de los casos. Sin embargo, estoy completamente estancado en cuanto a cómo descubriría esos picos. Realmente solo necesito el conteo, pero supongo que eso viene con encontrarlos. Al principio pensé en obtener algunos valores máximos y compararlos con el promedio de valores, pero me había olvidado de ese pico que es más grande que los demás y, como tal, todos mis "picos" se ubicaron en un pico real.

Me encontré con some Matlab code que parece casi demasiado corto para ser cierto, pero no puedo mucho porque no puedo convertirlo a cualquier idioma que conozco. Intenté AS3 y C#. Entonces, me pregunto si ustedes podrían iniciarme en el camino correcto o si tenían algún seudocódigo para la detección de picos.

Respuesta

4

El código de matlab es bastante sencillo. Trataré de traducirlo a algo más pseudocódigo.

Debe ser fácil de traducir a ActionScript/C#, debe intentar esto y publicar preguntas de seguimiento con su código si se queda atascado, de esta manera tendrá el mejor efecto de aprendizaje.

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

Encontrar picos y valles de una curva tiene que ver con mirar la pendiente de la línea. En tal ubicación, la pendiente es 0. Como supongo que una curva de voz es muy irregular, primero debe suavizarse, hasta que solo existan picos significativos.

Así que como lo veo, la curva debe tomarse como un conjunto de puntos. Los grupos de puntos deben promediarse para producir una curva suave simple. Luego se debe comparar la diferencia de cada punto, y los puntos no muy diferentes entre sí se encuentran y las áreas identificadas como un pico, valles o meseta.

1

Si alguien quiere que el código final en AS3, aquí está:

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

Esta función no devuelve nada, pero si lo hiciera, no sería simplemente devolver el índice de la pico más alto, no todos los picos? – Matt

Cuestiones relacionadas