Whistle 16.9 MB 음성 인식 모델: 작고 빠르며 다국어를 지원하는 온디바이스 ASR

요약 – Whistle의 특징과 중요성

  • 내용: Whistle은 16.9 MB 크기의 온디바이스 음성 인식 모델로, CPU에서 완전히 구동되며 외부 의존성이 없고 Needle 언어 모델과 동일한 C++ 런타임을 공유합니다.
  • 중요성: 20 MB 미만의 크기로 다국어 전사, 단어 단위 타임스탬프, 음성 임베딩을 제공하며 첫 토큰 생성까지의 지연 시간이 약 11 ms로, OpenAI의 Whisper-base(73 ms)보다 훨씬 빠르고 훨씬 큰 모델들과 대등한 성능을 보여 모바일, 웨어러블, 마이크로컨트롤러 및 엣지 디바이스에서 실시간 STT를 가능하게 합니다.

핵심 기능

  • 전사(Transcription) – 16 kHz 모노 오디오, 최대 30초, 영어, 독일어, 프랑스어, 스페인어, 이탈리아어, 네덜란드어, 폴란드어 지원. 언어는 명시적으로 설정하지 않으면 자동 감지됩니다.
  • 단어 타임스탬프 – 각 단어는 디코더의 어텐션 메커니즘에서 파생된 시작/종료 시간과 신뢰도 점수와 함께 반환됩니다.
  • 음성 임베딩 – 인코더는 디코딩 없이 프레임 단위 임베딩(프레임당 80 ms 행 1개)을 출력하며, 이는 화자 식별이나 오디오 검색과 같은 후속 작업에 유용합니다.

"첫 실행 시 16.9 MB 모델을 다운로드하며, 오디오는 절대 기기 밖으로 나가지 않습니다." – Cactus Compute 블로그

아키텍처 개요

구성 요소 설계 세부 정보 Needle 공유 여부
프론트엔드 25 ms 윈도우, 10 ms 홉, 80 로그-멜 빈, 대역 제한 250-3500 Hz, 채널별 정규화. 30초 → 3,000 프레임 → 3개의 스트라이드-2 컨볼루션 후 375 프레임. 예
인코더 8개의 Simple Attention 블록(4개의 mHC 잔차 레인 + Monarch Hadamard MLP). 비인과적 어텐션으로 장거리 문맥 허용(예: 3초 지점의 프레임이 12초 지점을 참조 가능). 예
디코더 8개의 Laddered Simple Attention 블록, 너비 512, 8개의 쿼리 헤드 → 2개의 KV 헤드, 48차원 Q/K, 64차원 V, Q/K/V에 대한 3-탭 인과적 컨볼루션, 잉그램 룩업(레이어 3 & 7, 18,432 슬롯). 예
교차 어텐션 디코더 레이어당 게이트 교차 어텐션: x ← x + σ(g)·softmax(q̂K̂ᵀ/√d)V. 인코더 투영은 클립당 한 번(375 프레임) 계산되어 빔 전반에 재사용됨. –
디코딩 5-빔 탐색, 길이 정규화 로그 확률, Aho-Corasick 오토마톤을 통한 키워드 바이어싱, 최대 320 토큰, 어휘 8,192 피스 + 7개 언어 토큰. –
무음 처리 디코딩 전 음량 확인; 임계값 미만이면 빔 탐색에 진입하지 않고 빈 전사 및 언어 반환. –

Laddered 깊이 선택

--audio-depth 플래그는 로드 시점에 디코더 깊이(2레이어에서 최대 8레이어까지)를 선택합니다. 모든 인코더 레이어는 항상 실행되지만, 디코더는 속도와 정확도를 조절하기 위해 슬라이스할 수 있습니다.

벤치마크 하이라이트

별도의 언급이 없는 한 모든 수치는 Apple M4 Pro CPU에서 측정되었습니다.

지표 Whistle Whisper‑base (145 MB) Moonshine tiny v2 (42 MB)
모델 크기 16.9 MB 145.3 MB 41.9 MB
첫 토큰 시간 11.1 ms (10초 클립) 73.2 ms 22.8 ms
디코드 속도 1,319 토큰/초 266 토큰/초 262 토큰/초
LibriSpeech test‑clean WER Whisper & Moonshine보다 우수 – –
SPGISpeech WER 우수 – –
Earnings‑22 WER 우수 – –
FLEURS 평균 WER 우수 – –
TED‑LIUM WER Whisper보다 뒤짐 – –
AMI WER Whisper보다 뒤짐 – –
MLS 평균 WER Whisper보다 뒤짐 – –

"Whistle은 LibriSpeech test-clean 및 test-other, SPGISpeech, Earnings-22 및 FLEURS 평균에서 앞서 있습니다." – Cactus Compute 블로그

결과 해석

  • 속도: Whistle의 첫 토큰 지연 시간은 클립 길이에 따라 확장되지만(5초에서 5.9 ms, 30초에서 36.3 ms), Whisper는 모든 입력을 30초로 패딩하여 고정된 지연 시간을 가집니다.
  • 정확도: 영어 중심 벤치마크에서 Whistle은 8배 이상 작음에도 불구하고 Whisper-base와 대등하거나 능가합니다. 다국어 성능은 지원되는 7개 언어에서 경쟁력이 있으나, 일부 커뮤니티 의견에 따르면 스페인어 성능 저하 및 네덜란드어-독일어 혼동이 보고되었습니다.
  • 자원 사용: 전체 파이프라인이 GPU 없이 단일 CPU 코어에서 실행되므로 저전력 기기(마이크로컨트롤러, RISC-V, MIPS, Android, iOS 등)에 적합합니다.

통합 및 API 인터페이스

