Después de 1.2.0 hubo dos quejas que volvían una y otra vez: «escribe mal el apellido de mi compañera absolutamente siempre» y «Enhance está encendido o apagado, y no siempre quiero la misma limpieza».
1.3.0 sale hoy. Resuelve las dos y ataca la otra molestia recurrente: las transcripciones de reuniones donde cada frase de la otra persona aparece duplicada porque no llevabas auriculares.
Esto es lo que cambió.
Vocabulario personalizado
Todo motor de voz tiene un conjunto de palabras que falla de forma sistemática justo contigo: un apellido, el nombre de un producto, un acrónimo interno, el nombre de la herramienta que mencionas cuarenta veces al día. Parakeet nunca ha oído hablar de tu startup. «Claude Code» vuelve como «clod code» hasta que dejas de fijarte y lo corriges a mano cada vez.
Ajustes tiene ahora una sección Vocabulary. Cada regla es un par: lo que produce el reconocedor y lo que debería haber producido. clod code → Claude Code. kubernets → Kubernetes. La grafía correcta de un nombre en lugar de lo que el modelo creyó oír.
Los detalles que importan en la práctica:
- Coincidencia de palabra completa por defecto, para que una regla de
catnunca reescriba el interior de «category». Se desactiva para correcciones de subcadena. - Sin distinción de mayúsculas por defecto, con un interruptor por regla para cuando
APIsolo deba coincidir conAPI. - Un interruptor por regla, para aparcar una regla sin borrarla.
- Las frases de varias palabras funcionan: el lado izquierdo no tiene por qué ser un solo token.
Las reglas actúan en tres sitios, no en uno. Tus términos se pasan al reconocedor como sesgo antes de transcribir, se aplican como reemplazos sobre la transcripción en bruto después, y entran en el prompt del LLM como instrucción de preservación, para que la fase de limpieza no reescriba en silencio la grafía que acabas de corregir. Justamente por eso no llegó a lanzarse la versión ingenua de esta función: corregir un nombre y que Enhance lo parafrasee de vuelta es peor que no corregirlo.
Si dictas en agentes de programación, configura esto primero. Diez reglas con los nombres propios de tu stack eliminan la mayor parte de la edición manual.
Los modos de dictado sustituyen al interruptor de Enhance
Enhance era una casilla: limpiar el texto o no. Ese es el valor por defecto correcto y el techo equivocado: el mismo párrafo hablado debería salir distinto según a dónde vaya.
1.3.0 sustituye la casilla por un selector de modo:
- Raw — pega exactamente lo que dijiste, sin pasar por el LLM. La vía más rápida; la traducción en vivo sigue funcionando aquí.
- Cleanup — gramática, puntuación, muletillas fuera, redacción intacta. El comportamiento clásico de Enhance y sigue siendo el modo por defecto.
- Email — convierte el dictado en un correo profesional y estructurado sin inventarse un asunto o una despedida que no dijiste. Cómo queda en la práctica, en dictar correos en Mac.
- Message — mensaje de chat breve y natural.
- Bullets — reorganizado en viñetas agrupadas.
- Formal — tono formal y pulido.
- Custom — tu propia instrucción, guardada en Ajustes y aplicada a cada dictado.
Custom es el modo interesante. Es un prompt de texto libre, así que «escribe siempre en inglés británico y nunca uses rayas» o «tradúcelo al español y no pases de tres frases» son modos válidos. Todo sigue ejecutándose localmente en el modelo del dispositivo.
En todos los modos, los números, los identificadores de código, las URL, las rutas de archivo, el texto entrecomillado y tus términos de vocabulario están protegidos contra reescrituras. La reformulación debe cambiar la prosa, no los tokens que la sostienen.
Reuniones por altavoz: el problema de las líneas duplicadas
Si haces llamadas sin auriculares, los participantes remotos suenan por el altavoz del Mac y vuelven a entrar directamente por tu micrófono. Vext captura el micrófono y el audio del sistema como flujos separados, así que la misma frase se transcribe dos veces —una limpia desde el flujo del sistema y otra mala desde el micrófono— y la transcripción parece decir que repetiste todo lo que acababa de decir la otra persona.
Intentamos resolverlo en el dominio del audio dos veces. Primero con un cancelador de eco DTLN sobre CoreML y luego con el propio Voice Processing I/O de Apple. Los dos funcionan, y los dos se eliminaron: VPIO modifica el estado compartido del micrófono, así que activarlo filtra control automático de ganancia y supresión de ruido a cualquier otra app que lea ese mismo micrófono; tu voz empeora en Zoom mientras Vext graba. No es un intercambio aceptable.
La versión que salió trabaja sobre la transcripción. El audio del eco está lo bastante degradado como para romper la comparación de huellas de voz, pero dice las mismas palabras al mismo tiempo, y ambos flujos comparten el mismo reloj de la reunión. Así que el deduplicador coteja texto contra tiempo: un fragmento del micrófono cuyos tokens están mayoritariamente contenidos en un fragmento del sistema dentro de una ventana de dos segundos es eco, y se descarta. Una segunda pasada fusiona los pedacitos del mismo hablante que dejan los cortes por límite de palabra.
Además, la pasada de refinamiento offline usa ahora los embeddings de voz de los participantes remotos para identificar y eliminar el audio filtrado, con detección de solapamiento para lo que la similitud por sí sola no pilla.
Efecto neto: grabar una llamada de Zoom o Meet por los altavoces del portátil produce ahora una transcripción cercana a la que tendrías con auriculares. Los auriculares siguen siendo mejores. Simplemente ya no son obligatorios.
División de hablantes a nivel de palabra
Relacionado, y la causa estructural de toda una categoría de rarezas en las transcripciones.
La detección de actividad de voz corta el audio en fragmentos. Cuando dos personas se alternan rápido, un solo fragmento puede contener tres o cuatro turnos, y todo eso se transcribía como un bloque bajo una única etiqueta. La pasada offline corregía la atribución después, pero el texto fusionado seguía fusionado.
1.3.0 corta a nivel de token. Cada palabra reconocida lleva marca de tiempo, la línea temporal de diarización sabe quién hablaba en ese instante, y el fragmento se parte en tramos por hablante antes de llegar a la transcripción, arrastrando la etiqueta anterior para las palabras que la línea temporal no cubre. Los hablantes alternos salen como líneas separadas mientras la reunión sigue en marcha.
Reconocimiento de hablantes que no se colapsa
Tres correcciones en la identificación de hablantes, todas salidas de grabaciones reales que fallaron:
Emparejamiento uno a uno. La asignación de clústeres a perfiles era voraz, así que dos personas distintas podían coincidir con el mismo hablante conocido y fundirse en una sola identidad. Ahora es un mapeo único: un clúster, un perfil.
Perfiles de voz estables. Los embeddings se normalizan en L2 y se mezclan con una media móvil exponencial a medida que llegan muestras nuevas, en vez de sobrescribirse. Los perfiles mejoran con cada reunión en lugar de derivar hacia lo último que se grabó.
Una protección contra colapsos. Una reunión de cinco personas volvió de la pasada offline como «Yo» más una persona: el diarizador offline agrupó de menos un flujo de 590 segmentos en un único clúster y, como esa pasada es la autoritativa, borró a cuatro hablantes que la pasada en vivo había separado bien. Ahora, cuando la pasada offline da un clúster o menos en un flujo donde la pasada en vivo estableció dos o más hablantes, se conservan las etiquetas en vivo. Los hablantes sobresegmentados se pueden fusionar en la pestaña Speakers; los hablantes que borra una pasada autoritativa no se recuperan.
Atajos, reconstruidos
El sistema de atajos se reescribió desde la capa de almacenamiento. Cinco acciones tienen ahora asignaciones independientes: dictado push-to-talk, dictado manos libres, notas, reuniones y capturas de pantalla.
Asignar una combinación que ya está en uso se detecta y se resuelve, en vez de producir en silencio dos acciones sobre una misma tecla. Cualquier asignación se puede borrar con la tecla Supr o con un botón, y el grabador da feedback real mientras captura. El gestor antiguo, con sus propiedades AppStorage dispersas y su decodificación manual, ha desaparecido.
Alemán y neerlandés
La interfaz está ahora en siete idiomas: inglés, español, alemán, neerlandés, ruso, hindi y tailandés, más Auto, que sigue el idioma del sistema macOS. Se cambia en Ajustes → General; se aplica al instante, sin reiniciar.
Diseño: Liquid Glass en macOS 26
En macOS 26 Tahoe, el onboarding, la guía de bienvenida, la pantalla de licencia, la vista de carga del modelo y la píldora de grabación usan superficies nativas de Liquid Glass con tintado adaptativo. En versiones anteriores de macOS todo vuelve a los materiales previos: para ti no cambia nada.
Las curvas de animación son ahora primitivas compartidas en lugar de constantes por vista, así que las transiciones se sienten consistentes en toda la app, y los indicadores de grabación respetan el ajuste del sistema Reducir movimiento.
Estabilidad y datos
La mitad menos vistosa de la versión:
- Los trabajos de transcripción cancelados podían dejar un núcleo al 100 % de CPU. Corregido.
- Editar el título o la transcripción de una reunión mientras corría la finalización en segundo plano podía revertir tu cambio en silencio. Las escrituras son ahora actualizaciones parciales que no pisan los campos editables por el usuario.
- El procesador de texto podía destrozar texto legítimo de la transcripción al quitar muletillas: los tokens con guion y la puntuación están ahora protegidos.
- La base de datos ya no se borra a sí misma ante un cambio de esquema. Esa ruta podía destruir el historial de reuniones al actualizar; está desactivada.
- Corregidos los fallos por rangos de VAD inválidos y una condición de carrera en el nivel de audio.
- El submuestreo del audio del sistema usa
AVAudioConvertercon anti-aliasing correcto en lugar de interpolación lineal ingenua: entrada medible más limpia para el reconocedor. - El portapapeles se conserva al inyectar pegados de texto e imagen.
- El motor de audio solo se reserva cuando empieza la grabación, así que Vext en reposo ya no retiene el hardware del micrófono.
- Los títulos de reunión y las transcripciones en vivo se guardan antes de cerrar la app.
- Borrar un hablante ahora pide confirmación.
Actualizar
brew upgrade muvon/tap/vext
O descarga Vext 1.3.0 directamente. Tus reuniones, perfiles de hablante y ajustes se conservan: el interruptor de Enhance pasa a ser el modo Cleanup y tus atajos actuales migran a las nuevas asignaciones.
Todo sigue ejecutándose íntegramente en tu Mac: sin nube, sin cuenta, sin suscripción.