🤗 Transformersを使用して、Wav2Vec2を使用して大規模なファイルで自動音声認識を行う方法
'🤗 TransformersとWav2Vec2を使って大規模なファイルの自動音声認識を行う方法'
Tl;dr: この投稿では、Connectionist Temporal Classification(CTC)アーキテクチャの特性を活用して、任意の長さのファイルやライブ推論中でも非常に良い品質の自動音声認識(ASR)を実現する方法を説明します。
Wav2Vec2は、音声認識のための人気のある事前学習モデルです。Meta AI Researchによって2020年9月にリリースされ、この新しいアーキテクチャは、自己教師あり事前学習における音声認識の進歩を促進しました(例:G. Ng et al.、2021年、Chen et al.、2021年、Hsu et al.、2021年、Babu et al.、2021年)。Hugging Face Hubでは、Wav2Vec2の最も人気のある事前学習チェックポイントは、現在月間25万回以上ダウンロードされています。
Wav2Vec2は、その核としてtransformersモデルを使用しており、transformersの注意点の1つは、通常、扱えるシーケンスの長さに限界があることです。それは位置符号化を使用するためではなく(この場合は違います)、単純にtransformersの注意コストが実際にはO(n²)となり、非常に大きなシーケンス長を使用すると複雑さやメモリの使用量が爆発します。したがって、非常に長いファイルでさえWav2Vec2を実行することはできません(たとえA100のような非常に大きなGPUを使用しても)。プログラムはクラッシュします。試してみましょう!
pip install transformers
from transformers import pipeline
# これはhttps://huggingface.co/models?pipeline_tag=automatic-speech-recognitionの何千ものモデルのうちどれでも動作します
pipe = pipeline(model="facebook/wav2vec2-base-960h")
# テストに使用するPublic Domain LibriVoxファイル
#!wget https://ia902600.us.archive.org/8/items/thecantervilleghostversion_2_1501_librivox/thecantervilleghostversion2_01_wilde_128kb.mp3 -o very_long_file.mp3
pipe("very_long_file.mp3")
# メモリ不足でクラッシュします!
pipe("very_long_file.mp3", chunk_length_s=10)
# これは動作し、非常に長い文字列が表示されます!
# このブログポスト全体で、問題を解決する方法について説明します
シンプルなチャンキング
非常に長いファイルでの推論を実現する最も簡単な方法は、初期のオーディオを短いサンプル(例えば10秒ずつ)に単純に分割し、それらに対して推論を実行し、最終的な再構成を行うことです。これは計算的に効率的ですが、通常は劣った結果になります。その理由は、良い推論を行うためにはモデルがいくつかの文脈を必要とするためであり、チャンキングの境界付近では推論の品質が低くなる傾向があるからです。
次の図を見てください:
一般的な方法で問題を解決しようとする方法はありますが、完全に堅牢ではありません。無音のときにのみチャンク化しようとすることができますが、長い時間(曲や騒々しいカフェの音声など)にわたって無音でないオーディオがあるかもしれません。音声がないときにのみカットしようとすることもできますが、別のモデルが必要であり、これは完全に解決された問題ではありません。また、非常に長い時間にわたって連続した音声があるかもしれません。
実際には、Wav2Vec2で使用されているCTC構造を利用することで、これらの問題に陥ることなく非常に堅牢な音声認識を実現できます。
ストライド付きのチャンキング
Wav2Vec2はCTCアルゴリズムを使用しており、そのため、オーディオの各フレームが単一の文字予測(ロジット)にマッピングされます。
それが私たちがstride
を追加するために使用する主な機能です。このリンクは画像の文脈で説明していますが、音声に対しても同じ概念です。この特性のおかげで、次のことができます:
- オーバーラップするチャンクで推論を開始し、モデルが中心部分で適切な文脈を持つようにします。
- 推論されたロジットをサイドにドロップします。
- ドロップされたサイドを持たないロジットをチェインして、フルレングスのオーディオに対してモデルが予測したものに非常に近いものを復元します。
これは、モデルをファイル全体で実行するのとは厳密には異なるため、デフォルトでは有効になっていませんが、前の例で見たように、chunk_length_s
をpipeline
に追加するだけで動作します。
実際には、ほとんどの誤った推論はストライド内に保持され、推論の前にドロップされるため、完全なテキストの適切な推論が行われます。
このテクニックのすべての引数を選択できることに注意しましょう:
from transformers import pipeline
pipe = pipeline(model="facebook/wav2vec2-base-960h")
# stride_length_sは、左側と右側のストライドの長さのタプルです。
# 1つの数値の場合、両側に同じストライドが適用されます。デフォルトでは
# 1つの側のstride_lengthはchunk_length_sの1/6です。
output = pipe("very_long_file.mp3", chunk_length_s=10, stride_length_s=(4, 2))
LMを使用したモデルのストライド付きチャンキング
transformersでは、Wav2Vec2にLMを追加して、微調整することなくモデルのWER性能を向上させるサポートも追加しました。この優れたブログポストでその動作方法を説明しています。
実際には、LMはロジット自体に直接作用するため、前とまったく同じテクニックを修正することなく適用することができます!したがって、これらのLMブーストモデルでは、大きなファイルのチャンキングもそのまま使用できます。
ライブ推論
Wav2vec2のようなCTCモデルを使用する非常に良い利点は、それが単一パスモデルであるため、非常に高速であることです。特にGPU上では。これを利用してライブ推論を行うことができます。
原理は通常のストライディングとまったく同じですが、今回はパイプラインデータを受信しているときのままフィードし、たとえば1秒のストライドを使用して10秒の長さのフルチャンクでストライディングを行い、適切なコンテキストを得ることができます。
これには、単純なファイルのチャンキングよりもはるかに多くの推論ステップを実行する必要がありますが、モデルは何かを表示するまでX秒待つ必要がないため、ライブエクスペリエンスがより良くなる可能性があります。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles