메인 콘텐츠로 건너뛰기
조회수 3

브라우저에서 도는 4B 음성인식: Voxtral Rust+WASM 구현 해부

요약

브라우저에서 도는 4B 음성인식: Voxtral Rust+WASM 구현 해부

“실시간 음성인식(STT)은 서버에서 돌린다”는 상식이 흔들리는 데모가 공개됐습니다. Mistral의 Voxtral Mini 4B Realtime순수 Rust로 구현했을 뿐 아니라, 브라우저 탭에서(클라이언트 사이드) 스트리밍 전사까지 시연했거든요.1 핵심은 Burn 기반 추론 코드에 WASM + WebGPU를 결합해 브라우저 GPU를 적극 활용했다는 점입니다. 이 글에서는 “무슨 일이 가능해졌는지”, “왜 지금 이게 의미 있는지”, 그리고 “브라우저에서 4B 모델을 굴리려면 어떤 현실 문제를 풀어야 하는지”를 쉽게 풀어봅니다.

브라우저 실시간 STT가 바꾸는 제품 전략(온디바이스 AI)

음성은 개인정보의 덩어리입니다. 회의, 상담, 병원 통화, 강의… 서버로 보내는 순간부터 “유출 가능성”과 “컴플라이언스 비용”이 따라붙죠. 그런데 브라우저에서 바로 전사하면, 음성이 애초에 밖으로 안 나갑니다. 이 한 줄이 보안팀을 설득하는 데 꽤 강력합니다.

지연 시간도 다르게 체감됩니다. 네트워크 왕복이 줄어드니 “말하고 기다리는” 느낌이 옅어지고, 특히 자막/캡션 같은 UX에서 이득이 큽니다. Mistral은 Realtime 계열이 지연을 수백 ms 수준까지 낮출 수 있는 방향임을 강조하고 있고, 라이브 전사/보이스 에이전트용으로 설계됐다고 밝힙니다.2

그리고 비용 구조가 뒤집힙니다. 서버 STT는 사용량이 늘수록 GPU 비용이 정직하게 따라옵니다. 반면 브라우저 온디바이스는 “사용자의 기기”가 일을 나눠 맡습니다. 고객센터/교육/회의록 같은 대규모 트래픽 서비스라면, 이 차이가 곧 제품의 마진이 됩니다.

“Rust로 ML 추론”이 매력적인 이유: 배포와 안정성

이번 프로젝트가 주목받는 또 하나의 이유는 언어 선택입니다. 지금까지 로컬 추론 생태계는 C/C++ 중심이었고, 성능을 위해 위험한 메모리 패턴도 감수하는 경우가 많았죠. Rust 구현은 기본적으로 메모리 안정성크로스플랫폼 배포에 강점이 있습니다.

게다가 브라우저까지 염두에 두면, Rust→WASM 흐름은 꽤 자연스럽습니다. “네이티브도 되고, 브라우저도 되는” 같은 코드베이스 전략이 가능해지니까요. 실제로 Hacker News에서도 “이런 종류의 추론 코드/커널 작업을 어떻게 시작하냐”는 질문이 나올 정도로, 많은 개발자들이 ‘모델 만드는 일’보다 ‘모델을 잘 돌리는 일’에 관심을 갖고 있습니다.3

Voxtral Mini 4B Realtime 파이프라인, 핵심만 빠르게

이 모델은 입력 오디오를 16kHz 모노로 맞춘 뒤 Mel 스펙트로그램으로 바꿔 모델에 넣습니다.1 여기까진 ASR의 익숙한 흐름이죠.

흥미로운 건 스트리밍을 염두에 둔 구조입니다. 인코더가 causal하게 설계되어 “미래 프레임을 몰래 보지 않고” 현재까지의 정보로만 처리합니다.1 덕분에 지연을 줄이고, 실시간 전사에서 중요한 “지금 말한 걸 지금 반영”하는 방향으로 맞춰집니다.

큰 흐름은 Mel 입력을 인코더가 먹고, 중간에 컨볼루션 다운샘플과 어댑터를 거친 다음, 오토리그레시브 디코더가 토큰을 뽑아 텍스트로 바꾸는 형태입니다.1 디테일은 복잡하지만, 제품 관점에서는 이렇게 이해하면 됩니다. “앞부분은 소리를 ‘언어 특징’으로 압축하고, 뒷부분이 그걸 문장으로 풀어쓴다.”

F32(9GB) vs Q4 GGUF(2.5GB): 브라우저는 결국 양자화가 답

이 구현에는 크게 두 개의 추론 경로가 있습니다.1 하나는 F32 가중치를 그대로 쓰는 방식인데, SafeTensors 기준 약 9GB라서 네이티브 환경은 몰라도 브라우저에서는 사실상 현실성이 떨어집니다.1

브라우저를 가능하게 만든 건 Q4 GGUF 경로입니다. 가중치가 약 2.5GB로 줄어들어 “다운로드는 무겁지만 불가능하진 않은” 지점으로 내려옵니다.1 여기서 끝이 아니라, WebGPU에서 성능을 내려면 단순 matmul 호출만으로는 부족할 수 있습니다. 이 프로젝트는 디퀀트(복원) + matmul을 WGSL 커스텀 셰이더로 합쳐 병목을 줄이는 방식까지 택했습니다.1

