音訊課程文件

用於音訊分類的預訓練模型和資料集

Hugging Face's logo
加入 Hugging Face 社群

並獲得增強的文件體驗

開始使用

用於音訊分類的預訓練模型和資料集

Hugging Face Hub 上有超過 500 個用於音訊分類的預訓練模型。在本節中,我們將介紹一些最常見的音訊分類任務,併為每個任務推薦合適的預訓練模型。使用 pipeline() 類,在模型和任務之間切換非常簡單——一旦你知道如何為一個模型使用 pipeline(),你就可以用它來處理 Hub 上的任何模型,無需更改程式碼!這使得用 pipeline() 類進行實驗變得非常快,讓你能夠迅速為你的需求選擇最佳的預訓練模型。

在我們深入探討各種音訊分類問題之前,讓我們快速回顧一下通常使用的 Transformer 架構。標準的音訊分類架構是基於任務的性質而設計的;我們希望將一個音訊輸入序列(即我們的輸入音訊陣列)轉換成一個單一的類別標籤預測。僅編碼器(encoder-only)模型首先透過一個 Transformer 塊傳遞輸入,將輸入音訊序列對映到一個隱藏狀態表示序列。然後,這個隱藏狀態表示序列透過取所有隱藏狀態的平均值,並將得到的向量傳遞給一個線性分類層,從而對映到一個類別標籤輸出。因此,對於音訊分類,人們偏愛使用僅編碼器模型。

僅解碼器(decoder-only)模型給任務帶來了不必要的複雜性,因為它們假定輸出也可以是一個預測序列(而不是單個類別標籤預測),因此會生成多個輸出。因此,它們的推理速度較慢,通常不被使用。編碼器-解碼器(encoder-decoder)模型也因同樣的原因而基本被忽略。這些架構選擇與自然語言處理(NLP)中的選擇類似,在 NLP 中,像 BERT 這樣的僅編碼器模型更適合序列分類任務,而像 GPT 這樣的僅解碼器模型則保留給序列生成任務。

現在我們已經回顧了音訊分類的標準 Transformer 架構,讓我們開始探索音訊分類的不同子集,並介紹最流行的模型!

🤗 Transformers 安裝

在撰寫本文時,音訊分類 pipeline 所需的最新更新僅在 🤗 Transformers 倉庫的 main 分支上,而不在最新的 PyPi 版本中。為確保我們在本地擁有這些更新,我們將使用以下命令從 main 分支安裝 Transformers:

pip install git+https://github.com/huggingface/transformers

關鍵詞識別

關鍵詞識別(Keyword spotting, KWS)是在一段口語中識別出關鍵詞的任務。所有可能的關鍵詞構成了預測的類別標籤集。因此,要使用預訓練的關鍵詞識別模型,你應該確保你的關鍵詞與模型預訓練時所用的關鍵詞相匹配。下面,我們將介紹兩個用於關鍵詞識別的資料集和模型。

Minds-14

讓我們繼續使用你在上一個單元中探索過的 MINDS-14 資料集。如果你還記得,MINDS-14 包含了人們用多種語言和方言向電子銀行系統提問的錄音,併為每個錄音提供了 intent_class(意圖類別)。我們可以根據通話的意圖對錄音進行分類。

from datasets import load_dataset

minds = load_dataset("PolyAI/minds14", name="en-AU", split="train")

我們將載入 checkpoint "anton-l/xtreme_s_xlsr_300m_minds14",這是一個在 MINDS-14 上微調了大約 50 個 epoch 的 XLS-R 模型。它在 MINDS-14 的所有語言的評估集上達到了 90% 的準確率。

from transformers import pipeline

classifier = pipeline(
    "audio-classification",
    model="anton-l/xtreme_s_xlsr_300m_minds14",
)

最後,我們可以將一個樣本傳遞給分類 pipeline 來進行預測

classifier(minds[0]["audio"])

輸出

[
    {"score": 0.9631525278091431, "label": "pay_bill"},
    {"score": 0.02819698303937912, "label": "freeze"},
    {"score": 0.0032787492964416742, "label": "card_issues"},
    {"score": 0.0019414445850998163, "label": "abroad"},
    {"score": 0.0008378693601116538, "label": "high_value_payment"},
]

