Transformers documentation
特徴量抽出器
特徴量抽出器
Feature extractorsは、指定されたモデルに適合する形式に音声データを前処理します。生の音声信号を受け取り、モデルに入力できるテンソルに変換します。テンソルの形状はモデルによって異なりますが、Feature extractorsは使用しているモデルに基づいて、音声データを正しく前処理してくれます。また、Feature extractorsには、パディング、切り詰め、リサンプリングのためのメソッドも含まれています。
from_pretrained() を呼び出して、Hugging Face Hub またはローカルディレクトリからフィーチャーエクストラクターとそのプリプロセッサー設定を読み込みます。フィーチャーエクストラクターとプリプロセッサーの設定は、preprocessor_config.json ファイルに保存されます。
array に格納されているオーディオ信号を特徴量抽出器に渡し、sampling_rate パラメータを事前学習済みオーディオモデルのサンプリングレートに設定します。オーディオデータのサンプリングレートが、事前学習済みオーディオモデルの学習に使用されたデータのサンプリングレートと一致していることが重要です。
from transformers import AutoFeatureExtractor
feature_extractor = AutoFeatureExtractor.from_pretrained("facebook/wav2vec2-base")
dataset = load_dataset("PolyAI/minds14", name="en-US", split="train")
processed_sample = feature_extractor(dataset[0]["audio"]["array"], sampling_rate=16000)
processed_sample
{'input_values': [array([ 9.4472744e-05, 3.0777880e-03, -2.8888427e-03, ...,
-2.8888427e-03, 9.4472744e-05, 9.4472744e-05], dtype=float32)]}フィーチャーエクストラクターは、モデルが処理できる状態の、input_valuesを返します。
このガイドでは、フィーチャーエクストラクターのクラスと、オーディオデータの前処理方法について説明します。
Feature extractorクラス
Transformers のフィーチャーエクストラクターは、FeatureExtractionMixin をサブクラスとするベースクラス SequenceFeatureExtractor を継承しています。
- SequenceFeatureExtractor は、シーケンスの長さが揃わないことを避けるために、シーケンスを特定の長さにpad()するメソッドを提供します。
- FeatureExtractionMixin は、フィーチャーエクストラクターの読み込みと保存のために from_pretrained() および save_pretrained() を提供します。
フィーチャーエクストラクターを読み込む方法には2つあります。AutoFeatureExtractorと、モデル固有のフィーチャーエクストラクタークラスです。
AutoClass API は、指定されたモデルに対応する正しいフィーチャーエクストラクターを自動的に読み込みます。
from_pretrained()を使用して、フィーチャーエクストラクターを読み込みます。
from transformers import AutoFeatureExtractor
feature_extractor = AutoFeatureExtractor.from_pretrained("openai/whisper-tiny")事前学習済みのオーディオモデルには、オーディオデータを正しく処理するための特定のフィーチャーエクストラクターが関連付けられています。フィーチャーエクストラクターを読み込むと、preprocessor_config.json からフィーチャーエクストラクターの設定(フィーチャーサイズ、チャンク長など)が取得されます。
フィーチャーエクストラクターは、モデル固有のクラスから直接読み込むことができます。
from transformers import WhisperFeatureExtractor
feature_extractor = WhisperFeatureExtractor.from_pretrained("openai/whisper-tiny")前処理
フィーチャーエクストラクターは、特定の形状のPyTorchテンソルを入力として期待します。正確な入力の形状は、使用している具体的なオーディオモデルによって異なります。
例えば、Whisperはinput_featuresが(batch_size, feature_size, sequence_length)の形状を持つテンソルであることを期待しますが、Wav2Vec2はinput_valuesが(batch_size, sequence_length)の形状を持つテンソルであることを期待します。
feature extractorは、使用しているオーディオモデルに応じて、適切な入力形状を生成します。
feature extractorは、音声ファイルのサンプリングレート(1秒あたりに取得する音声シグナルの値の個数)も設定します。音声データのサンプリングレートは、事前学習モデルが学習に使用したデータセットのサンプリングレートと一致する必要があります。この値は、通常、モデルカードに記載されています。
from_pretrained()でデータセットとフィーチャーエクストラクターを読み込みます。
from datasets import load_dataset, Audio
from transformers import AutoFeatureExtractor
dataset = load_dataset("PolyAI/minds14", name="en-US", split="train")
feature_extractor = AutoFeatureExtractor.from_pretrained("facebook/wav2vec2-base")データセットの最初の例を確認し、生のオーディオ信号であるarrayを含むaudio列にアクセスします。
dataset[0]["audio"]["array"]
array([ 0. , 0.00024414, -0.00024414, ..., -0.00024414,
0. , 0. ])フィーチャーエクストラクターは、arrayを、指定されたオーディオモデルが期待する入力形式に前処理します。適切なサンプリングレートを設定するには、sampling_rateパラメーターを使用してください。
processed_dataset = feature_extractor(dataset[0]["audio"]["array"], sampling_rate=16000)
processed_dataset
{'input_values': [array([ 9.4472744e-05, 3.0777880e-03, -2.8888427e-03, ...,
-2.8888427e-03, 9.4472744e-05, 9.4472744e-05], dtype=float32)]}パディング
長さが異なる音声シーケンスは問題です。Transformers は、バッチ処理できるようにすべてのシーケンスが同じ長さであることを前提としています。長さが揃わないシーケンスはバッチ処理できません。
dataset[0]["audio"]["array"].shape
(86699,)
dataset[1]["audio"]["array"].shape
(53248,)Padding は、すべてのシーケンスが同じ長さになるように、特別な padding token を追加します。フィーチャーエクストラクターは、array をパディングするために、0(無音として解釈されます)を追加します。padding=True を設定すると、バッチ内の最長のシーケンスの長さに合わせてパディングが行われます。
def preprocess_function(examples):
audio_arrays = [x["array"] for x in examples["audio"]]
inputs = feature_extractor(
audio_arrays,
sampling_rate=16000,
padding=True,
)
return inputs
processed_dataset = preprocess_function(dataset[:5])
processed_dataset["input_values"][0].shape
(86699,)
processed_dataset["input_values"][1].shape
(86699,)切り詰め
モデルは、クラッシュする前に処理できるシーケンスの長さに上限があります。
Truncationは、シーケンスが最大長を超えないように余分なトークンを削除するための戦略です。truncation=Trueを設定すると、シーケンスはmax_lengthパラメータで指定された長さに切り詰められます。
def preprocess_function(examples):
audio_arrays = [x["array"] for x in examples["audio"]]
inputs = feature_extractor(
audio_arrays,
sampling_rate=16000,
max_length=50000,
truncation=True,
)
return inputs
processed_dataset = preprocess_function(dataset[:5])
processed_dataset["input_values"][0].shape
(50000,)
processed_dataset["input_values"][1].shape
(50000,)リサンプリング
Datasets ライブラリは、音声モデルが想定するサンプリングレートに合わせて音声データをリサンプリングすることもできます。このメソッドは、データが読み込まれる際にオンザフライで音声データをリサンプリングするため、データセット全体をインプレースでリサンプリングするよりも高速になる場合があります。
作業中の音声データセットのサンプリングレートは8kHzですが、事前学習済みモデルは16kHzを前提としています。
dataset[0]["audio"]
{'path': '/root/.cache/huggingface/datasets/downloads/extracted/f507fdca7f475d961f5bb7093bcc9d544f16f8cab8608e772a2ed4fbeb4d6f50/en-US~JOINT_ACCOUNT/602ba55abb1e6d0fbce92065.wav',
'array': array([ 0. , 0.00024414, -0.00024414, ..., -0.00024414,
0. , 0. ]),
'sampling_rate': 8000}audio 列に対して cast_column を呼び出し、サンプリングレートを 16kHz にアップサンプリングします。
dataset = dataset.cast_column("audio", Audio(sampling_rate=16000))データセットのサンプルを読み込むと、現在は16kHzにリサンプリングされます。
dataset[0]["audio"]
{'path': '/root/.cache/huggingface/datasets/downloads/extracted/f507fdca7f475d961f5bb7093bcc9d544f16f8cab8608e772a2ed4fbeb4d6f50/en-US~JOINT_ACCOUNT/602ba55abb1e6d0fbce92065.wav',
'array': array([ 1.70562416e-05, 2.18727451e-04, 2.28099874e-04, ...,
3.43842403e-05, -5.96364771e-06, -1.76846661e-05]),
'sampling_rate': 16000}