音訊課程文件

預處理音訊資料集

Hugging Face's logo
加入 Hugging Face 社群

並獲得增強的文件體驗

開始使用

預處理音訊資料集

使用 🤗 Datasets 載入資料集只是樂趣的一半。如果你打算將其用於訓練模型或執行推理,你需要先預處理資料。通常,這將涉及以下步驟:

  • 重取樣音訊資料
  • 過濾資料集
  • 將音訊資料轉換為模型期望的輸入

重取樣音訊資料

load_dataset 函式會下載以其釋出時的取樣率釋出的音訊示例。這並非總是你計劃訓練或用於推理的模型所期望的取樣率。如果取樣率存在差異,你可以將音訊重取樣到模型期望的取樣率。

大多數可用的預訓練模型都是以 16 kHz 的取樣率在音訊資料集上進行預訓練的。當我們探索 MINDS-14 資料集時,你可能已經注意到它的取樣率是 8 kHz,這意味著我們可能需要對其進行升取樣。

為此,請使用 🤗 Datasets 的 cast_column 方法。此操作不會原地更改音訊,而是指示資料集在載入時動態地重取樣音訊示例。以下程式碼會將取樣率設定為 16kHz:

from datasets import Audio

minds = minds.cast_column("audio", Audio(sampling_rate=16_000))

重新載入 MINDS-14 資料集中的第一個音訊示例,並檢查它是否已重取樣到所需的 取樣率

minds[0]

輸出

{
    "path": "/root/.cache/huggingface/datasets/downloads/extracted/f14948e0e84be638dd7943ac36518a4cf3324e8b7aa331c5ab11541518e9368c/en-AU~PAY_BILL/response_4.wav",
    "audio": {
        "path": "/root/.cache/huggingface/datasets/downloads/extracted/f14948e0e84be638dd7943ac36518a4cf3324e8b7aa331c5ab11541518e9368c/en-AU~PAY_BILL/response_4.wav",
        "array": array(
            [
                2.0634243e-05,
                1.9437837e-04,
                2.2419340e-04,
                ...,
                9.3852862e-04,
                1.1302452e-03,
                7.1531429e-04,
            ],
            dtype=float32,
        ),
        "sampling_rate": 16000,
    },
    "transcription": "I would like to pay my electricity bill using my card can you please assist",
    "intent_class": 13,
}

你可能會注意到陣列值現在也不同了。這是因為我們現在擁有的振幅值是以前的兩倍。

💡 重取樣的背景知識:如果一個音訊訊號以 8 kHz 取樣,即每秒有 8000 個取樣讀數,我們知道該音訊不包含任何超過 4 kHz 的頻率。這由奈奎斯特取樣定理保證。因此,我們可以確定在取樣點之間,原始連續訊號始終會形成一條平滑曲線。升取樣到更高的取樣率,就是透過近似這條曲線來計算現有采樣點之間的額外取樣值。然而,降取樣要求我們首先濾除任何高於新奈奎斯特極限的頻率,然後才能估算新的取樣點。換句話說,你不能僅僅透過丟棄每隔一個樣本來以 2 倍的因子進行降取樣——這會在訊號中產生稱為混疊的失真。正確進行重取樣非常棘手,最好留給經過良好測試的庫,例如 librosa 或 🤗 Datasets。

過濾資料集

你可能需要根據某些標準過濾資料。其中一種常見情況是將音訊示例限制在一定時長內。例如,我們可能希望過濾掉任何超過 20 秒的示例,以防止在訓練模型時出現記憶體不足錯誤。

我們可以透過使用 🤗 Datasets 的 filter 方法並向其傳遞一個包含過濾邏輯的函式來完成此操作。讓我們首先編寫一個函式,指示哪些示例保留,哪些丟棄。這個函式 is_audio_length_in_range 如果樣本短於 20 秒則返回 True,如果長於 20 秒則返回 False

MAX_DURATION_IN_SECONDS = 20.0


def is_audio_length_in_range(input_length):
    return input_length < MAX_DURATION_IN_SECONDS

過濾函式可以應用於資料集的列,但此資料集中我們沒有音訊軌道持續時間列。但是,我們可以建立一個,根據該列中的值進行過濾,然後將其刪除。

# use librosa to get example's duration from the audio file
new_column = [librosa.get_duration(path=x) for x in minds["path"]]
minds = minds.add_column("duration", new_column)

# use 🤗 Datasets' `filter` method to apply the filtering function
minds = minds.filter(is_audio_length_in_range, input_columns=["duration"])

# remove the temporary helper column
minds = minds.remove_columns(["duration"])
minds

輸出

Dataset({features: ["path", "audio", "transcription", "intent_class"], num_rows: 624})

