1P by GN⁺ 9시간전 | ★ favorite | 댓글 1개
  • 스트리밍 음성 인식을 네이티브 환경과 브라우저 모두에서 실행할 수 있는 Rust 기반 구현체로, Burn ML 프레임워크를 사용
  • 모델은 Mistral의 Voxtral Mini 4B Realtime을 기반으로 하며, WASM + WebGPU를 통해 브라우저 탭에서 완전한 클라이언트 측 추론 수행
  • Q4 GGUF 양자화 모델(2.5GB) 은 브라우저에서 실행 가능하며, SafeTensors 기반 F32 모델(9GB) 은 네이티브 환경에서 동작
  • 브라우저 제약(2GB 할당, 4GB 주소 공간, GPU 읽기 제한 등)을 해결하기 위해 샤딩, 2단계 로딩, 비동기 텐서 처리 등의 기술 적용
  • Apache-2.0 라이선스로 공개되어 있으며, HuggingFace Spaces에서 실시간 데모를 체험할 수 있음

Voxtral Mini 4B Realtime (Rust) 개요

  • Mistral의 Voxtral Mini 4B Realtime 모델Rust와 Burn ML 프레임워크로 완전 구현
    • 스트리밍 음성 인식을 로컬 및 브라우저 환경에서 실행 가능
    • 브라우저 버전은 WASM(WebAssembly)WebGPU를 활용해 클라이언트 측에서 동작
  • Q4 GGUF 양자화 모델(약 2.5GB) 은 브라우저에서 실행되며, F32 SafeTensors 모델(약 9GB) 은 네이티브 환경에서 사용
  • HuggingFace Spaces에서 실시간 데모 제공

아키텍처

  • 입력 오디오(16kHz mono)는 Mel 스펙트로그램으로 변환된 후, 인코더(32층)디코더(26층) 를 거쳐 텍스트로 변환
  • 주요 처리 단계
    • Mel 스펙트로그램 → 인코더(32층, 1280차원) → Conv 4x 다운샘플 → 어댑터(3072차원) → 디코더(GQA 32Q/8KV)
  • 두 가지 추론 경로 제공
    • F32(native): SafeTensors 기반, Burn 텐서 연산 사용
    • Q4 GGUF(native + browser): GGUF Q4_0 양자화, 커스텀 WGSL 셰이더 사용

브라우저 실행을 위한 기술적 해결

  • 브라우저 내 4B 모델 실행을 위해 5가지 제약 조건을 해결
    1. 2GB 할당 제한ShardedCursor로 다중 버퍼 읽기
    2. 4GB 주소 공간 제한 → 2단계 로딩(파싱 후 리더 해제, 이후 최종화)
    3. 1.5GiB 임베딩 테이블 → GPU Q4 임베딩 + CPU 행 조회
    4. GPU 동기 읽기 금지into_data_async().await 사용
    5. 256 워크그룹 제한 → cubecl-wgpu 패치로 커널 크기 제한

Q4 패딩 보정

  • 기본 mistral-common은 오디오를 32개의 무음 토큰으로 패딩하지만, 이는 디코더의 38개 프리픽스 중 절반만 커버
  • Q4_0 양자화 모델은 이로 인해 음성이 바로 시작되는 입력에서 오류 발생
  • 이를 해결하기 위해 패딩을 76 토큰(=38 디코더 토큰) 으로 확장해 전체 프리픽스를 무음으로 채움

빌드 및 테스트

  • 빌드 옵션
    • 기본: cargo build --release (wgpu + native-tokenizer)
    • 브라우저용: wasm-pack build --target web --features wasm
  • 테스트
    • GPU 기반 단위 및 통합 테스트 지원
    • E2E 브라우저 테스트는 Playwright + 실제 GPU 환경에서 수행
    • CI에서는 GPU가 없어 관련 테스트는 생략

모델 준비 및 샤딩

  • 브라우저의 ArrayBuffer 제한(512MB 이하)을 위해 GGUF 파일을 샤드 단위로 분할
    split -b 512m models/voxtral-q4.gguf models/voxtral-q4-shards/shard-  
    
  • 개발 서버와 E2E 테스트는 자동으로 샤드를 탐색

라이선스 및 리소스

