- transcribe.cpp es una biblioteca basada en ggml creada para integrar fácilmente varios modelos modernos de reconocimiento de voz en apps para Mac, Windows y Linux, con aceleración por GPU
- Ejecuta 16 familias de ASR y más de 60 modelos sobre Vulkan, Metal, CUDA y TinyBLAS, y soporta tanto transcripción en streaming como por lotes
- Todos los modelos se comparan numéricamente con su implementación de referencia y se les hacen pruebas de WER con miles de locuciones; los resultados de validación están publicados en el repositorio y en Hugging Face
- Puede ejecutar archivos
.binexistentes de whisper.cpp y sustituirlo en la mayoría de los usos con un rendimiento similar; también ofrece bindings oficiales para Python, JavaScript/TypeScript, Rust y ObjC/Swift - Incluso en un RK3566 de bajo consumo puede transcribir más rápido que en tiempo real, lo que permite desplegar ASR local en varios dispositivos sin enviar el audio a la nube
Limitaciones del despliegue multiplataforma de ASR
- Las opciones existentes para inferencia de ASR multiplataforma estaban, en la práctica, limitadas a whisper.cpp y ONNX
- En dispositivos Apple se puede añadir MLX, pero eso obliga a soportar dos motores y portar los modelos a cada uno
- ONNX fue útil para añadir modelos rápido a Handy, pero con ejecución solo en CPU era difícil aprovechar suficiente rendimiento
- Algunas bibliotecas que soportan varios modelos no dejan claro quién las escribe, qué nivel de pruebas tienen ni cuál es su plan de mantenimiento
- Era difícil comprobar si tenían bindings utilizables en apps reales de escritorio o móviles, si eran solo código demo, si había benchmarks o si eran más rápidas que ONNX
- A partir de la experiencia desplegando entrada por voz multiplataforma en Handy, se necesitaba un motor que cumpliera estas condiciones
- Debe permitir descargar un archivo y ejecutar inferencia de inmediato
- Debe permitir verificar que la calidad de inferencia es equivalente a la implementación de referencia
- Debe ejecutarse en GPU para obtener el máximo rendimiento
- Debe integrarse fácilmente en Handy sin bibliotecas grandes de PyTorch
- Debe funcionar en Mac, Windows y Linux
- ggml se eligió como base para implementar estos requisitos por su comunidad sólida y su forma práctica de despliegue
Modelos soportados y métodos de aceleración
- transcribe.cpp apunta a ofrecer inferencia rápida y precisa con amplio soporte de modelos
- Soporta 16 familias de ASR y más de 60 modelos, y planea añadir más
- Soporta la mayoría de los modelos de transcripción modernos publicados, aunque todavía faltan algunos
- Ofrece tanto transcripción en streaming como por lotes
- Todos los modelos soportados pueden ejecutarse con los siguientes backends de aceleración
- Vulkan
- Metal
- CUDA
- TinyBLAS
- Los benchmarks por modelo se realizaron en Fedora con CPU Ryzen 4750U + Vulkan y en un M4 Max
- El soporte de Vulkan se toma como requisito mínimo para desplegar aplicaciones de inferencia local
Implementación de referencia y validación de precisión
- A partir de la experiencia de no poder confiar plenamente en la precisión de inferencia de modelos
.onnxobtenidos en Hugging Face, todos los modelos se validaron numéricamente contra su implementación de referencia - Junto con la comparación numérica, se ejecutó una revisión completa de WER para confirmar que generan la misma salida que la implementación de referencia
- Se procesaron miles de locuciones por modelo
- Los resultados son muy cercanos o idénticos a la implementación de referencia
- Los datos de validación están publicados en el repositorio de transcribe.cpp y en la página de cada modelo dentro de la organización handy-computer en Hugging Face
Compatibilidad con whisper.cpp
- Para poder reemplazar whisper.cpp, que se usaba en Handy, se implementó una compatibilidad cercana a un reemplazo directo
- Los archivos de modelo
.binde whisper.cpp distribuidos con Handy también pueden ejecutarse en transcribe.cpp - Algunas banderas y funciones de whisper.cpp todavía no están soportadas
- Para la mayoría de los usos, la implementación de whisper es lo bastante estable y puede sustituir a whisper.cpp con un rendimiento aproximadamente similar
Bindings de lenguaje y mantenimiento
- Está escrito en C/C++ y ofrece bindings con mantenimiento oficial para poder desplegar transcripción local en varios entornos
- Python
- JavaScript/TypeScript
- Rust
- ObjC/Swift
- También se aceptan contribuciones de bindings para otros lenguajes, pero quien contribuya debe encargarse de mantener ese binding
- Las necesidades reales de Handy se reflejaron en el diseño de la biblioteca, y con base en la experiencia manteniendo Handy también se planea seguir manteniendo transcribe.cpp
- Refleja experiencia obtenida al soportar varios modelos de ASR y casos de uso reales, pero todavía hay casos no resueltos, por lo que se reciben contribuciones externas
- La versión actual es v0.1.0 y aún tiene asperezas, por lo que se pide reportar issues
ASR local que se extiende hasta dispositivos de bajo consumo
- El objetivo es facilitar la ejecución de ASR directamente en el dispositivo para reducir la necesidad de enviar audio a servicios en la nube
- Incluso en una CPU RK3566 de bajo rendimiento se puede ejecutar el modelo más rápido que en tiempo real
- Con modelos modernos se logra una velocidad de transcripción superior al tiempo real con un consumo de apenas unos watts
- Para procesar más inferencias de forma local, el proceso de desplegar y ejecutar motores de inferencia dentro de las aplicaciones debe volverse más sencillo
- transcribe.cpp no puede resolver por sí solo todo el problema del despliegue de inferencia local, pero fue desarrollado como un paso para bajar la barrera de entrada del ASR local
Apoyos que respaldaron el proyecto
- Mozilla AI, el programa BiR y Davide de Mozilla AI apoyaron el proyecto desde la etapa inicial de exploración, cuando aún no tenía una forma concreta de producto
- ggml es la base clave que hace posible desplegar aplicaciones de inferencia local
- Modal proporcionó créditos usados para las pruebas de WER y la validación con CUDA
- Blacksmith respalda parte del CI/CD que verifica los artefactos de lanzamiento
- Hugging Face proporcionó almacenamiento privado a la organización handy-computer para poder subir modelos libremente
Uso de IA en el desarrollo
- Como se consideró difícil que una sola persona escribiera desde cero en pocos meses un motor de este tamaño basado en ggml, se utilizó apoyo de IA durante el desarrollo
- El texto de presentación del proyecto no fue escrito con IA, sino que está compuesto por frases dichas o tecleadas directamente
1 comentarios
Opiniones de Hacker News
Se ve muy interesante. Sin embargo, no encontré en la documentación del modelo una función para transcribir sonidos al Alfabeto Fonético Internacional (IPA), no el significado de un idioma desconocido.
Las lenguas minoritarias con menos de 10 mil hablantes quizá nunca tengan suficientes recursos para entrenar modelos específicos por idioma. Si hubiera un modelo que pasara el habla misma a IPA sin identificar el idioma, sería de gran ayuda para lingüistas que estudian lenguas minoritarias de todo el mundo.
También hay poco material escrito, así que me gustaría crear un sistema de traducción propio, como en Proyecto Hail Mary.
La l oscura y la l clara del inglés (ball/light), o la p aspirada (pin/spin), pueden distinguir significado en otros idiomas, pero no en inglés. Me pregunto si los lingüistas quieren recibir una transcripción IPA lo más fiel posible y luego normalizarla manualmente.
Felicitaciones por el lanzamiento. Uso mucho Handy en Mac y en el teléfono, y es especialmente útil cuando el reconocimiento de voz integrado de Apple entiende mal términos de áreas específicas.
Me pregunto si sería posible recibir apoyo de una fundación para cubrir los costos de mantenimiento. Si se pudiera cobrar por este tipo de proyecto, también me gustaría saber qué organizaciones buscar y de qué manera pedir apoyo.
Quiero seguir contribuyendo al código abierto, así que cualquier lugar que apoye eso es bienvenido, especialmente organizaciones que crean en el código abierto y lo impulsen. Se puede conversar más en detalle en contact@handy.computer.
Varios sistemas de conversión de voz a texto reconocen el habla en sí con precisión, pero no soportan el flujo de trabajo que quiero. Debería poder abrir un documento, hablar y que el texto se ingrese continuamente con latencia mínima en la posición del cursor.
El método de detener la grabación y luego pegar todo de una vez no es útil; la entrada continua es lo esencial.
Me resulta más útil decir todo lo que tengo en la cabeza durante 5 a 10 minutos sobre un tema y revisarlo después, sin interrumpir el flujo de pensamiento.
Algunas apps incluso usan como contexto de transcripción el contenido que copias o estás viendo para mejorar el resultado: https://superwhisper.com/docs/common-issues/context#types-of...
Me pregunto si, como Whisper.cpp, permite ingresar contexto para mejorar mucho la precisión.
Entre los bindings para cuatro lenguajes que soporta el mantenedor, el de Python está en https://github.com/handy-computer/transcribe.cpp/tree/main/b....
Todavía no hay wheels binarios de PyPI que incluyan dependencias; la biblioteca actual de PyPI llama mediante ctypes a una biblioteca instalada por separado, pero parece que planean publicarlo en el futuro.
Lo encontré justo en el momento adecuado. He escuchado muchas veces que las herramientas de prompts incluyen síntesis de voz (TTS), y quería probarlo personalmente.
Se ve atractivo un ciclo de trabajo en el que digo en voz alta ideas extensas para convertirlas en un documento, luego lo edito y se lo envío a la IA.
Es una contribución enorme para la comunidad, y sorprende que la haya hecho una sola persona. Pensé que al final aparecería el anuncio de una ronda Series A.
Demuestra que con IA se pueden producir rápidamente resultados de baja calidad, pero también ampliar la ambición y crear algo más riguroso y duradero que antes. En lugar de integrar Transcribe.cpp directamente en una app, creo que este tipo de función debería estar disponible en todas partes a través del sistema operativo o de apps como Handy.
Algún día me gustaría distribuir correctamente libtranscribe y convertirlo en algo parecido a una biblioteca del sistema. Estabilizarlo llevará tiempo, pero creo que es posible.
Funciona mucho mejor que el transcribe-rs existente. También actualicé mi app de entrada de voz offline para que use la nueva biblioteca y la velocidad mejoró bastante: https://github.com/notune/android_transcribe_app
Es acertado el diagnóstico de que, por varias razones, la inferencia local va a aumentar, y que para que más apps la usen debe ser fácil de ejecutar y distribuir.
El hecho de que ninguna palabra del artículo haya sido escrita por IA, sino que haya salido de la boca o de los dedos, también hace que el proyecto sea más confiable y accesible.
Si lo usas con frecuencia, aprendes qué arreglos de palabras se transcriben correctamente, y eso se vuelve parte del proceso de pensamiento. Con el tiempo, el LLM y el pensamiento se entrelazan, así que este tipo de uso de IA también puede cambiar de verdad la frase final.
Me pasó algo parecido al investigar cómo operar localmente un servidor de API de transcripción. Lo que más faltaba era soporte de streaming y soporte para palabras especiales a las que dar prioridad durante el reconocimiento, así que me alegra que aquí haya streaming.
Desde que apareció whisper.cpp, lo estoy operando yo mismo en un servidor con 3090 Ti. Aunque hayan salido alternativas mejores y más rápidas, sigue funcionando sin problemas, los pesos son pequeños y es suficientemente rápido para lo que necesito.
Si lo montas en un home server local como abajo, puedes crear fácilmente una API de transcripción local. Hay que ajustar un poco los parámetros de inferencia, pero una vez definidos funciona muy bien.
MODEL="/home/user/projects/ggml-org/whisper.cpp/models/ggml-large-v3-turbo.bin"WHISPER_SERVER_BIN="/home/user/projects/ggml-org/whisper.cpp/build/bin/whisper-server""$WHISPER_SERVER_BIN" --model "$MODEL" --language en --host 127.0.0.1 --port 7812Es muy probable que el ajuste de pesos de palabras se soporte mucho más adelante, pero el streaming ya está disponible.
Ojalá alguien contribuya un buen ejemplo de servidor al codebase y también ayude a resolver problemas, o que cree un servidor robusto en otro lenguaje usando transcribe.cpp o bindings. Cuando esté listo, también estaría dispuesto a enlazarlo directamente desde el proyecto principal.