Saltar al contenido principal

De 48 kHz a 16 kHz: qué protege el remuestreo de banda limitada y dónde ocurre

Los modelos tipo Whisper esperan 16 kHz y la mayoría del hardware de Mac funciona a 48 kHz. Diezmar sin un filtro paso bajo pliega todo lo que supera los 8 kHz de vuelta a la banda de voz. Qué hace la conversión de banda limitada y por qué Voice Type pide 16 kHz directamente en la captura.

Ideas clave

respuesta primero
  • Diezmar de 48 kHz a 16 kHz sin un filtro paso bajo pliega todo lo que supera los 8 kHz de vuelta a la banda de voz.
  • La conversión de banda limitada aplica primero un filtro paso bajo a 8 kHz y luego diezma 3 a 1.
  • Voice Type pide a Core Audio directamente un flujo de entrada de 16 kHz, de modo que la conversión suele ocurrir en el controlador de audio y no en la app.
  • Cuando un dispositivo no puede entregar 16 kHz, la app convierte con AVAudioConverter al final de la cadena de acondicionamiento de cada lote.

Los modelos tipo Whisper esperan audio a 16 kHz. La mayoría del hardware de audio de Mac funciona a 48 kHz. En algún punto entre ambos tiene que producirse una conversión de frecuencia de muestreo, y si ocurre sin un filtro, introduce en la entrada del modelo energía que tu voz nunca produjo.

Resumen

  • Diezmar de 48 kHz a 16 kHz sin un filtro paso bajo pliega todo lo que supera los 8 kHz de vuelta a la banda de voz.
  • La conversión de banda limitada aplica primero un filtro paso bajo a 8 kHz y luego diezma 3 a 1.
  • Voice Type pide a Core Audio directamente un flujo de entrada de 16 kHz, de modo que la conversión suele ocurrir en el controlador de audio y no en la app.
  • Cuando un dispositivo no puede entregar 16 kHz, la app convierte con AVAudioConverter al final de la cadena de acondicionamiento de cada lote.

El enfoque ingenuo lo rompe todo

El diezmado simple, es decir, descartar dos muestras de cada tres, produce aliasing. Una captura a 48 kHz contiene contenido de hasta 24 kHz. Todo lo que supera los 8 kHz no tiene dónde ir en un flujo de 16 kHz, así que se refleja de vuelta a la banda de voz. Un tono de 10 kHz acaba en 6 kHz. El modelo oye un sonido que el hablante nunca hizo.

El remuestreo barato se optimiza para la velocidad, no para la atenuación en la banda de rechazo. Eso está bien para un tono de llamada. No está bien para el reconocimiento de voz, donde la diferencia entre “s”, “f” y “th” está justo en la región de alta frecuencia que el filtro debe proteger.

Remuestreo de banda limitada

La conversión de banda limitada significa aplicar un filtro paso bajo en la frecuencia de Nyquist de la frecuencia de destino (8 kHz para una salida de 16 kHz) y luego diezmar. Las frecuencias que producirían aliasing se eliminan antes de que puedan plegarse.

El filtro es donde está la ingeniería. Si es demasiado agresivo, pierdes el contenido de alta frecuencia que distingue las fricativas. Si es demasiado suave, el aliasing se cuela.

Dónde lo hace Voice Type

No donde lo imaginarías, y no donde lo decía una versión anterior de esta página.

La app no captura a 48 kHz para convertir al final. Pide a la Audio Queue de entrada un flujo de 16 kHz desde el principio, de modo que Core Audio realiza la conversión de frecuencia en la ruta de captura antes de que la app vea una sola muestra. El detector de actividad de voz, el agrupador de lotes y el reconocedor trabajan todos a 16 kHz. No hay ninguna etapa de 48 kHz en el pipeline en vivo.

Aun así, hay dos lugares que siguen convirtiendo dentro de la app, porque una petición es una petición y no una garantía:

  • Si el dispositivo seleccionado informa de una frecuencia distinta de 16 kHz, primero se convierte la entrada del detector de actividad de voz, porque la puerta está construida en torno a tramas de 512 muestras a 16 kHz y a nada más.
  • Cada lote vaciado pasa por una cadena de acondicionamiento que termina con un remuestreo a 16 kHz. Cuando la captura ya estaba a 16 kHz, este paso no hace nada. Cuando no lo estaba, lo gestiona AVAudioConverter, y el conversor se trata como sin estado en cada llamada para que un clip corto no arrastre artefactos de preparación del anterior.

La cadena de acondicionamiento que lo rodea, en orden: eliminar el desfase de continua (DC), aplicar los filtros y el control de volumen, y después remuestrear. Filtrar antes del cambio de frecuencia es el orden correcto, porque la frecuencia de corte del filtro paso alto se especifica en Hz y los coeficientes del filtro dependen de la frecuencia de muestreo a la que se ejecuta.

¿Por qué no grabar a 48 kHz y convertir después?

Se puede, y muchos pipelines lo hacen. Pedir la frecuencia del modelo en la capa de captura es más barato en tres aspectos: ningún búfer es tres veces mayor de lo necesario, el detector de actividad de voz no necesita una conversión previa en el camino habitual, y la conversión que sí se hace la realiza una sola vez el controlador de audio en lugar de repetirse en la app.

La contrapartida es que confías en el conversor de Core Audio en lugar de en uno propio. Es una contrapartida con la que estamos conformes. Un conversor de frecuencia de muestreo a nivel de controlador es un código muy probado, y la alternativa es mantener uno propio para resolver un problema que Apple ya resolvió.

Qué significa esto para ti

Casi nada, y ese es el objetivo. La conversión de frecuencia es un problema de corrección, no un mando de ajuste. Bien hecha es invisible, y mal hecha se nota en una transcripción que se equivoca sutilmente con las consonantes de una forma que ningún tamaño de modelo arregla.

Si estás construyendo algo similar: convierte con un conversor de banda limitada, hazlo una sola vez y hazlo después de tus filtros, no antes.

Relacionado: Detección de actividad de voz · Resumen de la tecnología