Hacker News 의견들
  • 사람들이 관심 있다면, @antirez가 Voxtral Mini 4B의 C 구현체를 공개했음
    antirez/voxtral.c에서 확인 가능함
    나는 내 포크 버전을 만들어 CUDA 구현과 몇 가지 개선 기능을 추가 중임
    꽤 잘 작동하지만 아직 Mistral AI의 API 엔드포인트 속도에는 미치지 못함

    • 이런 추론 코드나 CUDA 구현 같은 걸 시작하려면 어떻게 공부를 시작해야 하는지 궁금함
      바로 코드를 짜는 게 아니라 관련 자료를 읽고 배워야 할 것 같은데, 참고할 만한 가이드가 있으면 좋겠음
    • 또 다른 Mistral 구현체로 mistral.rs가 있음
      차이는 잘 모르겠지만 커뮤니티 반응은 이쪽이 더 좋은 듯함
  • 데모를 써보니 Mic 버튼을 눌러 녹음 후 “Stop and transcribe” 를 눌러야 결과가 나옴
    사용자가 말한 뒤 1~2초 내에 바로 자막이 뜨는 진짜 실시간 모드로 만들 수 있을까 궁금함
    Hugging Face의 서버 데모는 GPU 기반의 8.5GB 모델로 그걸 구현하고 있음

    • 지금 속도로는 완전한 실시간은 어려움
      다만 링 버퍼 기반 UI를 만들면 비슷하게 구현 가능함
      나는 Flutter에서 Whisper를 이렇게 쓰고 있고, llama.cpp의 GGUF 추론도 Dart로 돌림
      M4 Max에서도 실시간은 아니고, Whisper는 2022년 이후 기기에서 ONNX로 거의 실시간임
      소비자 하드웨어에서는 정확도(WER) 향상보다 추론 속도가 더 중요하다고 생각함
  • 이런 온프레미스 오픈 모델이야말로 진짜 필요한 방향임
    사용자와 기업 모두 이런 형태를 선호함. Mistral이 그걸 잘 잡은 듯함

    • Mistral이 RedHat의 전환점 같은 순간을 맞을 수도 있음
      오픈 모델의 시대는 이제 더 흥미로워질 것 같음
  • 멋진 작업임. handy.computer와 연동되면 좋겠고, 스트리밍 지원 계획이 있는지도 궁금함

    • 이걸 transcribe-rs로 포팅해서 Handy에서 쓸 수 있게 하려 함
      첫 버전은 아마 스트리밍은 지원하지 않을 듯함
    • Handy를 써봤는데 이전 솔루션보다 훨씬 가볍고 깔끔한 UI였음
      덕분에 좋은 툴을 알게 되었고, 이제는 Voxtral 지원이 정말 필요하다고 느낌
  • 나는 모델에 대해 잘 모르지만 Nvidia Parakeet을 써봤는데 아주 잘 작동함
    이런 9GB짜리 모델은 실시간으로 쓰려면 GPU 메모리에 계속 올려둬야 하는지, 아니면 매번 로드해도 되는지 궁금함

    • 나도 Parakeet V3를 쓰는데, 속도와 정확도 밸런스가 최고임
      짧은 문장은 거의 즉시, 긴 문장은 1~3초 내에 변환됨
      약간의 정확도 손실은 AI와 대화하는 용도에서는 무의미함
      Handy라는 오픈소스 앱(링크)에서 Parakeet V3를 사용 중인데, C 구현체는 훨씬 느렸음
      STT에서는 속도가 UX의 핵심임
    • 나는 ollama 서버를 돌리는데 모델 로딩은 꽤 빠름
      지연은 새 모델을 불러올 때나 큰 컨텍스트를 교체할 때 생김
      대부분은 이미 모델이 로드되어 있어서 tokens per second가 주요 변수임
      여러 에이전트를 쓰는 복잡한 구조에서는 컨텍스트 교체 때문에 느려짐
      ik_llama의 프롬프트 캐싱이 이런 상황에서 속도를 높여줌
      요약하자면, 자주 모델이나 컨텍스트를 바꾸지 않는 한 가중치 로딩 지연은 큰 문제 아님
  • 브라우저 탭 하나가 2.5GB 모델을 다운로드하고 곧 삭제되는 구조가 효율적인지 의문임
    인터넷 속도나 저장공간이 싸졌다고 해도, 이런 방식은 낭비처럼 느껴짐
    클라이언트 측 연산은 좋지만, 이 정도 크기의 모델은 서버에서 돌리는 게 맞는 것 같음

    • 현재 브라우저 환경에서는 로컬 모델이 대중화되기 어려움
      하지만 LLM용 웹 API 표준이 생기면 달라질 수 있음
      브라우저가 사용자의 선호 모델과 통신해 로컬/원격 추론을 추상화하면, 사이트마다 모델을 공유할 수 있음
    • 새로운 기술에는 항상 불만이 따름
      2026년에 2.5GB 로컬 모델이 문제라면, 이제 안전하다고 할 게 뭐가 있을까 싶음
      불가능→중앙집중→로컬로 발전했는데, 그 대가가 2.5GB라면 충분히 감당 가능한 수준임
  • 브라우저에서 돌아가는 건 멋지지만, 웹사이트가 백그라운드에서 2.5GB를 다운로드하는 세상은 원치 않음

    • 나는 Gemini Nano(Chrome 내장 AI 모델)와 서버 기반 솔루션을 비교해봤음
      Nano는 로컬 스토리지에 저장되어 사이트 간 공유되므로 한 번만 다운로드하면 됨
      Mistral은 그렇지 않은 듯함
      관련 통계는 이 블로그 글에 정리되어 있음
    • 물론 웹페이지 방문 시 자동으로 다운로드되는 건 원치 않지만,
      패키지 설치나 실행파일 다운로드보다 브라우저 샌드박스 환경이 더 안전하다고 생각함
    • 이미 정적 랜딩 페이지 하나 띄우는 데도 수십 MB를 로드하는 세상임
      곧 이런 것도 익숙해질 것임 :-)
  • 내 환경(Firefox, Asahi Linux, M1 Pro)에서는 오작동
    “hello”를 말했더니 1분쯤 후에 이상한 단어들이 반복 출력됨

  • 단순한 질문인데, Mistral 같은 오픈모델이 OpenAI나 Anthropic과 비교하면 어느 정도 수준인지 궁금함
    개인용 머신에서 프라이빗하게 LLM 기능을 쓸 수 있을 정도인지,
    아니면 아직 상용 모델보다 한참 부족한 단계인지 알고 싶음

  • 흥미로운 프로젝트고, burn 프레임워크가 쓰인 것도 반가움
    하지만 Chromium 최신 버전에서 실행했더니 시스템이 멈추고 OS가 강제 종료함
    모델 다운로드 직후 VPN 연결도 끊겼는데, 대역폭 제한이 없어서 이유를 모르겠음