3P by GN⁺ 20시간전 | ★ favorite | 댓글 1개
  • 모든 처리를 온디바이스에서 수행하는 실시간 음성 인식 프레임워크
  • 스트리밍 기반 모델 구조를 통해 사용자가 말하는 동안에도 실시간으로 텍스트를 생성하며, Whisper Large v3보다 낮은 오류율(WER 6.65%) 을 달성
  • Python, iOS, Android, MacOS, Linux, Windows, Raspberry Pi 등 다양한 플랫폼에서 동일한 API로 동작하며, C++ 코어와 OnnxRuntime을 기반으로 최적화
  • 언어별 모델(영어, 한국어, 일본어, 스페인어 등)명령 인식(Intent Recognition) 기능을 포함해, 개발자가 손쉽게 음성 인터페이스를 구축 가능
  • Whisper의 30초 고정 입력·캐시 부재·언어 정확도 한계를 개선해, 엣지 환경에서의 저지연 음성 인터페이스 구현에 적합한 대안으로 주목

Moonshine Voice 개요

  • Moonshine Voice는 실시간 음성 애플리케이션 개발용 오픈소스 AI 툴킷
    • 모든 연산이 로컬 디바이스에서 수행되어 빠른 응답과 개인 정보 보호 보장
    • 스트리밍 처리로 사용자가 말하는 중에도 텍스트 업데이트 가능
  • 모델은 자체 연구 기반으로 처음부터 학습된 구조이며, Whisper Large v3보다 높은 정확도를 제공
  • 26MB 초소형 모델부터 245M 파라미터 중형 모델까지 다양한 크기 제공
  • 영어, 한국어, 일본어, 중국어, 스페인어, 베트남어, 아랍어, 우크라이나어 등 다국어 지원

Whisper 대비 주요 개선점

  • Whisper의 30초 고정 입력 윈도우를 제거해, 가변 길이 입력을 지원
  • 캐싱 기능을 추가해 스트리밍 중 중복 연산을 줄이고 지연(latency)을 대폭 단축
  • 언어별 단일 모델 학습으로 동일 크기 대비 더 높은 정확도 확보
  • 크로스플랫폼 C++ 코어 라이브러리를 통해 Python, Swift, Java 등에서 동일 API 사용 가능
  • Whisper Large v3(1.5B 파라미터) 보다 작은 245M 파라미터 모델로 더 낮은 오류율 달성

주요 기능 및 API 구조

  • 음성 인식 파이프라인을 단일 라이브러리로 통합해 마이크 입력, 음성 감지(VAD), 텍스트 변환, 화자 식별, 명령 인식을 일괄 처리
  • 핵심 클래스:
    • Transcriber: 오디오 입력을 텍스트로 변환
    • MicTranscriber: 마이크 입력 자동 처리
    • IntentRecognizer: 자연어 기반 명령 인식
  • 이벤트 기반 구조로, LineStarted / LineUpdated / LineCompleted 등 상태 변화를 실시간 감지

모델 및 성능

  • Moonshine Medium Streaming (245M): WER 6.65%, Whisper Large v3(7.44%)보다 우수
  • Moonshine Small Streaming (123M): WER 7.84%
  • Moonshine Tiny Streaming (34M): WER 12.00%
  • 한국어 Tiny 모델은 WER 6.46%로 평가됨
  • 모든 모델은 OnnxRuntime 기반 .ort 포맷으로 제공되며, 8비트 양자화로 경량화

개발 및 배포

  • Python (pip install moonshine-voice), Swift (SPM), Android (Maven), Windows (C++ 헤더) 등 주요 환경에서 설치 가능
  • Raspberry Pi 최적화 패키지 제공, USB 마이크로 실시간 인식 가능
  • MIT 라이선스(영어 모델) 및 Moonshine Community License(기타 언어 모델)로 공개
  • 향후 로드맵: 모바일용 바이너리 경량화, 추가 언어, 개선된 화자 식별, 도메인 커스터마이징

벤치마크 및 활용

  • Whisper 대비 5배 이상 빠른 처리 속도로 실시간 음성 인터페이스에 적합
  • 200ms 이하 응답 지연 목표로 설계되어, 대화형 애플리케이션에 활용 가능
  • 명령 인식 예제를 통해 “Turn on the lights” 등 자연어 변형 명령도 인식 가능
  • HuggingFace OpenASR Leaderboard에서 공개 성능 검증 완료