太棒了!我們識別出這次通話的意圖是支付賬單,機率為 96%。你可以想象這種關鍵詞識別系統被用作自動化呼叫中心的第一階段,我們希望根據客戶的查詢對來電進行分類,並相應地為他們提供情境化支援。

語音指令

Speech Commands 是一個口語詞彙的資料集,旨在評估音訊分類模型在簡單命令詞上的表現。該資料集包含 15 個關鍵詞類別,一個靜音類別,以及一個包含假陽性的未知類別。這 15 個關鍵詞是單個詞,通常用於裝置端控制基本任務或啟動其他程序。

一個類似的模型正在你的手機上持續執行。這裡,我們沒有單個命令詞,而是有特定於你裝置的“喚醒詞”,例如“Hey Google”或“Hey Siri”。當音訊分類模型檢測到這些喚醒詞時,它會觸發你的手機開始監聽麥克風,並使用語音識別模型來轉錄你的語音。

音訊分類模型比語音識別模型要小得多、輕量得多,通常只有幾百萬個引數,而語音識別模型則有數億個。因此,它可以在你的裝置上持續執行而不會耗盡電池!只有當檢測到喚醒詞時,才會啟動更大的語音識別模型,之後它會再次關閉。我們將在下一個單元中介紹用於語音識別的 Transformer 模型,所以到課程結束時,你應該具備構建自己的語音啟用助手所需的工具!

與 Hugging Face Hub 上的任何資料集一樣,我們可以在不下載或將其載入到記憶體的情況下,瞭解它包含的音訊資料型別。在 Hub 上訪問 Speech Commands 的資料集卡片後,我們可以使用資料集檢視器滾動瀏覽資料集的前 100 個樣本,聽取音訊檔案並檢查任何其他元資料資訊。

Diagram of datasets viewer.

資料集預覽是在決定使用某個音訊資料集之前體驗它的絕佳方式。你可以選擇 Hub 上的任何資料集,滾動瀏覽樣本,並收聽不同子集和分割的音訊,以判斷它是否適合你的需求。一旦你選定了資料集,載入資料以便開始使用就變得非常簡單。

讓我們就這樣做,使用流式模式載入 Speech Commands 資料集的一個樣本:

speech_commands = load_dataset(
    "speech_commands", "v0.02", split="validation", streaming=True
)
sample = next(iter(speech_commands))

我們將載入一個官方的 Audio Spectrogram Transformer checkpoint,它在 Speech Commands 資料集上進行了微調,其名稱空間為 "MIT/ast-finetuned-speech-commands-v2"

classifier = pipeline(
    "audio-classification", model="MIT/ast-finetuned-speech-commands-v2"
)
classifier(sample["audio"].copy())

輸出

[{'score': 0.9999892711639404, 'label': 'backward'},
 {'score': 1.7504888774055871e-06, 'label': 'happy'},
 {'score': 6.703040185129794e-07, 'label': 'follow'},
 {'score': 5.805884484288981e-07, 'label': 'stop'},
 {'score': 5.614546694232558e-07, 'label': 'up'}]

酷!看起來這個樣本以高機率包含了單詞“backward”。我們可以聽一下這個樣本來驗證這是否正確

from IPython.display import Audio

Audio(sample["audio"]["array"], rate=sample["audio"]["sampling_rate"])

現在,你可能想知道我們是如何選擇這些預訓練模型來在這些音訊分類示例中向你展示的。事實是,為你的資料集和任務找到預訓練模型非常直接!我們首先需要做的是訪問 Hugging Face Hub 並點選“Models”選項卡:https://huggingface.co/models

這將顯示 Hugging Face Hub 上的所有模型,按過去 30 天的下載量排序

你會注意到在左側,我們有一系列選項卡,可以選擇按任務、庫、資料集等篩選模型。向下滾動並從音訊任務列表中選擇“Audio Classification”任務

