Cactus-Compute/whistle
Whistle — 16.9MB 파일로 기기 안에서 실행하는 음성 인식 모델
Whistle은 모바일·웨어러블·로봇·스마트홈·자동차·마이크로컨트롤러를 겨냥한 온디바이스 음성 인식 모델입니다. 모델 전체가 16.9MB이며, 전사와 단어별 타임스탬프, 음성 임베딩을 GPU나 별도 런타임 없이 처리합니다.
- 주제
AI 요약
Cactus Compute가 소형 기기용 음성 인식 모델 Whistle을 공개했습니다. 모델 파일 전체 크기는 16.9MB입니다. GPU와 외부 의존성 없이 기기 안에서 동작하며, 같은 회사의 Needle과 CPU 엔진·컨테이너 형식(.cact)·양자화 방식·SIMD 커널·KV 캐시를 공유합니다. 이미 Needle을 실행하는 기기는 별도 런타임을 추가하지 않고 같은 바이너리에서 Whistle도 불러올 수 있습니다.
전사와 음성 데이터 처리
Whistle은 16kHz 모노 오디오를 입력으로 받아 한 번에 최대 30초까지 전사합니다. 지원 언어는 영어, 독일어, 프랑스어, 스페인어, 이탈리아어, 네덜란드어, 폴란드어입니다. 언어를 지정하지 않으면 자동으로 감지하고, 무음 입력에는 문장을 만들어내지 않고 빈 전사 결과를 반환합니다. 사용자가 말할 이름이나 장소, 제품명을 키워드로 지정하는 keyword biasing도 제공해, 디코딩 과정에서 해당 표현을 우선하도록 합니다.
전사 외에도 단어마다 시작 시각, 종료 시각, 확률을 반환합니다. 타임스탬프는 디코더의 attention에서 정렬 정보를 얻어 앱에서 단어를 강조하거나 특정 단어 위치로 이동하고, 해당 구간을 잘라내는 데 쓸 수 있습니다. 음성 임베딩 기능은 전사문을 만들지 않고 인코더 출력을 반환합니다. 출력은 80ms 프레임마다 한 행으로 구성되며, 음성 검색이나 유사도 비교에 활용할 수 있습니다.
모델 구조와 배포
Whistle은 log-mel 전처리와 convolutional stem 뒤에 오디오 인코더를 두고, Needle 형태의 디코더가 각 층에서 gated cross-attention으로 인코더 출력을 읽는 구조입니다. 모델 깊이는 2개 층부터 단계별로 선택할 수 있습니다. 실행 시 --audio-depth를 지정하면 기기 성능이나 배포 조건에 맞춰 사용할 깊이를 고릅니다. 저장소에는 whistle.cact 가중치가 들어 있으며, 엔진과 플랫폼별 파일은 Cactus-Compute/needle3 저장소에 있습니다.
Python 패키지는 cactus-needle이며, 16kHz WAV 파일이나 원시 샘플을 처리할 때는 기본 설치만 필요합니다. 다른 샘플레이트를 변환하거나 마이크를 직접 캡처하려면 mic 추가 기능을 설치합니다. needle.transcribe()는 전사문, 감지 언어, 첫 토큰까지 걸린 시간, 이후 디코딩 속도를 반환합니다. word_timestamps=True, keywords=[...], language="de" 같은 옵션으로 단어 타임스탬프와 키워드 편향, 언어 지정을 설정합니다. needle.Whistle() 객체는 임베딩 계산이나 특정 .cact 모델을 유지하는 데 쓸 수 있습니다.
C API는 needle_load, needle_transcribe, needle_embed로 구성되며, needle_complete는 오디오 입력부터 전사까지 처리합니다. Needle 텍스트 모델과 Whistle을 함께 불러오면 엔진 한 번의 호출로 음성을 전사하고 그 전사문을 도구 호출에 넘길 수도 있습니다. 이때 반환 JSON에는 도구 호출과 음성 관련 필드가 함께 들어가며, 음성 필드 이름에는 audio_ 접두사가 붙습니다. 엔진은 환경 변수를 읽지 않고 컴파일 기본값이나 명시한 플래그를 사용하므로, 같은 모델 파일과 설정으로 실행하면 같은 점수를 내도록 설계했다고 설명합니다. WASI 컴포넌트와 네트워크가 차단된 환경의 설치 방법도 기기 가이드에서 다룹니다.
평가 방식
Whistle의 단어 오류율(WER)은 86,174개 발화에서 측정했고, Whisper 정규화 방식을 적용했습니다. Whisper와 Moonshine 수치는 각 프로젝트가 발표한 값을 가져왔습니다. 비교 속도는 Apple M4 Pro에서 10초 오디오를 처리한 결과로, Whistle은 C++ 엔진의 빔 수를 5로 설정했습니다. Whisper는 공식 런타임과 기본 설정, Moonshine은 비스트리밍 방식으로 전체 오디오를 처리했습니다. 첫 토큰까지 시간은 오디오 입력부터 첫 토큰이 나올 때까지를 재며, 디코딩 속도는 그 뒤의 처리 시간만 계산해 인코더 시간을 중복 산입하지 않습니다.
정밀도 조건은 Whistle 2~4비트, CPU 메모리의 Whisper fp32, Moonshine int8입니다. Whisper는 base.en이 아닌 다국어 체크포인트의 수치를 사용했습니다. Moonshine은 영어만 지원하며, Whisper는 SPGISpeech·Earnings-22·AMI cleaned 결과를 발표하지 않아 해당 그래프 값이 없습니다. FLEURS와 MLS는 Whistle의 언어 구성에 맞춰 평균을 냈습니다. FLEURS는 7개 언어, MLS는 영어를 제외한 6개 언어를 사용했습니다. AMI에는 Open ASR Leaderboard 관례에 따라 정답이 빈 구간을 포함했고, Whisper 수치는 AMI-IHM입니다. TED-LIUM은 평가 규약에 따라 ignore_time_segment_in_scoring 구간을 제외했습니다. Whistle 팀은 보고한 모든 테스트 세트의 오디오 체크섬과 화자 ID를 학습·검증 데이터와 대조해 테스트 오디오가 포함되지 않았음을 확인했다고 밝혔습니다.
원문: Hugging Face / 번역·요약: Trawling