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.aneedle.h모든 바이너리는 환경 변수 설정 없이.cact모델 파일을 로드합니다.
커뮤니티 피드백 (선별된 HN 댓글)
- 긍정적 반응: 사용자들은 특히 웹 앱이나 엣지 디바이스에 임베딩하기 위한 작은 크기와 속도를 칭찬합니다. (예: "웹 앱 내에 탑재할 수 있는 무언가로서는 매우 훌륭합니다.")
- 정확도 우려: 여러 댓글 작성자가 언어별 문제(스페인어, 네덜란드어 vs 독일어, 폴란드어)와 까다로운 오디오에서의 간헐적인 환각 현상을 보고했습니다. 한 사용자는 60초 세그먼트에서 "Thank you."가 반복적으로 출력되는 긴 대화에서의 실패 모드를 관찰했습니다.
- 기능 요청: 실시간 스트리밍 전사(녹음 중 출력) 기능이 누락되었으며, 사용자들은 라이브 애플리케이션에 필수적이라고 언급했습니다.
- 비교: 사용자들은 Whistle을 Parakeet, Whisper, Moonshine과 비교하며 Whistle의 속도 이점과 더 큰 모델 대비 혼합된 정확도를 지적했습니다.
- 하드웨어 호기심: 마이크로컨트롤러(ESP32, STM) 및 RISC-V에서의 구동에 대한 질문이 제기되었습니다. 프로젝트는 이미 RISC-V 빌드를 제공하지만, 완전한 마이크로컨트롤러 지원은 아직 검증되지 않았습니다.
실용적인 사용 사례
- 음성 제어 IoT 기기 – 로컬 전사는 스마트 홈 명령에 대한 지연 시간과 개인 정보 보호 문제를 제거합니다.
- 로봇 공학 – GPU 가속이 없는 로봇을 위한 온보드 음성 인터페이스.
- 웨어러블 및 자동차 – 핸즈프리 상호 작용을 위한 저전력 온디바이스 STT.
- 엣지 추론 파이프라인 – Whistle 임베딩과 소형 LLM을 결합하여 문맥 인식 명령 파싱 수행.
시작하기
- 모델 및 런타임 다운로드
needle download whistle # 16.9 MB .cact 파일 다운로드 needle download macos-arm64 # Apple Silicon용 예시 - 빠른 테스트 실행
./macos-arm64/needle --model whistle.cact --audio clip.wav --audio-word-timestamps - Python을 통한 통합 –
cactus-needle을 설치하고 위와 같이needle.transcribe또는needle.embed를 호출합니다. - 깊이 트레이드오프 탐색 – 타겟 하드웨어에 맞춰 속도와 WER의 균형을 맞추기 위해
--audio-depth 2…8을 실험해 보세요.
제한 사항 및 미해결 질문
- 언어 범위: 7개의 유럽 언어만 지원되며, 중국어, 일본어 또는 기타 수요가 많은 언어는 지원되지 않습니다.
- 스트리밍 출력: 현재 API는 오디오 클립이 완전히 처리된 후 최종 전사를 제공하며, 실시간 토큰 단위 스트리밍은 아직 사용할 수 없습니다.
- 억양에 대한 견고성: 커뮤니티 보고에 따르면 강한 억양(예: 폴란드어, 네덜란드어-독일어, 인도 영어)에서 성능이 저하되어, 학습 데이터가 표준 억양에 편향되어 있을 가능성이 있음을 시사합니다.
- 마이크로컨트롤러 실현 가능성: RISC-V 바이너리는 존재하지만, 초저전력 MCU(ESP32, STM32)에서의 구동은 공개적으로 입증되지 않았습니다.
코드 및 모델 위치
- 모델 가중치: https://huggingface.co/Cactus-Compute/whistle
- 엔진 및 플랫폼 바이너리: https://huggingface.co/Cactus-Compute/needle3
- 소스 저장소: https://github.com/cactus-compute/needle
Whistle은 고품질 다국어 음성 인식이 20 MB 미만의 CPU 전용 패키지로 제공될 수 있음을 보여주며, 다양한 엣지 하드웨어에서 진정한 오프라인 음성 인터페이스의 문을 열어줍니다.
Sources
관련
- 프로젝트
- Dispatch
- 프로젝트
- 프로젝트
- Dispatch