Parakeet Ultra ONNX(WebGPU 向け)
Parakeet Ultra(Moondream。NVIDIA Parakeet TDT 0.6B v3 を追加学習した欧州 25 言語の音声認識モデル)を、ブラウザの ONNX Runtime Web(WebGPU)で動かすために変換したものです。 エンコーダは 4 ビットに量子化し、WebGPU に実装の無い演算を分解してあります。fp16 を使わないので、shader-f16 に対応していない GPU でも動作する見込みです。
English summary: ONNX build of moondream/parakeet-ultra (a fine-tune of NVIDIA Parakeet TDT 0.6B v3 for 25 European languages) for in-browser inference with ONNX Runtime Web on WebGPU. The FastConformer encoder is quantized to 4-bit (MatMulNBits, block 32, symmetric) and its opset-23 Attention nodes are decomposed into MatMul/Softmax, because ONNX Runtime Web's WebGPU backend has no Attention kernel and falls back to the CPU. The TDT decoder/joint network is kept in fp32. No fp16 is used.
ブラウザで使う
ブラウザ内で完結する文字起こしツール Transcriber が、このリポジトリのモデルを使っています(WebGPU が使える PC で、スペイン語・ドイツ語・フランス語・イタリア語・ポルトガル語・ロシア語などのとき)。音声はサーバーへ送らず、推論はすべてブラウザの中で行います。
Used by Transcriber, an in-browser transcription tool. Audio never leaves the browser.
ファイル
| パス | 中身 | 大きさ |
|---|---|---|
int4/encoder.onnx |
エンコーダ(FastConformer)のグラフ。重みは外部データ | 0.5 MB |
int4/encoder.onnx.data |
エンコーダの重み(MatMulNBits の 4 ビット・ブロック 32・対称) | 424 MB |
fp32/decoder_joint.onnx |
TDT の予測ネット(LSTM 2 層・640)と joint(fp32。変換元の書き出しのまま) | 73 MB |
vocab.txt |
語彙(SentencePiece の片と id。0〜8191 の 8,192 個と、blank の <blk>(id 8192)) |
94 KB |
config.json |
変換元の設定(特徴量 128・間引き 8・1 フレームの最大トークン数 10) | — |
入出力の名前は onnx-asr の nemo-conformer-tdt の配置と同じです。
- encoder:
audio_signal[1, 128, T](float32)・length[1](int64)→outputs[1, 1024, T/8]・encoded_lengths - decoder_joint:
encoder_outputs[1, 1024, 1]・targets[1, 1](int32)・target_length[1]・input_states_1/input_states_2[2, 1, 640] →outputs(語彙 8,193 + duration 5 の logits)・output_states_1/output_states_2
推論の手順
- 16 kHz・モノラルの音声を、NeMo の
AudioToMelSpectrogramPreprocessor(推論時・dither なし)と同じ手順で log メルにする: プリエンファシス 0.97 → 両端に 256 の 0 → 窓 400(対称の Hann を 512 の中央に置く)・hop 160 の FFT 512 のパワー → メル 128(librosa の slaney、fp32)→ log(x + 2^-24) → 特徴ごとに平均と不偏標準偏差(+1e-5)で正規化。フレーム数は詰めない - encoder を WebGPU で回す
- TDT の貪欲法(NeMo の label-looping と同じ決まり): 各フレームで decoder_joint を呼び、トークンは logits の前半の argmax、進むフレーム数は後半 5 個(0〜4)の argmax。blank で duration が 0 なら 1 にする。予測ネットの状態と直前のトークンは、blank 以外を出したときだけ進める。同じフレームで 10 個出したら 1 フレーム進める
- トークンを語彙で文字にする(
▁は空白、<0xNN>は 1 バイト)。トークンを出したフレーム × 80 ms が時刻
言語の指定はありません(モデルが判定します)。句読点と大文字はモデルが出します。
元のモデルからの変更
- 変換元は maaaaat/parakeet-ultra-onnx(commit
b21e4175)の fp32 の書き出し(encoder-model.onnx・decoder_joint-model.onnx) - エンコーダの opset 23 の
Attentionを、等価な MatMul → ×1/√128 → +マスク → Softmax → MatMul に分解した(ONNX Runtime Web の WebGPU にAttentionの実装が無く、CPU で実行されて遅くなるため) - エンコーダの MatMul を
MatMulNBits(4 ビット・ブロック 32・対称・accuracy_level 4)に量子化した(onnxruntime 1.23 のMatMulNBitsQuantizer) - decoder_joint・語彙・設定は変換元のまま
確認(FLEURS のテスト分から各言語 100 発話、ONNX Runtime Web 1.26 の WebGPU、AMD Radeon 780M): 単語誤り率(WER)は en 5.7・es 4.2・de 6.3・fr 6.5・it 3.8・pt 5.6・ru 5.9%。 CPU で変換元の 8 ビットの書き出しを onnx-asr で回したもの(en 5.4・es 3.9・de 6.1・fr 6.2・it 3.8・pt 5.4・ru 6.5%)とほぼ同じです。速さは音声の 24〜29 倍速でした。 6 発話(45〜80 秒)をつないだ音声を 1 回で渡しても、15 秒・28 秒に区切っても、発話の抜けはありませんでした。
Checked on FLEURS test (100 utterances per language) with ONNX Runtime Web 1.26 on WebGPU (AMD Radeon 780M): WER en 5.7, es 4.2, de 6.3, fr 6.5, it 3.8, pt 5.6, ru 5.9 %, about the same as the 8-bit export on CPU with onnx-asr. 24–29× real time. No dropped utterances when six utterances (45–80 s) are passed as one segment.
ライセンス
CC BY 4.0。変換と上の変更は ryusei.io が行いました。
- モデル: moondream/parakeet-ultra(Moondream、CC BY 4.0)
- 元のモデル: nvidia/parakeet-tdt-0.6b-v3(NVIDIA、CC BY 4.0)
- ONNX への書き出し: maaaaat/parakeet-ultra-onnx(CC BY 4.0)
This repository is a modified version of the works above, licensed under CC BY 4.0. Changes: Attention decomposition and 4-bit quantization of the encoder (details above).
- Downloads last month
- 1,763
Model tree for ryusei-46/parakeet-ultra-ONNX-WebGPU
Base model
moondream/parakeet-ultra