Hacker News 의견들
  • OpenASR Leaderboard에 따르면 Parakeet V2/V3와 Canary-Qwen(Qwen 파인튜닝 버전)이 Moonshine보다 성능이 좋음
    세 모델 모두 오픈소스이지만 Parakeet이 가장 작은 모델
    나는 Parakeet V3를 Handy와 함께 로컬에서 사용 중인데, 매우 잘 작동함

    • Parakeet V3는 Moonshine Medium(245M)보다 두 배 이상 많은 파라미터 수(600M) 를 가짐
      그래서 단순 비교는 어렵다고 생각함
      모델 크기 정보가 리더보드에 없다는 점이 의외임
    • Handy를 방금 써봤는데 정말 놀라움
      지금 이 글도 Handy로 말하면서 쓰고 있음
      구두점 자동 처리도 완벽하고, 로컬에서 음성을 바로 텍스트로 바꿔주니 Google Docs보다 훨씬 편함
      예전엔 Chrome 기반으로 음성 입력을 쓰려고 Orion 브라우저까지 설치했는데, 이제는 Handy 하나로 충분함
      타이핑 속도가 100~120WPM이었는데, 이건 그보다 빠름
      진짜 삶의 질 향상 도구
    • 나는 로컬 우선 iOS 전사 앱을 개발 중인데, Whisper Medium에서 Parakeet V3로 전환하려 함
      macOS에서 codex-cli와 Handy를 함께 쓸 때 기본 단축키(Option+Space)가 말 중간에 공백을 넣는 문제가 있음
      대신 Left Ctrl + Fn 조합이 깔끔하게 작동함
      다른 사람들은 어떤 단축키를 쓰는지 궁금함
    • WhisperX 모델을 써왔는데 Handy는 처음 알게 되었음
      직접 써보니 정말 훌륭함
      이제 모든 클라이언트 작업에서 기본 앱으로 쓸 예정임
    • Handy는 정말 품질 좋은 앱
  • 결과 축하함
    개인적으로는 스트리밍 기능이 가장 흥미로움
    나는 Voxtral Realtime 기반으로 macOS용 받아쓰기 앱 LocalVoxtral을 만들었는데, 스트리밍과 오프라인 STT의 UX 차이는 엄청남
    말하는 도중에 단어가 바로 뜨면 피드백 루프가 완전히 달라짐
    실시간으로 오류를 잡고 문장을 수정할 수 있어 훨씬 자연스러움
    Moonshine의 스트리밍 지연(latency) 이 실제로 어느 정도인지 궁금함
    또한 OpenAI Realtime과 호환되는 WebSocket 엔드포인트가 있는지도 알고 싶음

    • 내 앱은 moonshine-voice Python 패키지를 사용함
      Moonshine을 기본으로 둔 이유는 정확도와 지연시간의 균형이 가장 좋기 때문임
      향후 여러 모델을 동일 오디오 데이터로 비교하는 객관적 벤치마크를 추가할 예정임
      또한 Sherpa-onnx API를 참고해 만든 커스텀 WebSocket 서버(rift-local)도 있음
      단일 연결에 최적화되어 있어 다중 연결에는 적합하지 않음
  • 여러 Twitch 스트리머들이 obs-localvocal을 통해 스트림에 전사 및 번역 기능을 추가하도록 도와왔음
    주로 독일어 음성을 영어 자막으로 바꾸는 용도였음
    Whisper보다 빠르고 정확한 대안이 필요하지만, 스트리머들은 설치형 OBS 플러그인 형태를 선호함
    Moonshine은 번역 기능이 없고, 다국어 자동 감지도 지원하지 않아 코드스위칭이 잦은 스트리머에게는 한계가 있음
    언어를 자동 감지해 모델을 전환하는 기능이 있다면 이상적일 것 같음

  • Whisper Large v3보다 높은 정확도를 주장하는 건 대담한 시도
    평가 시 Whisper의 환각 루프(hallucination loop) 문제를 고려했는지 궁금함
    또한 엣지 디바이스 배포 시 VRAM 사용량이 8GB Mac에 맞는지도 알고 싶음
    양자화 없이 돌아간다면 꽤 큰 의미가 있음

  • 스트리밍 환경에서는 단순한 WER보다 부분 안정성(partial stability) 이 더 중요함
    음성 비서의 경우, 부분 전사가 몇백 ms마다 바뀌면 UX가 망가짐
    첫 토큰 지연, 실시간 비율, 1초/3초 후 수정된 토큰 비율 같은 지표가 있다면 비교가 훨씬 실용적일 것 같음
    이런 수치가 좋다면 로컬 어시스턴트 파이프라인에 매우 유망함

    • 인간의 경우에도 ‘부분 수정률’이 존재하는지 궁금함
      나도 말을 하다 스스로 되짚어 해석하는 경험이 있는데, 무의식적으로도 자주 일어날 것 같음
      그렇다면 이 비율이 너무 낮을 필요는 없을 수도 있음
  • 현재 지원 언어는 영어, 아랍어, 일본어, 한국어, 중국어, 스페인어, 우크라이나어, 베트남어이며 대부분 Base(58M 파라미터) 크기임

  • Raspberry Pi 설치 가이드에서 'sudo pip install --break-system-packages moonshine-voice'를 권장하는 이유를 모르겠음
    다만 문서에서는 uv를 이용한 대안도 제시함
    uv run을 쓰면 별도로 source 명령을 실행할 필요가 없음

  • “정확도 향상”이 영어 기준인지, 다국어 기준인지 불분명함
    언어별 WER 표가 최소한 제공되어야 비교가 가능함

  • 브라우저에서의 JavaScript 지원 계획이 있는지 궁금함
    예전에 데모가 있었는데 지금은 사라졌음
    로컬에서 작동하던 적이 있지만, 어느 순간부터 이유 없이 깨졌음

    • moonshine-js라는 WASM 기반 포트가 있음
      또한 브라우저 내 오프라인 전사 솔루션들을 정리한 비교 문서도 있음
      transformers.js(WebGPU 사용, WASM 폴백) 기반의 별도 Moonshine 데모도 존재함
  • 브라우저 GUI로 Moonshine을 써보려면 아래 명령을 실행하면 됨

    uv tool install rift-local && rift-local serve --open
    

    이렇게 하면 로컬 전사용 웹 프론트엔드 RIFT가 열리며, 복사 버튼도 있음
    Web Speech API 및 다른 모델(클라우드 API 포함)과 비교도 가능함
    관련 링크: rift-local, RIFT 데모