El reconocedor no necesita oír tu teclado, el aire acondicionado ni los tres segundos de silencio mientras piensas.
Voice Type usa un detector de actividad de voz Silero en streaming para decidir qué partes del flujo del micrófono son voz. Todo lo que viene después, incluida la duración de cada lote y el momento en que se ejecuta el modelo, se deriva de lo que marca esa puerta.
Una corrección. Una versión anterior de esta página decía que Voice Type usaba RNNoise. No lo usa, y nunca lo usó. La app nunca ha incluido RNNoise, y la afirmación era errónea cuando la publicamos. La puerta es Silero, y los ajustes de abajo son los que realmente se incluyen. Si has llegado aquí buscando RNNoise, la siguiente sección es para ti.
RNNoise, y por qué no es la puerta
RNNoise es una red neuronal recurrente para la supresión de ruido, publicada por Xiph.Org y liberada bajo una licencia BSD. Es pequeña, rápida y realmente buena en lo que hace: toma voz con ruido y devuelve voz más limpia. Viene incluida en mucho software de voz, y la versión que más gente conoce es la que se integra con OBS.
La razón por la que no está en Voice Type es que la supresión de ruido y la detección de actividad de voz son trabajos distintos.
- La supresión de ruido cambia el audio. Atenúa lo que considera ruido y deja pasar el resto, de modo que la señal que se entrega a las etapas siguientes no es la señal que se capturó.
- La detección de actividad de voz no cambia nada. Lee el audio y marca qué tramos contienen voz. El reconocedor sigue recibiendo las muestras originales.
RNNoise sí expone una probabilidad de actividad de voz como subproducto de la supresión que realiza, y por eso aparece en las búsquedas de un VAD. Usar esa salida como puerta significa ejecutar un supresor que no quieres para obtener una señal que no es su propósito principal. Silero es un detector, así que hace el trabajo de detección directamente y deja el audio intacto.
Esa distinción importa más para el dictado que para una llamada. En una llamada, el objetivo es un audio que suene más limpio, y que un supresor elimine algo de voz real junto con el ventilador es una contrapartida aceptable porque quien escucha rellena el hueco. Un reconocedor no rellena el hueco. Transcribe lo que se le da, así que el audio alterado antes del reconocimiento puede costar precisión justo en las consonantes que a un supresor le resultan más difíciles de distinguir del ruido.
Si buscas un umbral de VAD para RNNoise, el valor depende del envoltorio que uses, ya que RNNoise devuelve una probabilidad entre 0 y 1 y cada integración elige su propio punto de corte. Como referencia, los números equivalentes en la puerta Silero de esta app son 0,30 para mantenerse en voz y 0,22 para entrar en ella, y el razonamiento detrás de ambos valores está en la sección de abajo. Esos números son de Silero, no de RNNoise, y no se trasladan directamente.
RNNoise es un buen software. Resuelve un problema que nosotros no tenemos.
Resumen
- La segmentación decide lo que recibe el reconocedor. Un modelo al que se le da silencio devuelve texto igualmente, porque devolver texto es lo que hace.
- La puerta funciona con tramas de 512 muestras a 16 kHz, con un umbral de voz de 0,30.
- Las regiones de voz reciben 1.000 ms de pre-roll en la primera frase y luego 150 ms a cada lado, para que las palabras no se recorten en el límite.
- Un lote de menos de 5 segundos nunca se envía en una pausa. Espera a la siguiente frase.
Por qué la segmentación, y no el modelo, fija el techo de precisión
Dale al reconocedor un segmento de voz limpio y transcribirá voz. Dale tres segundos de zumbido de climatización con una palabra enterrada y el decodificador seguirá produciendo texto. El fallo parece un error del modelo y es un error de entrada.
Por eso la puerta es el componente interesante. No está para que el audio suene mejor a una persona. Está para asegurarse de que al modelo solo se le pregunte por audio que contiene una pregunta.
Los ajustes que se incluyen
Estos son los valores predeterminados actuales del modo de dictado equilibrado, que es el que se ejecuta salvo que cambies a captura sin procesar.
| Ajuste | Valor | | --- | --- | | Tamaño de trama | 512 muestras a 16 kHz | | Umbral de voz | 0,30 | | Umbral de inicio tenue | 0,22 | | Pre-roll antes de la primera frase | 1.000 ms | | Pre-roll en frases posteriores | 150 ms | | Post-roll | 150 ms | | Silencio que cierra una frase, en vivo | 400 ms | | Silencio que cierra una frase, al detener | 350 ms |
Los dos umbrales son la parte que vale la pena entender. Un único umbral tiene que ser a la vez lo bastante sensible para captar una primera sílaba suave y lo bastante estricto para ignorar un ventilador. Son trabajos distintos, así que la puerta usa una barra más baja (0,22) mientras espera a que empiece la voz y la barra normal (0,30) una vez que la voz está en curso.
El pre-roll asimétrico hace el mismo truco en el dominio del tiempo. La primera palabra de una locución es la que más a menudo se recorta, porque la puerta no tiene nada anterior con lo que trabajar, así que recibe un segundo completo de audio antes del punto de detección. Las frases posteriores solo necesitan 150 ms, porque la puerta ya te está siguiendo.
Por qué espera un lote corto
El agrupador añade regiones de voz completas y se niega a cortar una por la mitad. También se niega a enviar un lote demasiado corto para que valga la pena decodificarlo.
Si el lote actual contiene menos de 5 segundos de audio seleccionado y haces una pausa, no se envía nada. El lote sobrevive a la pausa y la siguiente frase se une a él. Es deliberado: un fragmento de 1,5 segundos decodificado por sí solo no tiene contexto a su alrededor, y los modelos de la familia Whisper usan el contexto. Dos fragmentos decodificados juntos superan a dos fragmentos decodificados por separado.
A los 5 segundos se reanudan las reglas normales: una pausa de 400 ms tras una frase cerrada vacía el lote, y también lo hace una frase que llevaría el lote más allá del objetivo de 29 segundos. Cuando sueltas el atajo, todo lo que queda se vacía sin importar la duración.
La puerta se ejecuta en un hilo de CPU para no competir nunca con el reconocedor por la GPU. Fuente: StreamingSileroSpeechGate.swift.
El camino que sigue un lote
Una vez que se vacía un lote, se acondiciona y luego se decodifica:
- Eliminar el desfase de continua (DC).
- Aplicar los filtros activos y el control de volumen, incluido un paso alto de 50 Hz por defecto.
- Remuestrear a los 16 kHz que espera Whisper, si el dispositivo de captura no estaba ya en esa frecuencia.
- Ejecutar el modelo fuera del actor principal.
- Unir el texto resultante a la transcripción, eliminando las palabras repetidas en el límite del lote.
El paso 5 importa más de lo que parece. Como los lotes se decodifican de forma independiente, la misma palabra puede aparecer al final de uno y al principio del siguiente. Las últimas palabras confirmadas también se pasan como contexto del prompt, de modo que el modelo sabe lo que acaba de decir sin volver a decodificar audio antiguo.
Cuando la puerta falla
La detección de actividad de voz también es un modelo y puede equivocarse. Si Silero falla por completo, el pipeline puede recurrir a usar el audio capturado como segmentos de reserva marcados.
Hay una excepción deliberada. Si la puerta funciona con normalidad y no informa de ninguna voz, la app no recurre a un umbral de energía. Ese es el modo de fallo en el que los ventiladores, el tecleo y el clic de la tecla de parada se convierten en una transcripción, y una transcripción falsa es peor que ninguna transcripción.
Relacionado: Por qué desactivamos el codificador de Core ML · Remuestreo a 16 kHz
