Algoritmo de comparación de voz para calificar similitudes

8

Estoy tratando de comparar 2 muestras de voz y calificarlas en similitudes. Piense en alguien que intenta repetir una frase y luego compara esos 2 archivos de audio.

Comencé implementando el algoritmo MFCC (http://en.wikipedia.org/wiki/Mel-frequency_cepstrum). Calculo los MFCC de ambas muestras de audio, lo que me da aproximadamente 500 cuadros de audio (a 10 ms cada uno, con una superposición del 30% del anterior) con 14 o más coeficientes MFCC. Entonces, una matriz de 500x14 para cada señal de audio.

Luego hago el enfoque ingenuo de simplemente diferenciar las matrices. Esto no da resultados muy prometedores. La mitad de las veces cuando comparo muestras de audio completamente diferentes (donde se hablan frases diferentes), obtengo menos diferencia que comparar el audio donde trato de repetir la misma frase. Esto es claramente al revés y no me puede dar un buen algoritmo de puntuación.

¿Cómo puedo mejorar esto? Pensé que los MFCC eran una parte realmente importante del procesamiento del habla, aunque claramente necesito hacer más con él.

Dinero joven
fuente
Hola, estoy lidiando con un problema similar, ¿cuál es el enfoque si debo comparar las voces de dos hablantes diferentes para obtener un puntaje de similitud? Además, ¿hay alguna manera de calcular directamente si los clips de audio se originan en la misma persona o no?
Amanda Cerny

Respuestas:

13

Primero, tendrá que corregir las diferencias en el tiempo. Por ejemplo, si un enunciado es "--heeelloooo ---" y el otro "hellooooooo ----" (- que representa el silencio), una comparación directa por pares de marcos MFCC mostrará diferencias simplemente porque las dos muestras no están alineadas. Puede usar la deformación dinámica del tiempo para encontrar la mejor alineación entre las dos secuencias de vectores de características y calcular la distancia correspondiente.

El segundo problema es que si las dos grabaciones no son del mismo orador, tendrá que compensar las diferencias en el timbre. ¡El MFCC de una mujer que dice "aaa" no es lo mismo que el MFCC de un orador que dice el mismo fonema! Un modelo relativamente simple para tener en cuenta las variaciones en el timbre de voz es suponer que existe una transformación lineal. Γque "mapea" los MFCC de un hablante en los MFCC de otro hablante (para ser justos, solo un pequeño subconjunto de estos transformadores modela con precisión cómo los parámetros cambiantes como edad, género, etc. "desplazan" el MFCC). Una vez que se han alineado dos grabaciones, incluso aproximadamente, puede usar un procedimiento de mínimos cuadrados para estimarΓ. Este procedimiento se conoce como normalización del altavoz o adaptación del altavoz.

Su procedimiento de comparación consistirá en los siguientes pasos. A y B son tus secuencias originales de MFCC.

  • Alinee las dos expresiones usando DTW. Esto produceA, una matriz con las observaciones de A deformado / desplazado para alinearse con las observaciones en B. Puedes parar aquí siA y B se sabe que son del mismo hablante.
  • Estima la transformación Γ que minimiza la diferencia entre ΓA y B.
  • Usa la distancia entre ΓA y B como tu métrica

Una última cosa que me viene a la mente es que debe descartar el primer coeficiente MFCC (que expresa aproximadamente el volumen de la señal) para mejorar la capacidad de su sistema para que coincida con las declaraciones pronunciadas a un nivel de volumen / grabación diferente.

pichenettes
fuente
Gracias por proporcionarme más instrucciones. Eliminé el primer valor de MFCC según su respuesta a mi pregunta anterior. Acerca del uso de DTW para alinear los enunciados: ¿se supone que esto se debe hacer cuadro por cuadro? Es decir, en mi matriz de 500x14 tengo 500 cuadros de audios de 10 ms, tanto en A como en B. ¿Usaría DTW fila por fila para hacer coincidir A con B?
YoungMoney
No estoy seguro de entender su pregunta ... Utiliza DTW para alinear los 500 vectores de A con los 500 vectores de B.
pichenettes
Lo que quiero decir es ¿debería concatenar los 500 vectores para cada A y B en un vector "largo" (con elementos de 500x14) y luego aplicar DTW? Versus aplicando DTW 500 veces en los 14 vectores de elementos. Lo primero tiene más sentido para mí según lo que he leído hasta ahora.
YoungMoney
2
El primero de hecho.
Debe
Ah Bueno parece que me voy a las carreras de nuevo
youngmoney