¿Alguien sabe de un filtro para atenuar la no voz? Estoy escribiendo un software de reconocimiento de voz y me gustaría filtrar todo menos el habla humana. Esto incluiría ruido de fondo, ruido producido por un micrófono sucio o incluso música de fondo. Ya he implementado un filtro de primer orden que compensa la caída de 6 dB del espectro de potencia, pero todavía escucho ruido (aunque el discurso suena mucho más claro). Pensé en usar un filtro de paso bajo, pero tengo dudas de hacerlo por dos razones:
No sé si un prefiltro de paso bajo interferirá o no con el resto del procesamiento del habla. Aunque el oído humano solo puede detectar sonidos inferiores a 20 kHz, no quiero arriesgarme a eliminar los armónicos de orden superior que puedan ser necesarios para procesar el discurso (aunque no sé si este es el caso o no). No quiero correr ningún riesgo).
Entiendo que la excitación de ciertas consonantes (como f, h y s) son casi completamente ruido blanco. No quiero implementar un filtro de ruido que elimine el buen ruido, por así decirlo.
Idealmente, me gustaría quedarme solo con el discurso de la persona que habla por el micrófono. Si tiene alguna idea, o hay algo que me falta, hágamelo saber. ¡Muy apreciado!
fuente
Respuestas:
Un canal de comunicación de voz como se usa en telefonía generalmente tiene una respuesta de frecuencia de 300 Hz a 3 kHz. Aunque esto rechaza gran parte de la energía en el habla normal, la inteligibilidad sigue siendo bastante buena: el problema principal parece ser que ciertas consonantes plosivas , por ejemplo, "p" y "t", pueden ser un poco difíciles de discriminar sin los componentes de frecuencia más alta .
Por lo tanto, probablemente esté buscando un "punto óptimo" en algún lugar entre el uso del ancho de banda completo de 20 Hz - 20 kHz que generalmente se encuentra en el audio del consumidor y el filtrado más agresivo utilizado para las comunicaciones de voz (ver arriba). Sugeriría comenzar con un filtro de paso de banda de, digamos, 50 Hz a 8 kHz. Probablemente solo mejorará la SNR en unos pocos dB en el mejor de los casos, pero puede ayudar, especialmente si tiene mucho ruido de fondo de alta frecuencia.
fuente
Usar un filtro de banda de paso que coincida con el ancho de banda del discurso ayudará.
Si tiene varios micrófonos (como ahora es el caso en los teléfonos celulares), existe una gran cantidad de métodos similares a ICA que pueden aprovechar eso, pero su pregunta me sugiere que solo tiene una entrada.
Lo que quiere hacer es "separación de fuente con un micrófono" (nombre tomado del innovador artículo de Roweis), también llamado "sensor único". Advertencia: esto está lejos de ser un problema resuelto, y toda la investigación en este campo es muy reciente, sin ningún algoritmo o enfoque que sea un "claro ganador" (a diferencia de los modelos de mezcla gaussiana + FST han sido para el reconocimiento de voz).
Un buen marco para hacerlo es a través del filtrado de Wiener. Ver Benaroya et al. "Separación de fuente de sensor único basada en el filtrado de Wiener y STFT de múltiples ventanas" (Lea las secciones 1 y 2, no se moleste con la resolución múltiple a menos que realmente la necesite). En resumen, calcula el STFT de su señal, y para cada cuadro STFT, intenta obtener estimaciones del espectro de voz y del espectro de ruido, y utiliza el filtrado de Wiener para recuperar la mejor estimación del espectro de voz a partir de esto (esto es similar a "enmascarar suavemente" el espectro).
Su problema ahora es el siguiente: dado un marco STFT, calcule el habla y el componente de ruido a partir de él. El enfoque más simple descrito en el artículo de Benaroya es a través de la cuantificación vectorial: tome varias horas de discurso por parte de muchos oradores, calcule el STFT, ejecute LBG para encontrar un libro de códigos de 512 o 1024 cuadros de voz típicos; haz lo mismo para el ruido. Ahora, dado un marco de su señal de entrada, proyecte de manera no negativa (se describe un procedimiento de actualización de gradiente multiplicativo en el documento) en las bases de voz y ruido, y obtendrá sus estimaciones de voz y ruido. Si no desea lidiar con la proyección no negativa, simplemente use el vecino más cercano. Esto es realmente lo más simple que podría funcionar en el departamento de "separación de fuente de sensor único".
Tenga en cuenta que un sistema de reconocimiento de voz podría proporcionar alguna entrada para un sistema de separación. Realice un primer paso de decodificación con su sistema de reconocimiento de voz. Para cada cuadro, tome el vector MFCC medio del gaussiano que obtuvo la mejor puntuación. Invierta eso nuevamente en un espectro. Boom, tiene una máscara que le brinda la ubicación espectral más probable de los bits de voz, y puede usarla como entrada para el filtrado de Wiener. Esto suena un poco como agitar las manos, pero lo importante es que para separar una fuente se necesita un buen modelo, y un sistema de reconocimiento de voz tomado al revés es un excelente modelo generativo para señales de voz.
fuente
Probablemente debería considerar hacer un Análisis de Componentes Independientes (ICA) ya que su problema es muy similar al problema de "cóctel" que a menudo se usa para describir ICA. En resumen, ICA encuentra los componentes de su señal que son independientes entre sí. Esto supone que otro ruido en el entorno (lavavajillas, ruido blanco, zumbido del ventilador) será independiente de la fuente de señal de la voz y puede separarse.
ICA es similar a PCA (análisis de componentes principales) pero en lugar de maximizar la varianza en los ejes principales, maximiza la independencia. Hay muchas implementaciones de ICA que deberían conectarse al entorno de codificación que esté utilizando.
fuente