¿Hay alguna forma de crear un control de ganancia automático con la API de audio web? En mi caso, estoy creando una aplicación de chat de video basada en la web que toma múltiples transmisiones de audio (personas hablando) y las reproduce. ¿Hay alguna manera de ajustar sus niveles de volumen relativos para que todos tengan aproximadamente el mismo volumen? No quiero que una persona suene muy baja mientras que otra suena muy fuerte.
GainNodes parece ser muy manual; esperan que descubras cuál debería ser el valor de ganancia. Supongo que podría ejecutar cada pista de audio a través de un nodo analizador, calcular un nivel de volumen y luego ajustar manualmente el nodo de ganancia individual de cada persona en función de eso, pero me pregunto si hay una manera más fácil de controlar la ganancia automáticamente. Gracias.
Si está creando una aplicación de chat basada en la web, el control automático de ganancia se maneja fácilmente cuando captura el audio del micrófono en primer lugar:
const stream = await navigator.mediaDevices.getUserMedia({ audio: { autoGainControl: true }, video: true });
(Tenga en cuenta que autoGainControl
está activado de forma predeterminada. No es necesario que lo habilite manualmente).
Sin embargo, si aún desea reducir el rango dinámico en la reproducción, lo que está buscando es un DynamicsCompressorNode . Esto eliminará las variaciones entre las partes ruidosas y silenciosas. Después de ese nodo, puede agregar un GainNode fijo para compensar las pérdidas en el compresor.
Los ajustes de compresión específicos que utilice son una cuestión de gustos, y existe un gran debate al respecto. Puede comenzar con un tiempo de ataque de 2 ms, un tiempo de liberación de 10 ms, una relación de 3:1, un umbral de -20 dB y quizás 6 dB de ganancia de compensación, y modificar desde allí.