명령줄 사용 (텍스트 및 음성용 동일 바이너리)

needle --model whistle.cact --audio clip.wav
needle --model needle3.cact --tools tools.json --prompt "turn off the kitchen lights"
needle --model needle3.cact --model whistle.cact --tools tools.json --audio clip.wav

세 번째 명령어는 엔드투엔드 음성 제어 도구 호출을 수행하며 JSON을 반환합니다:

{
  "function_calls": [{"name": "set_lights", "arguments": {"room": "kitchen", "on": false}}],
  "confidence": 0.94,
  "audio_text": "turn off the kitchen lights",
  "audio_language": "en"
}

Python 래퍼 (pip 패키지 cactus-needle)

import needle
print(needle.transcribe("clip.wav")["text"])  # → turn off the kitchen lights

선택적 플래그:

  • word_timestamps=True – 단어별 타이밍 및 확률 반환.
  • keywords=["Siobhan", "Krzysztof"] – 빔 탐색 중 해당 구문 가중치 증가.
  • language="de" – 독일어 감지 강제.
  • needle.Whistle() – 반복적인 embed(audio) 호출을 위한 객체 생성.

크로스 플랫폼 바이너리

macOS(ARM/x86), Linux, Android, iOS, watchOS, Windows-ARM, RISC-V, MIPS, 브라우저(WebAssembly) 및 WASI 구성 요소를 포함한 17개 타겟에 대한 사전 빌드된 바이너리가 존재합니다. 각 폴더에는 다음이 포함됩니다:

  • needle 실행 파일
  • libneedle.a
  • needle.h 모든 바이너리는 환경 변수 설정 없이 .cact 모델 파일을 로드합니다.

커뮤니티 피드백 (선별된 HN 댓글)

  • 긍정적 반응: 사용자들은 특히 웹 앱이나 엣지 디바이스에 임베딩하기 위한 작은 크기와 속도를 칭찬합니다. (예: "웹 앱 내에 탑재할 수 있는 무언가로서는 매우 훌륭합니다.")
  • 정확도 우려: 여러 댓글 작성자가 언어별 문제(스페인어, 네덜란드어 vs 독일어, 폴란드어)와 까다로운 오디오에서의 간헐적인 환각 현상을 보고했습니다. 한 사용자는 60초 세그먼트에서 "Thank you."가 반복적으로 출력되는 긴 대화에서의 실패 모드를 관찰했습니다.
  • 기능 요청: 실시간 스트리밍 전사(녹음 중 출력) 기능이 누락되었으며, 사용자들은 라이브 애플리케이션에 필수적이라고 언급했습니다.
  • 비교: 사용자들은 Whistle을 Parakeet, Whisper, Moonshine과 비교하며 Whistle의 속도 이점과 더 큰 모델 대비 혼합된 정확도를 지적했습니다.
  • 하드웨어 호기심: 마이크로컨트롤러(ESP32, STM) 및 RISC-V에서의 구동에 대한 질문이 제기되었습니다. 프로젝트는 이미 RISC-V 빌드를 제공하지만, 완전한 마이크로컨트롤러 지원은 아직 검증되지 않았습니다.

실용적인 사용 사례

  1. 음성 제어 IoT 기기 – 로컬 전사는 스마트 홈 명령에 대한 지연 시간과 개인 정보 보호 문제를 제거합니다.
  2. 로봇 공학 – GPU 가속이 없는 로봇을 위한 온보드 음성 인터페이스.
  3. 웨어러블 및 자동차 – 핸즈프리 상호 작용을 위한 저전력 온디바이스 STT.
  4. 엣지 추론 파이프라인 – Whistle 임베딩과 소형 LLM을 결합하여 문맥 인식 명령 파싱 수행.

시작하기

  1. 모델 및 런타임 다운로드
    needle download whistle   # 16.9 MB .cact 파일 다운로드
    needle download macos-arm64   # Apple Silicon용 예시
    
  2. 빠른 테스트 실행
    ./macos-arm64/needle --model whistle.cact --audio clip.wav --audio-word-timestamps
    
  3. Python을 통한 통합 – cactus-needle을 설치하고 위와 같이 needle.transcribe 또는 needle.embed를 호출합니다.
  4. 깊이 트레이드오프 탐색 – 타겟 하드웨어에 맞춰 속도와 WER의 균형을 맞추기 위해 --audio-depth 2 … 8을 실험해 보세요.

제한 사항 및 미해결 질문

  • 언어 범위: 7개의 유럽 언어만 지원되며, 중국어, 일본어 또는 기타 수요가 많은 언어는 지원되지 않습니다.
  • 스트리밍 출력: 현재 API는 오디오 클립이 완전히 처리된 후 최종 전사를 제공하며, 실시간 토큰 단위 스트리밍은 아직 사용할 수 없습니다.
  • 억양에 대한 견고성: 커뮤니티 보고에 따르면 강한 억양(예: 폴란드어, 네덜란드어-독일어, 인도 영어)에서 성능이 저하되어, 학습 데이터가 표준 억양에 편향되어 있을 가능성이 있음을 시사합니다.
  • 마이크로컨트롤러 실현 가능성: RISC-V 바이너리는 존재하지만, 초저전력 MCU(ESP32, STM32)에서의 구동은 공개적으로 입증되지 않았습니다.

코드 및 모델 위치


Whistle은 고품질 다국어 음성 인식이 20 MB 미만의 CPU 전용 패키지로 제공될 수 있음을 보여주며, 다양한 엣지 하드웨어에서 진정한 오프라인 음성 인터페이스의 문을 열어줍니다.

Sources

관련

  • 프로젝트
  • Dispatch
  • 프로젝트
  • 프로젝트
  • Dispatch