我們可以驗證資料集已從 654 個示例篩選到 624 個。

預處理音訊資料

處理音訊資料集最具挑戰性的方面之一是為模型訓練準備正確格式的資料。正如你所看到的,原始音訊資料以樣本值陣列的形式存在。然而,預訓練模型,無論是用於推理還是針對你的任務進行微調,都期望將原始資料轉換為輸入特徵。輸入特徵的要求可能因模型而異——它們取決於模型的架構以及用於預訓練的資料。好訊息是,對於每個受支援的音訊模型,🤗 Transformers 都提供了一個特徵提取器類,可以將原始音訊資料轉換為模型期望的輸入特徵。

那麼特徵提取器對原始音訊資料做了什麼?讓我們看看 Whisper 的特徵提取器,以瞭解一些常見的特徵提取轉換。Whisper 是由 OpenAI 的 Alec Radford 等人於 2022 年 9 月釋出的用於自動語音識別 (ASR) 的預訓練模型。

首先,Whisper 特徵提取器對一批音訊示例進行填充/截斷,使所有示例的輸入長度均為 30 秒。短於此的示例透過在序列末尾附加零(音訊訊號中的零對應於無訊號或靜音)填充到 30 秒。長於 30 秒的示例被截斷為 30 秒。由於批處理中的所有元素都被填充/截斷到輸入空間中的最大長度,因此不需要注意力掩碼。Whisper 在這方面是獨一無二的,大多數其他音訊模型需要一個注意力掩碼,詳細說明序列在哪裡被填充,因此它們應該在自注意力機制中被忽略。Whisper 經過訓練,可以在沒有注意力掩碼的情況下執行,並直接從語音訊號中推斷出在哪裡忽略輸入。

Whisper 特徵提取器執行的第二個操作是將填充的音訊陣列轉換為對數梅爾譜圖。回想一下,這些譜圖描述了訊號頻率如何隨時間變化,以梅爾刻度表示,並以分貝(對數部分)測量,以使頻率和振幅更符合人類聽覺。

所有這些轉換都可以通過幾行程式碼應用於您的原始音訊資料。讓我們繼續從預訓練的 Whisper 檢查點載入特徵提取器,以便為我們的音訊資料做好準備。

from transformers import WhisperFeatureExtractor

feature_extractor = WhisperFeatureExtractor.from_pretrained("openai/whisper-small")

接下來,你可以編寫一個函式,透過 `feature_extractor` 處理單個音訊示例。

def prepare_dataset(example):
    audio = example["audio"]
    features = feature_extractor(
        audio["array"], sampling_rate=audio["sampling_rate"], padding=True
    )
    return features

我們可以使用 🤗 Datasets 的 map 方法將資料準備函式應用於所有訓練示例。

minds = minds.map(prepare_dataset)
minds

輸出

Dataset(
    {
        features: ["path", "audio", "transcription", "intent_class", "input_features"],
        num_rows: 624,
    }
)

就這樣簡單,我們現在在資料集中有了作為 `input_features` 的對數梅爾頻譜圖。

讓我們在 `minds` 資料集中的一個示例上將其視覺化。

import numpy as np

example = minds[0]
input_features = example["input_features"]

plt.figure().set_figwidth(12)
librosa.display.specshow(
    np.asarray(input_features[0]),
    x_axis="time",
    y_axis="mel",
    sr=feature_extractor.sampling_rate,
    hop_length=feature_extractor.hop_length,
)
plt.colorbar()
Log mel spectrogram plot

現在你可以看到預處理後輸入到 Whisper 模型的音訊是什麼樣子了。

模型的特徵提取器類負責將原始音訊資料轉換為模型期望的格式。然而,許多涉及音訊的任務都是多模態的,例如語音識別。在這種情況下,🤗 Transformers 還提供模型特定的分詞器來處理文字輸入。有關分詞器的深入瞭解,請參閱我們的 NLP 課程

您可以分別載入 Whisper 和其他多模態模型的特徵提取器和分詞器,也可以透過所謂的處理器同時載入兩者。為了更簡單,請使用 `AutoProcessor` 從檢查點載入模型的特徵提取器和處理器,如下所示:

from transformers import AutoProcessor

processor = AutoProcessor.from_pretrained("openai/whisper-small")

在這裡,我們展示了基本的資料準備步驟。當然,自定義資料可能需要更復雜的預處理。在這種情況下,你可以擴充套件 `prepare_dataset` 函式來執行任何型別的自定義資料轉換。使用 🤗 Datasets,只要你能將其編寫為 Python 函式,就可以 將其應用於 你的資料集!

< > 在 GitHub 上更新

© . This site is unofficial and not affiliated with Hugging Face, Inc.