AI・機械学習
Whistle: 16.9MBで実現する音声認識
Whistle: Speech to Text in 16.9 MB (cactuscompute.com)
要約
Cactus Computeは、モバイル、ウェアラブル、IoTデバイス向けに、16.9MBという小型でCPU上で依存関係なしに動作する音声認識モデル「Whistle」を発表しました。このモデルは、デバイス上で音声の文字起こし、単語のタイムスタンプ、音声埋め込みを処理でき、複数の言語に対応しています。ベンチマークでは、Whisperなどの既存モデルと比較して、サイズ、速度、特定データセットでの精度において優位性を示しています。
全文翻訳
本日、モバイル、ウェアラブル、ロボット、スマートホーム、自動車、マイクロコントローラー向けの音声認識モデルであるWhistleをリリースします。
これは16.9MBの単一ファイルで、依存関係なしにCPU上で動作し、同じコンテナ、同じ量子化でNeedleと同じC++エンジンにロードされます。
Whistleは、あなたの音声を認識し、デバイス上で文字起こしを行います。
最初のプレスで16.9MBのモデルがダウンロードされ、音声はデバイスから離れることはありません。
Whistleは、すべてデバイス上で3つのジョブを実行します。
文字起こし。
16kHzモノラルオーディオ、一度に最大30秒、英語、ドイツ語、フランス語、スペイン語、イタリア語、オランダ語、ポーランド語。
言語は指定しない限り検出されます。
単語のタイムスタンプ。
デコーダーのアテンションからアラインされた、開始、終了、確率を持つ各単語。
音声埋め込み。
デコーダーのトランスクリプトをデコードせずに、80msフレームあたりの1行のエンコーダー出力。
モデル
ENCODER
波形
16kHzモノラル、最大30秒 = 480,000サンプル
Log-mel
80ビン、25msウィンドウ、10msホップ、250-3500Hz、チャンネルごとに正規化 → 3,000フレーム
畳み込みステム
128チャンネル、カーネル9、3回のダウンサンプリング → 375フレーム、80msあたり1フレーム
単純アテンションブロック × 8
Needleと共有
すべてのフレームで同時に自己アテンション、4 mHCレーン、FFNの代わりにMonarch Hadamard MLP
DECODER
クロスメモリ
KとVはクリップごとに1回投影、375フレーム × 8層、各ビームで共有
ラダー化された単純アテンションブロック × 8
Needleと共有
GQA 8q : 2kv、48 qk / 64 v、3タップの因果畳み込み、レイヤー3と7でのエングラム、幅512
ゲート付きクロスアテンション
各デコーダーレイヤーはエンコーダーを読み取ります: x ← x + σ(g) · softmax(q̂ K̂ᵀ/√d) V
ビームサーチ × 5
長さ正規化された対数確率、Aho-Corasickオートマトンによるキーワードバイアス
トランスクリプト
8,192テキストピース + 7言語トークン、最大320個、デコーダー自身の注意による単語タイムスタンプ
共有とマークされたブロックはNeedleのコードを実行します。コピーではありません。
--audio-depthはデコーダーレイヤーを選択します。エンコーダーは常に8つすべてを実行します。
フロントエンド。
16kHzモノラルオーディオは、25msウィンドウと10msホップでフレーム化され、80のLog-melビンになり、250-3500Hzに帯域制限され、チャンネルごとに正規化されます。
30秒は3,000フレームです。
128チャンネルとカーネル9の畳み込みステムがその数を3回半分にし、80msあたり1フレームで375フレームを残します。
この後の各ステージは、そのレートで実行され、embedはフレームごとに1行を返します。
エンコーダー。
8つの単純アテンションブロック: 4つのmHC残差レーンと、フィードフォワードネットワークの代わりにMonarch Hadamard MLP。これらはNeedleが使用するのと同じブロックです。
アテンションは因果的ではありません。
3秒のフレームは12秒のフレームにアテンションを向けます。
デコーダー。
幅512の8つのラダー化された単純アテンションブロック、2つのKVヘッドに対する8つのクエリヘッド、48次元のクエリとキー、64次元の値、Q、K、Vに対する3タップの因果畳み込み、レイヤー3と7での18,432スロットのエングラムルックアップ。
これはNeedleのブロックリストですが、レイヤー数が異なります。
音声特有の部分は、レイヤーごとに1つの加算です。
各デコーダーレイヤーは、ゲート付きクロスアテンションを介してエンコーダーを読み取ります: x ← x + σ(g) · softmax(q̂ K̂ᵀ/√d) V。
ゲートはレイヤーごとに学習され、KとVはクリップから取得されます。
これらの投影は、クリップが到着したときに一度実行され、8層にわたって375フレームになり、その後デコード全体で保持されます。
したがって、5つのビームは5つの短いトランスクリプトキャッシュを必要とし、オーディオ全体を5回処理する必要はありません。
デコーディング。
長さ正規化された対数確率でスコアリングされた5つのビーム。
キーワードバイアスは、Aho-Corasickオートマトンを渡されたフレーズ上でウォークし、ビームと並行して、オートマトンが進むにつれてそれらの対数確率をリフトします。
トランスクリプトは320トークンに制限されます。
語彙は8,192のテキストピースと7つの言語トークン(言語ごとに1つ)なので、検出された言語はバンド外で返されるのではなく、トークンとして出力されます。
ラダーはデコーダーにあります。
2層以上の各深度は、それ自体でモデルとしてトレーニングされており、--audio-depthはロード時に1つを選択します。
エンコーダーはスライスされません。すべての8つのブロックがすべての深度で実行されます。
無音。
エンジンは、デコーダーが開始する前にクリップのラウドネス範囲を測定します。
しきい値を下回った場合、空のトランスクリプトと空の言語を返し、ビームサーチには決して入りません。
ベンチマーク
Whistle Whisper base Moonshine tiny v2
単語エラー率、低いほど良い。
バーがないのは、そのモデルの著者が公開していないベンチマークです。
Moonshineは英語のみで、WhisperはSPGISpeech、Earnings-22、AMI cleanedのレポートがありません。
WhisperのAMIの数値はAMI-IHMであり、他の2つが報告するAMIとは異なるサブセットです。
WhistleはLibriSpeech test-cleanおよびtest-other、SPGISpeech、Earnings-22、およびFLEURS平均で先行しています。
Whisper baseはTED-LIUM、AMI、MLS平均で先行しており、145.3MB対16.9MBです。
サイズ
メガバイト、小さいほど良い
Whistle 16.9 MB
Whisper base 145.3 MB
Moonshine tiny v2 41.9 MB
最初のトークンまでの時間
ミリ秒、小さいほど良い
Whistle 11.1 ms
Whisper base 73.2 ms
Moonshine tiny v2 22.8 ms
デコード
トークン/秒、大きいほど良い
Whistle 1,319/s
Whisper base 266/s
Moonshine tiny v2 262/s
Apple M4 Pro CPUでの10秒間のオーディオ。
バーは各パネル内でスケーリングされています。
各モデルは、公式ランタイムでデフォルト設定で実行されました。
WhistleのC++エンジンは5ビーム、openai-whisper、moonshine-voiceは非ストリーミングでオーディオ全体を処理しました。
最初のトークンまでの時間は、オーディオ入力から最初のトークンまでです。
デコードは、トークンをその後の経過時間で割ったものです。したがって、エンコーダーは2回カウントされません。
Whisperはすべての入力を30秒にパディングするため、最初のトークンまでの時間はクリップ長全体で一定です。
Whistleはクリップに追従します。
5秒で5.9ms、10秒で11.1ms、30秒で36.3ms。
単語エラー率はWhisper正規化ツールでスコアリングされます。
Whistleの単語エラー率は86,174の音声で測定されます。
WhisperとMoonshineの単語エラー率は、著者が公開した数値であり、英語のみのチェックポイントではなく、多言語チェックポイントからのものです。
Whistleのトレーニングまたは検証データにテストオーディオは含まれていません。これは、報告されたすべてのテストセット間でオーディオチェックサムと話者IDを比較して検証されています。
1つのエンジン、3つのロード方法
needle_loadは、.cactファイルが保持するモデルを読み取ります。したがって、同じバイナリで音声、テキスト、またはその両方を処理できます。
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行目のneedle_completeはクリップを直接受け取ります。
エンジンはそれを文字起こしし、トランスクリプトをツールに対して照合し、コールとスピーチフィールドを持つ1つのJSONオブジェクトを返します。スピーチフィールドはaudio_でプレフィックスされます。
トランスクリプトは呼び出し元によって処理されません。
{"function_calls":[{"name":"set_lights","arguments":{"room":"kitchen","on":false}}], "confidence":0.94, "audio_text":"turn off the kitchen lights", "audio_language":"en"}
開始方法
pip install cactus-needle
import needle
print(needle.transcribe("clip.wav")["text"])
# turn off the kitchen lights
16kHzのWAVまたは生のサンプルは、ベースインストール以外に何も必要としません。
他のサンプルレートやマイクキャプチャには[mic]エクストラが必要で、これにはsoxrとsounddeviceが追加されます。
すべての呼び出しは、テキスト、言語、最初のトークンまでのミリ秒、およびその後のデコーダーのトークン/秒を返します。
word_timestamps=Trueは、各単語とそのタイムスタンプと確率を追加します。
keywords=["Siobhan", "Krzysztof"]は、検索中にこれらのフレーズの対数確率を上げます。
language="de"は、検出する代わりに言語を強制します。
needle.Whistle()は、embed(audio)用またはチューニングされた.cactを保持するためのオブジェクトとしての同じモデルです。
needle whistle playgroundは、ターミナルでマイクから文字起こしを行い、needle whistle compareは、Whistle、Whisper、Moonshineで同じクリップをタイミングとともに並べて実行します。
デプロイ
エンジンは、macOSおよびLinuxからAndroid、iOS、watchOS、Windows on ARM、RISC-V、MIPS、ブラウザ、WASIコンポーネントまで、17のターゲット向けにプリビルドで出荷されています。
各フォルダにはneedleバイナリ、libneedle.a、needle.hが含まれており、渡された.cactをロードします。
needle download macos-arm64 needle downloa