2010-10-18 24 views
10

Im haciendo algunas investigaciones sobre cómo comparar archivos de sonido (onda). Básicamente, quiero comparar los archivos de sonido almacenados (wav) con el sonido de un micrófono. Así que, al final, me gustaría pre-almacenar algunos comandos de voz y cuando estoy ejecutando mi aplicación me gustaría comparar los archivos pre-almacenados con la entrada desde el micrófono.¿Qué contiene un marco de audio?

Mi idea era poner un poco de margen al comparar, porque decir algo dos veces seguidas de la misma manera sería difícil, supongo.

Así que después de buscar en Google veo que python tiene este módulo llamado wave y el objeto Wave_read. Ese objeto tiene una función llamada readframes (n):

lee y vuelve a lo sumo n marcos de de audio, como una cadena de bytes.

¿Qué contienen estos bytes? Estoy pensando en recorrer los archivos de la ola un cuadro a la vez comparándolos cuadro por cuadro.

+2

Los bytes contienen datos PCM. ¿Estás tratando de hacer reconocimiento de voz? Parece que estás por encima de tu cabeza. Debes investigar este tema. – JoshD

+0

Ah, maldita sea :) Gracias por las respuestas. Podrías llamarlo reconocimiento de voz, pero la forma en que pensé fue comparar archivos simples, lo que sería mucho más simple. En mi caso, solo se trataría de hacer el mismo sonido, no de analizar e intentar interpretar las palabras – Jason94

+1

Eso es todavía reconocimiento de voz. Incluso una inflexión menor o una diferencia de velocidad en su voz va a dar datos de audio muy diferentes, por lo que no puede compararlos cuadro por cuadro. – Soviut

Respuesta

28

Un marco de audio, o muestra, contiene información de amplitud (volumen) en ese momento particular. Para producir sonido, decenas de miles de cuadros se reproducen en secuencia para producir frecuencias.

En el caso de audio de calidad CD o audio de onda sin comprimir, hay alrededor de 44,100 cuadros/muestras por segundo. Cada uno de esos cuadros contiene 16 bits de resolución, lo que permite representaciones bastante precisas de los niveles de sonido. Además, como el audio del CD es estéreo, en realidad hay el doble de información, 16 bits para el canal izquierdo, 16 bits para el derecho.

Cuando se utiliza el módulo de sonido en Python para obtener un marco, que se obtiene es una serie de caracteres hexadecimales:

  • Uno de los personajes para una señal mono de 8 bits.
  • Dos caracteres para estéreo de 8 bits.
  • Dos caracteres para mono de 16 bits.
  • Cuatro caracteres para estéreo de 16 bits.

Con el fin de convertir y comparar estos valores que tendrá que usar primero las funciones de la onda del módulo de Python para comprobar la profundidad de bits y el número de canales. De lo contrario, comparará configuraciones de calidad no coincidentes.

+1

75 cuadros por segundo? ¿No quieres decir 44100? – corvuscorax

+0

Sí, originalmente tuve eso (ver ediciones) pero se ha modificado en mí. Voy a cambiarlo a menos que quien esté editando pueda explicar su interpretación de un cuadro de audio. – Soviut

+1

podría ser un poco confuso debido al hecho de que los reproductores de CD Red Book leen 75 sectores del disco por segundo, pero eso debería ser irrelevante para los fines de esta discusión – corvuscorax

7

Una simple comparación de byte a byte casi no tiene posibilidades de una coincidencia exitosa, incluso con cierta tolerancia. El reconocimiento de patrones de voz es un problema muy complejo y sutil que aún es objeto de mucha investigación.

+1

Para agregar a esta respuesta ... el problema tiene mucho que ver con la forma en que normalmente representamos el audio digital en comparación con la forma en que percibimos el sonido. Escuchamos frecuencias y su interacción. No percibimos directamente cada subida y caída de una ola. Sin embargo, cuando capturamos audio digitalmente como PCM, solo estamos registrando mediciones de nivel de presión miles de veces por segundo. Escuchamos en el dominio de la frecuencia, pero el audio PCM está en el dominio del tiempo. Para comenzar a comparar, primero necesitamos ejecutar una transformada de Fourier para llevar nuestro audio digital al dominio de la frecuencia. – Brad

5

Lo primero que debe hacer es una transformación de Fourier para transformar los datos en sus frecuencias. Sin embargo, es bastante complejo. No usaría bibliotecas de reconocimiento de voz aquí, ya que parece que no grabas solo voces. Luego probaría diferentes cambios de tiempo (en caso de que los sonidos no estén exactamente alineados) y use el que le ofrezca la mejor similitud, donde debe definir una función de similitud. Ah, y debería normalizar ambas señales (el mismo volumen máximo).

5

Creo que la descripción aceptada es ligeramente incorrecta.

Un marco parece ser algo así como paso en formatos gráficos.Para intercalado estéreo a 16 bits/muestra, el tamaño del marco es 2*sizeof(short) = 4 bytes. Para estéreo no intercalado a 16 bits/muestra, las muestras del canal izquierdo son todas una tras otra, por lo que el tamaño del cuadro es solo sizeof(short).

+0

cómo comprobar si está intercalado o no? ¿Qué es más común? – jiggunjer

Cuestiones relacionadas