我們現在看到了 Hub 上 500 多個音訊分類模型的子集。為了進一步篩選這個選擇,我們可以按資料集篩選模型。點選“Datasets”選項卡,然後在搜尋框中輸入“speech_commands”。當你開始輸入時,你會看到 speech_commands 的選項出現在搜尋框下方。你可以點選這個按鈕,將所有音訊分類模型篩選為那些在 Speech Commands 資料集上微調過的模型

太棒了!我們看到,對於這個特定的資料集和任務,我們有 6 個預訓練模型可用。你會認出這些模型中的第一個就是我們在上一個示例中使用的 Audio Spectrogram Transformer checkpoint。在 Hub 上篩選模型的這個過程,正是我們選擇 checkpoint 來向你展示的方式!

語種識別

語種識別(Language identification, LID)是從候選語言列表中識別出音訊樣本中所說語言的任務。LID 可以在許多語音處理流水線中扮演重要角色。例如,對於一個未知語言的音訊樣本,可以使用 LID 模型來分類音訊樣本中所說的語言,然後選擇一個在該語言上訓練過的合適的語音識別模型來轉錄音訊。

FLEURS

FLEURS (Few-shot Learning Evaluation of Universal Representations of Speech) 是一個用於評估 102 種語言語音識別系統的資料集,其中包括許多被歸類為“低資源”的語言。請檢視 Hub 上的 FLEURS 資料集卡片,並探索其中包含的不同語言:google/fleurs。你能在裡面找到你的母語嗎?如果找不到,最接近的語言是什麼?

讓我們使用流式模式從 FLEURS 資料集的驗證集中載入一個樣本:

fleurs = load_dataset("google/fleurs", "all", split="validation", streaming=True)
sample = next(iter(fleurs))

太棒了!現在我們可以載入我們的音訊分類模型。為此,我們將使用一個在 FLEURS 資料集上微調過的 Whisper 版本,它目前是 Hub 上效能最好的 LID 模型。

classifier = pipeline(
    "audio-classification", model="sanchit-gandhi/whisper-medium-fleurs-lang-id"
)

然後我們可以將音訊透過我們的分類器並生成一個預測:

classifier(sample["audio"])

輸出

[{'score': 0.9999330043792725, 'label': 'Afrikaans'},
 {'score': 7.093023668858223e-06, 'label': 'Northern-Sotho'},
 {'score': 4.269149485480739e-06, 'label': 'Icelandic'},
 {'score': 3.2661141631251667e-06, 'label': 'Danish'},
 {'score': 3.2580724109720904e-06, 'label': 'Cantonese Chinese'}]

我們可以看到,模型以極高的機率(接近 1)預測該音訊為南非荷蘭語。FLEURS 資料集包含來自多種語言的音訊資料——我們可以看到可能的類別標籤包括北索托語、冰島語、丹麥語和粵語等。你可以在資料集卡片上找到完整的語言列表:google/fleurs

交給你了!你能在 Hub 上為 FLEURS LID 找到其他什麼 checkpoint 嗎?它們在底層使用了哪些 Transformer 模型?

零樣本音訊分類

在傳統的音訊分類正規化中,模型從一個*預定義*的可能類別集合中預測一個類別標籤。這為使用預訓練模型進行音訊分類設定了障礙,因為預訓練模型的標籤集必須與下游任務的標籤集相匹配。對於前面的 LID 示例,模型必須預測其訓練時所用的 102 個語種類別的其中之一。如果下游任務實際上需要 110 種語言,模型將無法預測這 110 種語言中的 8 種,因此需要重新訓練才能實現完全覆蓋。這限制了遷移學習在音訊分類任務中的有效性。

零樣本音訊分類是一種方法,它將一個在一組有標籤樣本上訓練的預訓練音訊分類模型,使其能夠對來自先前未見過的類別的新樣本進行分類。讓我們看看如何實現這一點!

目前,🤗 Transformers 支援一種用於零樣本音訊分類的模型:CLAP 模型。CLAP 是一個基於 Transformer 的模型,它同時接收音訊和文字作為輸入,並計算兩者之間的*相似度*。如果我們傳遞一個與音訊輸入高度相關的文字輸入,我們將得到一個高相似度分數。相反,傳遞一個與音訊輸入完全無關的文字輸入將返回一個低相似度。

