HN 日本語サマリー

← 一覧へ戻る
AI・機械学習

Whistle: 16.9MBで実現する音声認識

Whistle: Speech to Text in 16.9 MB (cactuscompute.com)

227 pointsby gmays59 コメント

要約

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