- Canal de inferencia implementado solo en lenguaje C para el modelo Mistral Voxtral Realtime 4B, con una estructura autónoma sin ninguna dependencia externa
- Compatible con los backends de aceleración GPU Metal (MPS) y BLAS (OpenBLAS/Accelerate), y procesa entrada de voz en tiempo real y salida de tokens mediante una API de streaming
- Con pesos BF16 mapeados en memoria, encoder basado en ventana deslizante y rolling KV cache, mantiene constante el uso de memoria incluso con entradas de audio largas
- Admite varios métodos de entrada de audio mediante micrófono, pipe por stdin y conversión con ffmpeg, además de ofrecer visualización de tokens alternativos y la opción de control de latencia (-I)
- Publicado bajo licencia MIT, y logra una velocidad de aproximadamente 2.5 veces más rápida que el tiempo real en un Apple M3 Max, lo que permite una implementación ligera de reconocimiento de voz local
Resumen de Voxtral.c
- Motor de inferencia en C puro para el modelo Voxtral Realtime 4B de Mistral AI, sin dependencias aparte de la biblioteca estándar de C
- El backend MPS ofrece inferencia rápida, mientras que BLAS (OpenBLAS/Accelerate) funciona en entornos basados en CPU
- Permite inferencia completamente local sin runtime de Python, CUDA ni vLLM
- También incluye una implementación de referencia simple en Python mediante el archivo python_simple_implementation.py
- Solo requiere PyTorch, safetensors, soundfile y soxr
Funciones principales
- Zero dependencies: puede ejecutarse solo con C, sin bibliotecas externas
- Aceleración GPU con Metal: se activa automáticamente en entornos Apple Silicon, con fusión de operaciones GPU y atención por lotes
- Salida en streaming: los tokens generados se imprimen de inmediato en stdout
- Streaming C API: permite ingresar audio secuencialmente y recibir cadenas de tokens en tiempo real
- Pesos mapeados en memoria: carga directamente archivos safetensors con mmap para uso inmediato
- Soporte de entrada por micrófono (macOS): incluye detección automática de silencio
- Chunked Encoder: procesa el audio en chunks superpuestos para mantener estable el uso de memoria
- Rolling KV Cache: comprime automáticamente la caché con una ventana deslizante de 8192 posiciones, lo que permite procesar audio de longitud ilimitada
Cómo usarlo
- Comandos básicos
./voxtral -d voxtral-model -i audio.wav : reconocimiento de voz basado en archivo
./voxtral -d voxtral-model --from-mic : reconocimiento en tiempo real con entrada por micrófono (macOS)
- También es posible ingresar varios formatos de audio mediante un pipe de
ffmpeg
- Visualización de tokens alternativos
- La opción
--alt <cutoff> muestra también candidatos de pronunciación similar
- Cuanto mayor sea el valor de
cutoff, más candidatos se mostrarán
- Control de latencia (opción -I)
- Configura en segundos el intervalo de llamada al encoder
- Un valor bajo (por ejemplo, 0.5 s) implica menor latencia pero mayor carga de GPU / un valor alto (por ejemplo, 5 s) permite un procesamiento más eficiente
- El valor predeterminado es 2.0 s; para streaming en tiempo real se recomiendan entre 1.0 y 2.0 s
Estructura de la API en C
- Ofrece una API de streaming basada en vox_stream_t
feed() : entrada de audio
get() : recepción de tokens
finish() : procesa el audio restante
flush() : fuerza el procesamiento del búfer
- Con vox_stream_set_alt() se puede configurar la cantidad de tokens alternativos
- La función vox_transcribe() permite procesar un archivo completo en lote
Descarga y configuración del modelo
- Descarga de aproximadamente 8.9 GB de pesos del modelo desde HuggingFace
consolidated.safetensors (pesos BF16)
tekken.json (vocabulario del tokenizador)
params.json (configuración del modelo)
- Modelo con licencia Apache-2.0 y código con licencia MIT
Benchmark de rendimiento
- Basado en Apple M3 Max (GPU de 40 núcleos, 128 GB de RAM)
- Backend MPS: encoder 284 ms, decoder 23.5 ms/paso
- Backend BLAS: encoder ~8 s, decoder 335 ms/paso
- Promedio de 31.6 ms/paso con audio de 60 segundos, aproximadamente 2.5 veces más rápido que el tiempo real
- El decoder ejecuta todas las operaciones por token con una única llamada a un command buffer de Metal
Arquitectura del modelo
- Modelo de voz a texto en streaming de 4 mil millones de parámetros (4B)
- Audio encoder: transformer causal de 32 capas, 1280 dimensiones, 32 heads, ventana de 750
- Adapter: Linear(5120→3072) → GELU → Linear(3072→3072)
- LLM decoder: transformer de 26 capas (basado en Ministral-3), 3072 dimensiones, GQA(32 heads/8KV)
- Tokenizador Tekken, tamaño de vocabulario 131,072
- Idiomas compatibles: inglés, español, francés, portugués, hindi, alemán, neerlandés, italiano, árabe, ruso, chino, japonés y coreano
Requisitos de memoria
- Pesos del modelo: 8.9 GB (mmap bajo demanda)
- Caché GPU: alrededor de 8.4 GB (tras conversión de BF16 a F16)
- KV cache: hasta 1.8 GB (limitada por la ventana deslizante)
- Búfer de trabajo: alrededor de 200 MB
Compilación y plataformas
- macOS Apple Silicon:
make mps (el más rápido)
- macOS Intel / Linux (OpenBLAS) :
make blas
- Ubuntu/Debian:
sudo apt install libopenblas-dev
- Fedora:
sudo dnf install openblas-devel
Licencia
- Código: MIT
- Modelo: Apache-2.0
- Como software de código abierto, cualquiera puede modificarlo y redistribuirlo
1 comentarios
Comentarios en Hacker News
Estoy usando STT (reconocimiento de voz) combinando la app open source Handy con Parakeet V3
Todavía no he visto nada que supere esta combinación en velocidad y precisión. La transcripción es casi instantánea, y la ligera pérdida de precisión no importa gracias a la capacidad de la IA para entender el contexto
Probé integrar la implementación en C de Voxtral en Handy, pero en una MacBook M1 Max (64GB) la transcripción era demasiado lenta. Planeo probar también otras implementaciones
Soy fan de los proyectos voxtral.c y flux2.c de Salvatore
Espero que sigan optimizándose como una opción ligera que funcione sin dependencias externas. Pero por ahora es demasiado lento para uso real (en un entorno AMD 7800X3D/Blas)
Al agregar la función Voice Input de llms-py, el soporte para voxtype.io de Omarchy fue el mejor en términos de UX, y luego quedó Whisper.cpp
OpenAI Whisper es lento, pero sigue siendo una opción confiable para transcripción local
Además, la API de transcripción Voxtral de Mistral fue impresionante en velocidad y precio — es muy rápida y barata a $0.003 por minuto. Me parece la mejor opción en entornos con limitaciones de CPU o disco
Ahora quiero probar el nuevo modelo de transcripción Qwen 0.6. Si los benchmarks son correctos, tiene mucho potencial para evolucionar como una cadena ligera considerando optimización solo para CPU y hasta cuantización de 8 bits
Como también debe poder instalarse en entornos de renta de servidores como Hetzner, planeo intentar optimizaciones por separado para Intel, AMD y ARM
Dicen que Handy tiene función de overlay, pero en mi sistema no funciona
En Linux fue fácil de instalar, pero todavía no funciona la transcripción en tiempo real como en Whisper.cpp o Moonshine
La opción
--from-micsolo es compatible con Mac, así que intenté capturar audio con ffmpeg, pero no logré conectar la entrada del micrófonoParece que mi sistema no tiene especificaciones suficientes para ejecutar el modelo predeterminado.
Quiero probar el modelo voxtral-q4.gguf
Como Audacity y OBS Studio sí pueden grabarlo, creo que en tiempo real también debería ser posible
Personalmente, creo que probaría en este orden: file→ffmpeg→voxtral, luego mic→ffmpeg→file y finalmente mic→ffmpeg→voxtral
El título dice que es solo para CPU, pero en realidad también soporta aceleración por GPU. Eso está claramente indicado en la descripción del repositorio
Este proyecto y la implementación del runtime en Rust están al mismo tiempo en la portada de HN. Es una competencia interesante
También hay una implementación de la versión MLX → voxmlx
Tengo mucho interés en el área de voz a texto (STT)
Quiero trabajar con datos que mezclen distintos acentos y terminología especializada, pero no sé por dónde empezar para entrenar un modelo con el gran volumen de muestras de voz que tengo. Busco consejos
Lo ejecuté en una MacBook Pro M3 de 16GB; carga, pero se cuelga o va demasiado lento
Se siente extraño que algo que hace 20 años podía hacerse con unos 200MB ahora requiera un modelo de 9GB