actionscript-3 math matlab graph speech-recognition

actionscript 3 - 1D detección de pico múltiple?



actionscript-3 math (3)

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 de sílabas diferente.

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 distintos 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 encontraban en un pico real.

Me encontré con un código de Matlab que parece casi demasiado corto para ser cierto, pero no puedo hacerlo porque no puedo convertirlo a ningún idioma que conozca. 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.


Encontrar picos y valles de una curva se trata de 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.

Entonces, 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.


Si alguien quiere 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; } } }

}


El código de matlab es bastante directo. 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