¿Cómo extraer la parte vocal de la señal de audio estéreo?

15

Ahora estoy procesando un archivo MP3 y encuentro este problema. Mi MP3 está codificado en estéreo. Lo que quiero hacer es extraer la parte vocal para su posterior procesamiento (cualquier modo de señales de salida, mono o estéreo, ambos están bien).

Hasta donde sé, el audio está codificado en diferentes bandas de subfrecuencia separadas en MP3. Creo que puedo limitar las señales al rango vocal a través del filtro de paso alto / paso bajo con la frecuencia de corte adecuada. Sin embargo, el resultado debe contener partes de señal de música pura en este caso. O después de buscar en Google, creo que puedo calcular primero las señales de fondo (invirtiendo un canal sumando con señales del otro canal suponiendo que la parte vocal esté centrada en el audio estéreo llamado cancelación de fase). Después de esta transformación, la señal es mono. Entonces debería fusionar el estéreo original en mono del cual extraer la señal de fondo.

Dada la efectividad, ¿cuál es la preferida (o cualquier otra solución :)? Si el segundo, deje dos canales A y B, ¿se utilizará (BA) o (AB) al calcular el fondo? Al igual que con la fusión de dos canales, ¿significa la aritmética lo suficientemente precisa? ¿O puedo reducir la muestra de cada canal por un factor de dos e intercalar las señales disminuidas como resultado mono?

Gracias y un saludo.

Summer_More_More_Tea
fuente

Respuestas:

21

En primer lugar, la forma en que los datos se codifican en un archivo mp3 es irrelevante para la pregunta, a menos que pretenda realizar un procesamiento de dominio comprimido (lo cual sería bastante tonto). Por lo tanto, puede suponer que su algoritmo funcionará con datos de dominio de tiempo descomprimidos.

La suma / diferencia es un truco muy, muy básico para la supresión vocal (no extracción). Se basa en la suposición de que las voces se mezclan en el centro del campo estéreo, mientras que otros instrumentos se panoramizan lateralmente. Esto rara vez es cierto. LR y RL sonarán igual (el oído humano es insensible a un cambio de fase global) y le dará una mezcla mono sin los instrumentos mezclados en el centro. El problema es que, una vez que haya recuperado el fondo, ¿qué hará con él? ¿Intenta suprimirlo de la señal central (promedio)? Esto no funcionará, estará haciendo (L + R) / 2 - (L - R), esto no es muy interesante ... Puede probar cualquier combinación lineal de esos (promediado y "centro eliminado"), nada saldrá de eso!

Con respecto a los enfoques de filtrado: el f0 de la voz rara vez supera los 1000 Hz, pero sus armónicos pueden superarlo. Eliminar la frecuencia más alta hará que las consonantes (especialmente sss, chhh) sean desagradables. Algunas voces masculinas van por debajo de 100 Hz. Sin embargo, puede cortar de forma segura lo que sea inferior a 50 o 60 Hz (bajo, patada)

Algunos desarrollos recientes en la separación de voces que vale la pena explorar:

  • Fondo de Jean Louis Durrieu NMF + armónico comb> modelo de filtro . Código de Python aquí .
  • Enfoque de extracción de fondo de Rafii . Fácil de codificar y funciona bien en música producida por computadora con patrones muy repetitivos como Electro, Hip-hop ...
  • Se acercó a Hsu basándose en la detección, seguimiento y enmascaramiento de f0. "Un algoritmo en tándem para la extracción del tono de canto y la separación de la voz del acompañamiento musical" (no puedo encontrar PDF accesible).
pichenettes
fuente
4

Gracias por la referencia! Olvidó mencionar su trabajo en la mejora de la batería , que también puede ser de interés para la aplicación Summer_More_More_Tea. Bueno, todo eso realmente depende de lo que quieras hacer con él. ¿Tiene en mente una "aplicación final" específica?

Estoy completamente de acuerdo con las declaraciones anteriores de pichenettes. Sin embargo, para completar, debo decir que la mejora vocal que mencionaste también ha sido utilizada en algunos trabajos de Matti Ryynänen, en la generación de pistas de Karaoke, para mejorar los resultados.

Para responder tu pregunta:

Dada la efectividad, ¿cuál es la preferida (o cualquier otra solución :)?

Como dijo Pichenettes, ninguno parece satisfacer su necesidad: el filtrado de paso bajo / paso alto está destinado a fallar debido a la estructura armónica de la voz humana (y más generalmente a cualquier sonido "interesante", es decir, cualquier cosa más allá de las sinusoides ... )

Si el segundo, deje dos canales A y B, ¿se utilizará (BA) o (AB) al calcular el fondo? Al igual que con la fusión de dos canales, ¿significa la aritmética lo suficientemente precisa?

Nuevamente, el segundo método que mencionas no funcionará porque solo puedes eliminar la señal que está en el centro, no recuperarla. En otras palabras, incluso las voces están en el "centro", no hay matemáticas simples para obtener una señal de solo voces.

¿O puedo reducir la muestra de cada canal por un factor de dos e intercalar las señales disminuidas como resultado mono?

er ... promediar los canales para obtener una señal monocanal, como se sugirió anteriormente, tiene sentido y no romperá las características espectrales de su señal (suponiendo que la señal estéreo no esté degenerada). Entonces obtienes una señal mono en la que tienes, básicamente, el mismo contenido musical que antes.

El muestreo correcto de cada canal significa que primero aplica un filtro de paso bajo (con una frecuencia de corte de sample_rate / 4 en su caso), y luego puede tomar de manera segura cada 2 muestras. Sin embargo, no hay mucho que decir acerca de la intercalación de los canales, por lo tanto, disminuyeron: en la mayoría de los casos generales, esto está rompiendo las características espectrales de su señal. Probablemente no quieras eso.

De hecho, la operación de filtrado de paso bajo seguido de establecer a 0 cada 2 muestras, y mantener estos cables de 0, en el dominio de Fourier, para "reflejar" los componentes de baja frecuencia que se mantuvieron en los de alta frecuencia. Recuerde que las lecciones de procesamiento de señales en la teoría de muestreo: multiplicar por una secuencia de impulsos (o diracs) da como resultado una convolución con otra secuencia de diracs en el dominio de Fourier, es decir, en ese caso, el espectro de frecuencia de la señal se repite (periodizado) a lo largo del eje de frecuencia, con un período igual a la frecuencia de muestreo.

Normalmente, al reducir la muestra, elimina los 0 (porque supone una nueva frecuencia de muestreo). Pero aquí, mantenerlos da como resultado componentes de alta frecuencia adicionales muy molestos. Intercalar estas señales no va a corregir esto.

Bueno, en general, la respuesta corta: no hagas eso . :-)

Por último, también podría sugerirle que use la GUI que desarrollé para la conferencia LVAICA 2012: hay un repositorio git para ello. Todavía lo estoy depurando y mejorando, así que los comentarios son bienvenidos: D

¡Espero que ayude!

Jean-louis Durrieu
fuente