또 하나의 복병이 임베딩 테이블입니다. 원래 f32 임베딩이 약 1.5GiB급이라 메모리를 크게 압박하는데, GPU에는 Q4 임베딩을 두고 CPU는 “룩업을 위한 최소 바이트”만 유지하는 식으로 압력을 낮췄습니다.1 브라우저에서 큰 모델을 돌릴 때는, 모델 크기만 줄인다고 끝이 아니라 “어디에 무엇을 상주시킬지”가 성패를 가릅니다.

브라우저에서 4B 모델 돌릴 때 진짜로 부딪히는 벽들

데모가 멋있어도, 실무자는 이런 질문을 합니다. “그래서 우리 서비스에 붙이면 오늘 바로 되나요?” 답은 보통 “안 되는 이유부터 나온다”입니다. 이번 구현이 흥미로운 건, 그 ‘안 되는 이유’를 꽤 구체적으로 뚫고 갔다는 점입니다.1

브라우저에는 2GB 단일 할당 한계가 있어서 큰 파일을 한 덩어리 ArrayBuffer로 잡는 순간 터질 수 있습니다. 그래서 여러 버퍼(Vec<u8>)로 쪼개 가로지르는 방식으로 로딩합니다.1

4GB 주소공간 제약 때문에 “읽기→파싱→리더 해제→최종화” 같은 2단계 로딩으로 피크 메모리를 낮춥니다.1 쉽게 말해, 한 번에 다 펼쳐놓고 정리하는 게 아니라, 중간중간 치우면서 전개합니다.

WebGPU는 GPU에서 CPU로 텐서를 가져올 때 동기 readback이 막히는 규칙이 있어, 결과 읽기도 비동기로 처리해야 합니다.1 게다가 워크그룹 실행 제한 같은 GPU 제약에 맞춰 커널(예: reduce) 쪽 구현도 손봐야 했습니다.1

마지막으로 “배포 현실”도 있습니다. WebGPU는 보안 컨텍스트(HTTPS)가 필요해서 로컬 테스트도 인증서를 만들어야 하고, GGUF를 브라우저에서 받으려면 512MB 이하 샤드 분할 같은 운영 트릭이 필요합니다.1 HN 댓글에 “브라우저 탭이 2.5GB를 매번 내려받는 게 비효율적”이라는 반응이 나온 것도 이런 맥락이죠.3 결국 이 문제를 해결하려면 브라우저/OS 레벨의 “공유 캐시”나 표준 API가 나와야 한다는 의견도 함께 등장합니다.3

양자화는 ‘정확도’만이 아니라 ‘스트리밍 안정성’도 흔든다

재미있는 에피소드가 하나 있습니다. 스트리밍 전사를 위해 오디오 앞에 침묵 토큰을 붙이는 전처리가 있는데, Mel/Conv/Reshape를 거치면서 디코더 프리픽스 구간에 “침묵이 아닌 실제 음성”이 섞이는 구조적 문제가 생길 수 있었습니다.1

F32는 대충 버티는데, Q4_0 양자화는 이 프리픽스 오염에 더 민감해서 마이크처럼 “시작부터 바로 말하는 입력”에서 패딩 토큰만 찍어내는 버그가 터졌고, 해결책은 좌측 패딩을 늘려 프리픽스가 온전히 침묵으로 채워지게 맞추는 것이었습니다.1

여기서 얻는 교훈은 단순합니다. 양자화는 보통 “속도/메모리 vs 정확도”의 싸움으로 설명되지만, 실시간 시스템에서는 “전처리(패딩/청킹)와의 궁합”까지 포함해 안정성을 흔들 수 있습니다. 도입 전에 반드시 실제 입력 패턴(콜센터, 회의, 강의, 잡음 환경)으로 검증해야 합니다.

마지막으로, 한 가지 현실 체크. HN에서도 “진짜 완전 실시간 UI로 1~2초 내 자막이 찍히는가?” 같은 질문이 있었고, 현 시점 데모는 UI/버퍼링을 더 다듬어야 한다는 반응도 있었습니다.3 즉, ‘가능성’은 열렸지만 ‘상용 UX’까지는 아직 튜닝의 영역이 남아 있습니다.

시사점은 분명합니다. 이제 “브라우저에서 실시간 STT”는 기술 데모를 넘어 제품 기획의 옵션이 됐습니다. 다만 성공의 조건은 모델 선택만이 아니라, 양자화 전략, 샤딩 로더, WebGPU 커널 최적화, 그리고 스트리밍 전처리 검증까지 한 세트로 가져가는 겁니다.

“서버 비용을 줄이고, 개인정보를 덜 만지고, 지연을 낮추는” 음성 제품을 고민 중이라면, 이 Rust+WASM 구현은 좋은 기준점이 됩니다. 다음 단계는 여러분의 서비스 입력에 맞춰 정확도-지연-메모리를 직접 재는 일입니다. (그리고 가능하면, 사용자가 2.5GB를 매번 받지 않게 하는 캐시 전략까지요.)

참고

1브라우저에서 실행되는 Mistral의 Voxtral Mini 4B Realtime Rust 구현

2Voxtral transcribes at the speed of sound. | Mistral AI

3Rust implementation of Mistral's Voxtral Mini 4B Realtime runs in your browser | Hacker News

브라우저에서 도는 4B 음성인식: Voxtral Rust+WASM 구현 해부

이 노트는 요약·비평·학습 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.