- Mistral Voxtral Realtime 4B com um pipeline de inferência implementado apenas em C, em uma estrutura autônoma sem qualquer dependência externa
- Suporta os backends Metal GPU acceleration (MPS) e BLAS (OpenBLAS/Accelerate), e processa entrada de voz em tempo real e saída de tokens por meio de uma API de streaming
- Mantém o uso de memória constante mesmo com entradas de áudio longas usando pesos BF16 mapeados em memória, encoder baseado em sliding window e rolling KV cache
- Suporta vários modos de entrada de áudio via microfone, pipe pelo stdin e conversão com ffmpeg, além de oferecer exibição de tokens alternativos e opção de ajuste de latência (-I)
- Publicado sob a licença MIT, alcança cerca de 2,5x a velocidade de tempo real em um Apple M3 Max, permitindo uma implementação leve de reconhecimento de voz local
Visão geral do Voxtral.c
- Motor de inferência em C puro para o modelo Voxtral Realtime 4B da Mistral AI, sem dependências além da biblioteca padrão de C
- O backend MPS oferece inferência rápida, enquanto o BLAS (OpenBLAS/Accelerate) roda em ambientes baseados em CPU
- Inferência totalmente local sem runtime Python, CUDA ou vLLM
- Também inclui uma implementação de referência em Python simples no arquivo python_simple_implementation.py
- Requer apenas PyTorch, safetensors, soundfile e soxr
Principais recursos
- Zero dependencies: executa apenas com C, sem bibliotecas externas
- Aceleração com Metal GPU: ativada automaticamente em Apple Silicon, com fusão de operações na GPU e atenção em lote
- Saída em streaming: os tokens gerados são enviados imediatamente para o stdout
- Streaming C API: envia áudio sequencialmente e recebe strings de tokens em tempo real
- Pesos mapeados em memória: carrega arquivos safetensors diretamente com mmap, prontos para uso imediato
- Suporte a entrada por microfone (macOS): inclui detecção automática de silêncio
- Chunked Encoder: processa áudio em chunks sobrepostos para manter o uso de memória constante
- Rolling KV Cache: comprime automaticamente o cache com uma sliding window de 8192 posições, permitindo áudio de comprimento ilimitado
Como usar
- Comandos básicos
./voxtral -d voxtral-model -i audio.wav : reconhecimento de voz a partir de arquivo
./voxtral -d voxtral-model --from-mic : reconhecimento em tempo real via microfone (macOS)
- É possível fornecer vários formatos de áudio por meio de pipe com
ffmpeg
- Exibição de tokens alternativos
- Use a opção
--alt <cutoff> para mostrar também candidatos com pronúncia semelhante
- Quanto maior o valor de
cutoff, mais candidatos serão exibidos
- Ajuste de latência (opção -I)
- Define em segundos o intervalo de chamada do encoder
- Valores baixos (ex.: 0,5 s) significam menor latência e maior carga na GPU / valores altos (ex.: 5 s) tornam o processamento mais eficiente
- O padrão é 2,0 s; para streaming em tempo real, recomenda-se 1,0~2,0 s
Estrutura da C API
- Fornece uma API de streaming baseada em vox_stream_t
feed() : entrada de áudio
get() : recebimento de tokens
finish() : processa o áudio restante
flush() : força o processamento do buffer
vox_stream_set_alt() permite definir a quantidade de tokens alternativos
- A função
vox_transcribe() permite processamento em lote de um único arquivo
Download e configuração do modelo
- Download de aproximadamente 8,9 GB de pesos do modelo no HuggingFace
consolidated.safetensors (pesos BF16)
tekken.json (vocabulário do tokenizador)
params.json (configuração do modelo)
- Modelo sob licença Apache-2.0 e código sob licença MIT
Benchmark de desempenho
- Com base em um Apple M3 Max (GPU de 40 núcleos, 128 GB de RAM)
- Backend MPS: encoder 284 ms, decoder 23,5 ms/passo
- Backend BLAS: encoder cerca de 8 s, decoder 335 ms/passo
- Média de 31,6 ms/passo com áudio de 60 segundos, cerca de 2,5x mais rápido que tempo real
- O decoder executa toda a computação por token com uma única chamada de command buffer do Metal
Arquitetura do modelo
- Modelo de voz para texto com streaming de 4 bilhões de parâmetros (4B)
- Audio encoder: transformer causal de 32 camadas, 1280 dimensões, 32 heads, janela 750
- Adapter: Linear(5120→3072) → GELU → Linear(3072→3072)
- LLM decoder: transformer de 26 camadas (baseado em Ministral-3), 3072 dimensões, GQA (32 heads/8KV)
- Tokenizador Tekken, vocabulário de 131.072 itens
- Idiomas suportados: inglês, espanhol, francês, português, hindi, alemão, neerlandês, italiano, árabe, russo, chinês, japonês, coreano
Requisitos de memória
- Pesos do modelo: 8,9 GB (mmap sob demanda)
- Cache da GPU: cerca de 8,4 GB (após conversão de BF16 para F16)
- KV cache: até 1,8 GB (limitado pela sliding window)
- Buffer de trabalho: cerca de 200 MB
Build e plataformas
- macOS Apple Silicon:
make mps (mais rápido)
- macOS Intel / Linux (OpenBLAS) :
make blas
- Ubuntu/Debian:
sudo apt install libopenblas-dev
- Fedora:
sudo dnf install openblas-devel
Licença
- Código: MIT
- Modelo: Apache-2.0
- Em formato open source, qualquer pessoa pode modificar e redistribuir
1 comentários
Comentários do Hacker News
Eu uso STT (reconhecimento de fala) com o app open source Handy combinado com o Parakeet V3
Ainda não vi nada superar essa combinação em velocidade e precisão. A transcrição sai quase instantaneamente, e a pequena perda de precisão não chega a ser um problema graças à capacidade da IA de entender o contexto
Tentei integrar a implementação em C do Voxtral ao Handy, mas a transcrição ficou lenta demais em um MacBook M1 Max (64 GB). Pretendo testar outras implementações também
Sou fã dos projetos voxtral.c e flux2.c do Salvatore
Espero que continuem sendo otimizados como opções leves, sem dependências externas. Mas, no estado atual, ainda são lentos demais para uso real (com AMD 7800X3D/Blas)
Ao adicionar o recurso Voice Input ao llms-py, o suporte ao voxtype.io do Omarchy foi o melhor em termos de UX, seguido pelo Whisper.cpp
O OpenAI Whisper é lento, mas ainda é uma opção confiável de transcrição local
E a API Voxtral Transcription da Mistral foi impressionante em velocidade e preço — muito rápida e barata, a $0,003 por minuto. Acho que é a melhor escolha em ambientes com restrições de CPU ou disco
Agora quero testar o novo modelo de transcrição Qwen 0.6. Se os benchmarks estiverem certos, ele tem grande potencial para evoluir como uma cadeia leve considerando otimização para CPU e até quantização em 8 bits
Como também precisa ser instalável em ambientes de aluguel de servidor como a Hetzner, pretendo tentar otimizações por conjunto Intel, AMD e ARM
Dizem que o Handy tem recurso de overlay, mas no meu sistema ele não funciona
No Linux a instalação foi fácil, mas ainda não faz transcrição em tempo real como o Whisper.cpp ou o Moonshine
A opção
--from-micsó funciona no Mac, então tentei capturar áudio com ffmpeg, mas não consegui conectar a entrada do microfoneParece que meu sistema não tem capacidade suficiente para rodar o modelo padrão.
Quero testar o modelo voxtral-q4.gguf
Como consigo gravar com Audacity ou OBS Studio, acho que em tempo real também deve ser possível
Pessoalmente, eu tentaria na ordem file→ffmpeg→voxtral, depois mic→ffmpeg→file e por fim mic→ffmpeg→voxtral
O título diz que é só CPU, mas na prática também há suporte a aceleração por GPU. Isso está claramente descrito no repositório
Este projeto e a implementação do runtime em Rust estão ao mesmo tempo na página principal do HN. Uma disputa interessante
Também existe uma implementação da versão MLX → voxmlx
Tenho bastante interesse na área de speech-to-text (STT)
Quero lidar com dados que misturam vários sotaques e termos técnicos, mas não sei por onde começar para treinar um modelo com o grande volume de amostras de voz que tenho. Aceito conselhos
Testei em um MacBook Pro M3 com 16 GB, e até carrega, mas trava ou fica lento demais
Acho estranho que algo que dava para fazer com uns 200 MB há 20 anos agora exija um modelo de 9 GB