Whistle 16.9 MB 音声認識モデル: 超軽量・高速・多言語対応のオンデバイスASR
TL;DR – Whistleが提供するものとその重要性
- 概要: Whistleは、完全にCPU上で動作し、外部依存関係を一切必要とせず、Needle言語モデルと同じC++ランタイムを共有する16.9 MBのオンデバイス音声認識モデルです。
- 重要性: 20 MB未満のサイズで、多言語文字起こし、単語単位のタイムスタンプ、音声埋め込みを提供します。最初のトークンまでのレイテンシは約11 msで、OpenAIのWhisper-base(73 ms)よりもはるかに高速であり、より大規模なモデルに匹敵します。これにより、モバイル、ウェアラブル、マイクロコントローラー、エッジデバイスでのリアルタイム音声認識(STT)が可能になります。
主要機能
- 文字起こし – 16 kHzモノラル音声、最大30秒まで。英語、ドイツ語、フランス語、スペイン語、イタリア語、オランダ語、ポーランド語に対応。言語は明示的に設定しない限り自動検出されます。
- 単語タイムスタンプ – 各単語には、デコーダーのアテンションメカニズムから導出された開始/終了時間と信頼度スコアが付与されます。
- 音声埋め込み – エンコーダーはデコードなしでフレームごとの埋め込み(フレームあたり80 msの行)を出力します。これは、話者識別や音声検索などの後続タスクに役立ちます。
"最初の実行で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。エンコーダーの投影はクリップごとに1回計算され(375フレーム)、ビーム間で再利用されます。 |
– |
| デコーディング | 5ビームサーチ、長さ正規化対数確率、Aho-Corasickオートマトンによるキーワードバイアス、最大320トークン、語彙数8,192ピース + 7個の言語トークン。 | – |
| 無音処理 | デコード前の音量チェック。しきい値以下の場合はビームサーチに入らず、空の文字起こしと言語を返します。 | – |
ラダー構造の深さ選択
--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
3番目のコマンドは、エンドツーエンドの音声制御ツール呼び出しを実行し、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コメントより抜粋)
- 肯定的な反応: ユーザーは、特にWebアプリやエッジデバイスへの組み込みにおいて、その小さなフットプリントと速度を称賛しています。(例: "Webアプリに組み込めるものとしては、非常に優れている。")
- 精度の懸念: 複数のコメント投稿者が、言語固有の問題(スペイン語、オランダ語とドイツ語の混同、ポーランド語)や、困難な音声での時折のハルシネーションを報告しています。あるユーザーは、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を呼び出します。 - 深さのトレードオフを試す –
--audio-depth 2…8を試して、ターゲットハードウェアの速度とWERのバランスを調整します。
制限事項と今後の課題
- 言語カバレッジ: 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