9P by GN⁺ 8시간전 | ★ favorite | 댓글 1개
  • Mistral Voxtral Realtime 4B 모델을 C 언어만으로 구현한 추론 파이프라인으로, 외부 의존성이 전혀 없는 독립 실행형 구조
  • Metal GPU 가속(MPS)BLAS(OpenBLAS/Accelerate) 백엔드를 지원하며, 스트리밍 API를 통해 실시간 음성 입력과 토큰 출력을 처리
  • 메모리 매핑된 BF16 가중치, 슬라이딩 윈도우 기반 인코더, 롤링 KV 캐시로 긴 오디오 입력에서도 메모리 사용을 일정하게 유지
  • 마이크 입력, stdin 파이프, ffmpeg 변환을 통한 다양한 오디오 입력 방식 지원, 대체 토큰 표시지연 조절 옵션(-I) 제공
  • MIT 라이선스로 공개되었으며, Apple M3 Max 기준 실시간보다 약 2.5배 빠른 속도를 달성해 경량화된 로컬 음성 인식 구현 가능

Voxtral.c 개요

  • Mistral AI의 Voxtral Realtime 4B 모델을 위한 순수 C 기반 추론 엔진으로, C 표준 라이브러리 외에는 의존성이 없음
    • MPS 백엔드는 빠른 추론 속도를 제공하며, BLAS(OpenBLAS/Accelerate) 는 CPU 기반 환경에서 동작
    • Python 런타임, CUDA, vLLM 없이도 완전한 로컬 추론 가능
  • python_simple_implementation.py 파일을 통해 단순한 Python 참조 구현도 함께 제공
    • PyTorch, safetensors, soundfile, soxr만 필요

주요 기능

  • Zero dependencies: 외부 라이브러리 없이 C만으로 실행 가능
  • Metal GPU 가속: Apple Silicon 환경에서 자동 활성화, GPU 연산 융합 및 배치된 어텐션 처리
  • 스트리밍 출력: 생성된 토큰이 즉시 stdout으로 출력
  • Streaming C API: 오디오를 순차적으로 입력하고, 토큰 문자열을 실시간으로 수신
  • 메모리 매핑 가중치: safetensors 파일을 mmap으로 직접 로드, 즉시 사용 가능
  • 마이크 입력 지원(macOS) : 자동 무음 감지 기능 포함
  • Chunked Encoder: 오디오를 겹치는 청크 단위로 처리해 메모리 사용량 일정 유지
  • Rolling KV Cache: 8192 포지션 슬라이딩 윈도우로 캐시 자동 압축, 무제한 길이 오디오 처리 가능

사용 방법

  • 기본 명령어
    • ./voxtral -d voxtral-model -i audio.wav : 파일 기반 음성 인식
    • ./voxtral -d voxtral-model --from-mic : 마이크 입력 실시간 인식(macOS)
    • ffmpeg 파이프를 통해 다양한 오디오 포맷 입력 가능
  • 대체 토큰 표시
    • --alt <cutoff> 옵션으로 유사 발음 후보를 함께 표시
    • cutoff 값이 높을수록 더 많은 후보 표시
  • 지연 조절 (-I 옵션)
    • 인코더 호출 주기를 초 단위로 설정
    • 낮은 값(예: 0.5초)은 낮은 지연, 높은 GPU 부하 / 높은 값(예: 5초)은 효율적 처리
    • 기본값은 2.0초, 실시간 스트리밍에는 1.0~2.0초 권장

C API 구조

  • vox_stream_t 기반 스트리밍 API 제공
    • feed() : 오디오 입력
    • get() : 토큰 수신
    • finish() : 남은 오디오 처리
    • flush() : 버퍼 강제 처리
  • vox_stream_set_alt() 로 대체 토큰 수 설정 가능
  • vox_transcribe() 함수로 단일 파일 일괄 처리 가능

모델 다운로드 및 구성

  • HuggingFace에서 약 8.9GB의 모델 가중치 다운로드
    • consolidated.safetensors (BF16 가중치)
    • tekken.json (토크나이저 어휘)
    • params.json (모델 설정)
  • Apache-2.0 라이선스 모델, MIT 라이선스 코드

성능 벤치마크

  • Apple M3 Max (40코어 GPU, 128GB RAM) 기준
    • MPS 백엔드: 인코더 284ms, 디코더 23.5ms/스텝
    • BLAS 백엔드: 인코더 약 8초, 디코더 335ms/스텝
  • 60초 오디오 기준 평균 31.6ms/스텝, 실시간보다 약 2.5배 빠른 속도
  • 디코더는 Metal 커맨드 버퍼 단일 호출로 토큰당 전체 연산 수행

모델 아키텍처

  • 총 40억 파라미터(4B) 규모의 스트리밍 음성-텍스트 모델
    • 오디오 인코더: 32층 causal transformer, 1280차원, 32헤드, 윈도우 750
    • 어댑터: Linear(5120→3072) → GELU → Linear(3072→3072)
    • LLM 디코더: 26층 transformer (Ministral-3 기반), 3072차원, GQA(32헤드/8KV)
  • Tekken 토크나이저, 어휘 크기 131,072
  • 지원 언어: 영어, 스페인어, 프랑스어, 포르투갈어, 힌디어, 독일어, 네덜란드어, 이탈리아어, 아랍어, 러시아어, 중국어, 일본어, 한국어