我們可以利用這種相似度預測來進行零樣本音訊分類,方法是向模型傳遞一個音訊輸入和多個候選標籤。模型將為每個候選標籤返回一個相似度分數,我們可以選擇得分最高的那個作為我們的預測。

讓我們舉個例子,我們使用一個來自環境語音挑戰(ESC)資料集的音訊輸入。

dataset = load_dataset("ashraq/esc50", split="train", streaming=True)
audio_sample = next(iter(dataset))["audio"]["array"]

然後我們定義我們的候選標籤,它們構成了可能的分類標籤集。模型將為我們定義的每個標籤返回一個分類機率。這意味著我們需要*先驗地*知道我們分類問題中可能的標籤集,以便正確的標籤包含在該集合中,從而被賦予一個有效的機率分數。請注意,我們可以將完整的標籤集傳遞給模型,也可以傳遞我們認為包含正確標籤的手動選擇的子集。傳遞完整的標籤集會更詳盡,但代價是分類準確率較低,因為分類空間更大(前提是正確的標籤在我們選擇的標籤子集中)。

candidate_labels = ["Sound of a dog", "Sound of vacuum cleaner"]

我們可以將兩者都輸入到模型中,以找到與音訊輸入*最相似*的候選標籤。

classifier = pipeline(
    task="zero-shot-audio-classification", model="laion/clap-htsat-unfused"
)
classifier(audio_sample, candidate_labels=candidate_labels)

輸出

[{'score': 0.9997242093086243, 'label': 'Sound of a dog'}, {'score': 0.0002758323971647769, 'label': 'Sound of vacuum cleaner'}]

好的!模型似乎很確定我們聽到的是狗的聲音——它以 99.96% 的機率預測了它,所以我們就以此為預測。讓我們聽聽音訊樣本來確認我們是否正確(別把音量調得太高,否則你可能會被嚇一跳!)

Audio(audio_sample, rate=16000)

完美!我們聽到了狗叫聲 🐕,這與模型的預測一致。你可以嘗試使用不同的音訊樣本和不同的候選標籤進行實驗——你能否定義一組標籤,在整個 ESC 資料集上都有很好的泛化能力?提示:想一想在哪裡可以找到關於 ESC 中可能聲音的資訊,並據此構建你的標籤!

你可能想知道,為什麼我們不把零樣本音訊分類 pipeline 用於**所有**音訊分類任務?看起來我們可以透過*先驗地*定義合適的類別標籤來對任何音訊分類問題進行預測,從而繞開了我們的分類任務需要與模型預訓練時所用標籤相匹配的限制。這歸結於零樣本 pipeline 中使用的 CLAP 模型的性質:CLAP 是在*通用*音訊分類資料上預訓練的,類似於 ESC 資料集中的環境聲音,而不是像我們在 LID 任務中那樣的專門針對語音資料。如果你給它英語語音和西班牙語語音,CLAP 會知道這兩個例子都是語音資料 🗣️ 但它無法像專門的 LID 模型那樣區分這兩種語言。

接下來呢?

我們已經介紹了一些不同的音訊分類任務,並展示了最相關的資料集和模型,你可以從 Hugging Face Hub 下載它們,並使用 pipeline() 類僅需幾行程式碼即可使用。這些任務包括關鍵詞識別、語種識別和零樣本音訊分類。

但是,如果我們想做一些**新**的事情呢?我們已經廣泛地研究了語音處理任務,但這只是音訊分類的一個方面。另一個流行的音訊處理領域涉及**音樂**。雖然音樂的固有特徵與語音不同,但我們已經學到的許多相同原理也可以應用於音樂。

在下一節中,我們將透過一個分步指南,向你展示如何使用 🤗 Transformers 在音樂分類任務上微調一個 Transformer 模型。到最後,你將擁有一個微調好的 checkpoint,可以將其插入到 pipeline() 類中,使你能夠以與我們在這裡分類語音完全相同的方式來分類歌曲!

< > 在 GitHub 上更新

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