
2026/10/09 1:59
Whistle:16.9 MB で音声からテキストへ変換
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
Whistle は、スマートフォン、ウェアラブル機器、ロボット、スマートホームシステム、車載ユニット、マイクロコントローラーといったエッジデバイスに特化して設計されたオープンソースの音声認識モデルです。2026 年 10 月 2 日にリリースされ、その最大の特徴は外部依存関係なしに完全にオンデバイスで動作することであり、高いプライバシー保護と低レイテンシーを実現するとともに、Needle フレームワークと同じ C++ エンジン内にはまる単一の 16.9 MB のファイルで済み、その利点を活かしています。モデルは英語、ドイツ語、フランス語、スペイン語、イタリア語、オランダ語、ポーランド語の 7 か国語をサポートし、CPU 上で最大 30 秒間のオーディオを瞬時に処理します。
アーキテクチャ的には、Whistle は Needle と同じエンコーダーおよびデコーダ用の Simple Attention ブロックを共有しており、エンコーダーでは 18,432 スロットを持つエングラムと Monarch Hadamard MLP を採用し、デコーダではクリップごとエンコーダーを一度だけ読み取るゲート付きクロス・アテンションを備えています。Apple M4 Pro CPU におけるベンチマーク結果はその効率性を示しており、最初のトークン生成までにかかる時間は 11 ms で、デコード速度は 1,319 トークン/秒に達し、Whisper base(73.2 ms / 266/s)や Moonshine tiny v2(22.8 ms)を大幅に上回っています。この効率性により、書き起こしや単語の時間スタンプ付けから、音声埋め込み、そして音声コマンドに基づくスマートホームアクションのトリガー(「set_lights」など)に至る多様なアプリケーションに対応できます。
.cact ファイルを用いた needle ツールとの統合を通じて実現します。モデルには、特定の音量閾値未満の断片ではビームサーチに入らず空の文字起こしを返す沈黙検出機能も含まれており、リソース制約のある環境向けに軽量かつ高性能なソリューションとなっています。本文
Whistle: 軽量音声認識モデルのリリース
🚀 モデル概要
- 名前:Whistle
- エンジン:Needle(C++ エンジン、同一コンテナ、同等の量化)
- 形式:単一ファイル (16.9MB)
- 依存関係:不要 (CPU 動作)
- 公開日:2026 年 10 月 2 日
- 特徴
- 7 つの言語に対応
- 最初のトークン出力まで:約 11ms(直ちにツール呼び出しへ)
- デバイス内完結(データが外部に流出しない)
💻 機能と仕様
Whistle はデバイス上で以下の 3 つの機能をすべて実行します。
基本動作
- マイク入力:ボタン押下で最大 30 秒の音声処理可能。
- ダウンロード後、録音データはデバイス外へ送信されません。
- 自動言語検出:言語を指定しない場合、システムが自動判別します。
主要機能
-
書き起こし(Transcription)
- 対応フォーマット:16kHz モノラル音声
- 処理時間:最大 30 秒
- 検出言語:英語、ドイツ語、フランス語、スペイン語、イタリア語、オランダ語、ポーランド語
-
単語ごとのタイムスタンプ(Word Timestamps)
- デコーダーの注意力機構に基づき生成。
- 各単語について開始時間・終了時間・確率値を付与。
-
音声エンベッディング(Speech Embedding)
- トランスクリプトを生成せず、エンコーダー出力のみ提供。
- フォーマット:80ms ごとに 1 ライン(フレーム単位)。
⚙️ アーキテクチャ詳細
エンコーダー (ENCODER)
- 波形処理
- ロギメルスペクトログラム生成:80 バイン、25ms ウィンドウ、10ms ヒップ。
- 帯域制限:250-3500Hz / チャネルごとの正規化。
- フレーム数:3,000 フレーム(480,000 サンプル)
- 畳み込みステム(Convolutional stem)
- 128 チャンネル、カーネルサイズ 9 で 3 回減算処理。
- 収束結果:375 フレーム(各 80ms が 1 フレーム)
- 単純な注意ブロック × 8
- Needle と共有する構成。
- 自己注意力計算と 4mHC レーン採用。
- Monarch Hadamard MLP を FFN に代用。
デコーダー (DECODER)
- クロスマモリー(Cross Memory)
- K と V は一度だけ投影(375 フレーム×8 レイヤーでビーム間共有)。
- 階段状の単純な注意ブロック × 8
- Needle と共有する構成。
- GQA 8q : 2kv 構成(48 次元 Q/K, 64 次元 V)。
- 3 タップのカウzal コンボリューション適用。
- レイヤー 3・7 で幅 512 のエングラム検索。
- ゲート付きクロスアテンション
- 各レイヤーがエンコーダーを読み取る:$x \leftarrow x + \sigma(g) \cdot \text{softmax}(\hat{q}\hat{K}^T/\sqrt{d}) V$
- ビームサーチ × 5
- 長さに正規化した対数確率を使用。
- Aho-Corasick オートマトンによるキーワードバイアス適用。
- トランスクリプト出力
- テキストパーツ:8,192 + 7 つの言語トークン(最大 320 トークン)。
- 検出された言語もトークンとして出力。
フロントエンド処理フロー
- 入力:16kHz モノラル音声(25ms ウィンドウ、10ms ヒップ)。
- 変換:80 バインのロギメルスペクトログラムに変換し正規化。
- 畳み込み:Convolutional Stem で処理し、80ms ごとのフレームへ収束。
- 出力:Embed モデルはフレームごとに一行を返す形式。
※ 注意点: 「共有」とマークされたブロックは Needle のコードそのものです(コピーではありません)。
でデコーダーレイヤーを選択可能ですが、エンコーダーは常に全 8 レイヤーを実行します。--audio-depth
📊 性能比較
Whistle は同等の品質を維持しつつ、サイズとレイテンシにおいて優位性を示します。
| メトリック | Whistle | Whisper base | Moonshine tiny v2 | 備考 |
|---|---|---|---|---|
| サイズ | 16.9 MB | 145.3 MB | 41.9 MB | Whistle が圧倒的に軽量 |
| レイテンシ (最初のトークン) | 11.1 ms | 73.2 ms | 22.8 ms | CPU 環境でも高速 |
| デコード速度 (Apple M4 Pro CPU) | 1,319 tokens/s | 266 tokens/s | 262 tokens/s | ストリーミング対応で高速 |
| WER (単語誤り率) | 最良 | 特定分野で優位 | 良好 | LibriSpeech, SPEGISpeech 等で先行 |
レイテンシの特性
- Whisper: すべての入力を 30 秒にパディングするため、クリップ長に関わらずレイテンシは一定(73.2ms)。
- Whistle: クリップを追跡するため、入力時間に応じて最適化されます。
- 5 秒分:約 5.9ms
- 10 秒分:約 11.1ms
- 30 秒分:約 36.3ms
テスト環境について
- 測定はテストセットにトレーニング/検証データが含まれていないことを確認済み。
- WER は Whisper の正規化器を使用(公平性の確保のため)。
- Whistle の数値は 86,174 の発話に基づく独自のベンチマークです。
💡 使用例と統合
Needle を経由した実行
needle_load は .cact ファイルを読み込み、同じバイナリで音声処理・テキスト処理・両方を同時実行できます。
コマンドライン操作
# 音声を書き起こす needle --model whistle.cact --audio clip.wav # テキストプロンプトでツールを呼び出す needle --model needle3.cact --tools tools.json --prompt "kitchen lights を消す" # 音声をトリガーとしたツールの呼び出し(組み合わせ) needle --model needle3.cact --model whistle.cact --tools tools.json --audio clip.wav
- 3 行目の
は、エンジン内の書き起こしを直接処理します。needle_complete - 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 API (cactus-needle
)
cactus-needlepip install cactus-needle import needle # 簡易書き起こし print(needle.transcribe("clip.wav")["text"]) # 出力:kitchen lights を消す
オプションパラメータ
: 各単語の時間と確率を付与。word_timestamps=True
: キーワード検出時の対数確率引き上げ。keywords=["Siobhan", "Krzysztof"]
: 言語を自動検出ではなく強制指定。language="de"
プレイグラウンドコマンド
# ターミナルからマイク入力で書き起こし needle whistle playground # 並走比較(Whistle, Whisper, Moonshine のタイミング表示) needle whistle compare
🛠️ インストールとプラットフォーム
システム要件とライブラリ
- 16kHz WAV: ベースインストールのみで十分。
- 他サンプリングレート/マイクキャプチャ:
パッケージ追加が必要(soxr, sounddevice を含む)。[mic]
サポートプラットフォーム (17 ターゲット)
- macOS, Linux, Android, iOS, watchOS
- Windows on ARM, RISC-V, MIPS
- ブラウザ、WASI コンポーネント
各プラットフォーム向けに事前構築済みバイナリ、
libneedle.a, needle.h が提供されます。
入手方法
ウェイトは Hugging Face にあり、エンジンとプラットフォームフォルダは
Cactus-Compute/needle3 に配置されています。
# プラットフォーム固有のバイナリをダウンロード (例: macOS ARM) needle download macos-arm64 # Whistle モデルをダウンロード needle download whistle # 実行 ./macos-arm64/needle --model whistle.cact --audio clip.wav --audio-word-timestamps
API の特徴
,needle_load
,needle_transcribe
が音声 C API の主要機能です。needle_embed- 環境変数不要: 動作はコンパイル済みデフォルトまたは明示的なフラグで制御されます。
- 重みは Hugging Face に公開されており、ソースコードは GitHub で利用可能です。