메모리 요구사항

  • 모델 가중치: 8.9GB (온디맨드 mmap)
  • GPU 캐시: 약 8.4GB (BF16→F16 변환 후)
  • KV 캐시: 최대 1.8GB (슬라이딩 윈도우 제한)
  • 작업 버퍼: 약 200MB

빌드 및 플랫폼

  • macOS Apple Silicon: make mps (가장 빠름)
  • macOS Intel / Linux(OpenBLAS) : make blas
  • Ubuntu/Debian: sudo apt install libopenblas-dev
  • Fedora: sudo dnf install openblas-devel

라이선스

  • 코드: MIT
  • 모델: Apache-2.0
  • 오픈소스 형태로 누구나 수정 및 재배포 가능
Hacker News 의견들
  • 나는 오픈소스 앱 Handy와 Parakeet V3를 조합해 STT(음성 인식)를 사용하고 있음
    속도와 정확도 면에서 이 조합을 능가하는 걸 아직 못 봤음. 거의 즉시 전사되고, 약간의 정확도 손실은 AI가 맥락을 읽는 능력 덕분에 문제되지 않음
    Voxtral C 구현체를 Handy에 통합해봤지만, M1 Max MacBook(64GB)에서는 전사가 너무 느렸음. 다른 구현체들도 시도해볼 예정임

    • Handy는 훌륭하지만 STT가 실시간이 아니라 배치 처리 방식인 게 아쉬움
  • 나는 Salvatore의 voxtral.cflux2.c 프로젝트의 팬임
    외부 의존성 없이 가볍게 동작하는 옵션으로 계속 최적화되길 바람. 하지만 현재는 실제 사용엔 너무 느림 (AMD 7800X3D/Blas 환경 기준)
    llms-py의 Voice Input 기능을 추가할 때 Omarchy의 voxtype.io 지원이 UX 면에서 가장 좋았고, 그다음이 Whisper.cpp였음
    OpenAI Whisper는 느리지만 여전히 안정적인 로컬 전사 옵션임
    또 Mistral의 Voxtral Transcription API는 속도와 가격 면에서 인상적이었음 — 분당 $0.003로 매우 빠르고 저렴함. CPU나 디스크 제약이 있는 환경에서 최고의 선택이라 생각함

    • 모델 자체는 훌륭하지만 로컬 추론에는 너무 큼. Whisper medium이 품질은 낮지만 환경 적합성 면에서는 더 나음
      이제 새로 나온 Qwen 0.6 전사 모델을 테스트해보려 함. 벤치마크대로라면 CPU 전용 최적화와 8bit 양자화까지 고려한 경량 체인으로 발전할 가능성이 큼
      Hetzner 같은 서버 임대 환경에서도 설치 가능해야 하므로, Intel·AMD·ARM 세트별 최적화를 시도할 예정임
    • 나는 말하면서 동시에 전사되는 시각적 피드백이 필요함. voxtype이 그걸 지원하는지 궁금함
      Handy는 오버레이 기능이 있다고 하지만 내 시스템에서는 작동하지 않음
    • voxtype과 Whisper-base 모델 조합에 한 표 던짐. 꽤 빠르고 정확함
  • Linux에서 설치는 쉬웠지만 Whisper.cpp나 Moonshine처럼 실시간 전사는 아직 안 됨
    --from-mic 옵션이 Mac만 지원해서 ffmpeg로 오디오를 캡처해봤지만 마이크 입력 연결은 실패했음
    내 시스템이 기본 모델을 돌리기엔 사양이 부족한 듯함.
    voxtral-q4.gguf 모델을 써보고 싶음

    • Linux에서 테스트해보니 이 모델은 실시간 전사에는 너무 느림. 12분짜리 입력 파일을 처리하는 데 반나절이 걸렸음
    • 마이크뿐 아니라 모니터 포트 오디오도 캡처해서 웹 오디오를 실시간 전사로 파이프라인 처리하고 싶음
      Audacity나 OBS Studio로는 녹음이 되니, 실시간도 가능할 것 같음
    • ffmpeg로 파일에서 오디오를 읽어 voxtral로 넘기면 작동할지도 모름
      개인적으로는 file→ffmpeg→voxtral, 그다음 mic→ffmpeg→file, 마지막으로 mic→ffmpeg→voxtral 순으로 시도해볼 것 같음
  • 제목에는 CPU 전용이라고 되어 있지만, 실제로는 GPU 가속도 지원함. 저장소 설명에 명확히 나와 있음

  • 이 프로젝트와 Rust 런타임 구현체가 동시에 HN 메인에 올라와 있음. 흥미로운 경쟁 구도

  • MLX 버전 구현체도 있음 → voxmlx

  • 나는 음성-텍스트(STT) 분야에 관심이 많음
    다양한 억양과 전문 용어가 섞인 데이터를 다루고 싶은데, 내가 가진 대규모 음성 샘플 데이터로 모델을 학습하려면 어디서부터 시작해야 할지 모르겠음. 조언을 구함

  • 16GB M3 MacBook Pro에서 실행해봤는데, 로딩은 되지만 멈추거나 너무 느림

  • 20년 전에는 200MB 정도로 가능했던 일을 이제는 9GB 모델이 필요하다는 게 이상하게 느껴짐