模型概述
模型特點
模型能力
使用案例
🚀 wav2vec 2.0 多語言(微調版)
wav2vec 2.0 多語言(微調版)模型基於 16kHz 採樣的語音音頻進行預訓練。該模型可用於下游任務,如自動語音識別,能有效提升語音識別效果。
🚀 快速開始
基礎模型在 16kHz 採樣的語音音頻上進行了預訓練。使用該模型時,請確保輸入的語音也採樣於 16kHz。請注意,此模型需要在下游任務(如自動語音識別)上進行微調。更多信息請查看 此博客。
作者:Alexis Conneau、Alexei Baevski、Ronan Collobert、Abdelrahman Mohamed、Michael Auli
摘要:本文介紹了 XLSR,它通過從多種語言的語音原始波形中預訓練單個模型,學習跨語言的語音表示。我們基於 wav2vec 2.0 構建,該模型通過在掩碼潛在語音表示上解決對比任務進行訓練,並聯合學習跨語言共享的潛在量化。最終的模型在標記數據上進行微調,實驗表明,跨語言預訓練明顯優於單語言預訓練。在 CommonVoice 基準測試中,與已知的最佳結果相比,XLSR 的音素錯誤率相對降低了 72%。在 BABEL 上,與可比系統相比,我們的方法使單詞錯誤率相對降低了 16%。我們的方法實現了一個具有競爭力的單一多語言語音識別模型。分析表明,潛在的離散語音表示在不同語言之間共享,相關語言之間的共享程度更高。我們希望通過發佈 XLSR - 53(一個在 53 種語言上預訓練的大型模型)來推動低資源語音理解的研究。
原始模型可在 https://github.com/pytorch/fairseq/tree/master/examples/wav2vec#wav2vec-20 找到。
本模型在波斯語(法爾西語)上對 facebook/wav2vec2 - large - xlsr - 53 進行了微調,使用了 Common Voice 以及我們自己創建的數據集(佔總數據集的 1/3)。使用此模型時,請確保輸入的語音採樣率為 16kHz。
✨ 主要特性
- 基於 16kHz 採樣語音音頻預訓練,適用於語音識別等下游任務。
- 跨語言預訓練,在多語言語音識別中表現出色。
- 微調後的模型在波斯語語音識別上有較好效果。
📦 安裝指南
# 所需的包
!pip install git+https://github.com/huggingface/datasets.git
!pip install git+https://github.com/huggingface/transformers.git
!pip install torchaudio
!pip install librosa
!pip install jiwer
!pip install parsivar
!pip install num2fawords
# 歸一化器
!wget -O normalizer.py https://huggingface.co/m3hrdadfi/"wav2vec2-large-xlsr-persian-v3/raw/main/dictionary.py
!wget -O normalizer.py https://huggingface.co/m3hrdadfi/"wav2vec2-large-xlsr-persian-v3/raw/main/normalizer.py
💻 使用示例
基礎用法
如果你不確定轉錄內容是否乾淨(存在奇怪字符或其他字母字符),可以使用 m3hrdadfi/wav2vec2 - large - xlsr - persian - v3 提供的代碼進行清理。
from normalizer import normalizer
def cleaning(text):
if not isinstance(text, str):
return None
return normalizer({"sentence": text}, return_dict=False)
# 用你自己的數據目錄編輯這些部分
data_dir = "data"
test = pd.read_csv(f"{data_dir}/yourtest.tsv", sep=" ")
test["path"] = data_dir + "/clips/" + test["path"]
print(f"Step 0: {len(test)}")
test["status"] = test["path"].apply(lambda path: True if os.path.exists(path) else None)
test = test.dropna(subset=["path"])
test = test.drop("status", 1)
print(f"Step 1: {len(test)}")
test["sentence"] = test["sentence"].apply(lambda t: cleaning(t))
test = test.dropna(subset=["sentence"])
print(f"Step 2: {len(test)}")
test = test.reset_index(drop=True)
print(test.head())
test = test[["path", "sentence"]]
test.to_csv("/content/test.csv", sep=" ", encoding="utf-8", index=False)
高級用法
預測
import numpy as np
import pandas as pd
import librosa
import torch
import torchaudio
from transformers import Wav2Vec2ForCTC, Wav2Vec2Processor
from datasets import load_dataset, load_metric
import IPython.display as ipd
model_name_or_path = "masoudmzb/wav2vec2-xlsr-multilingual-53-fa"
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(model_name_or_path, device)
processor = Wav2Vec2Processor.from_pretrained(model_name_or_path)
model = Wav2Vec2ForCTC.from_pretrained(model_name_or_path).to(device)
def speech_file_to_array_fn(batch):
speech_array, sampling_rate = torchaudio.load(batch["path"])
speech_array = speech_array.squeeze().numpy()
speech_array = librosa.resample(np.asarray(speech_array), sampling_rate, processor.feature_extractor.sampling_rate)
batch["speech"] = speech_array
return batch
def predict(batch):
features = processor(
batch["speech"],
sampling_rate=processor.feature_extractor.sampling_rate,
return_tensors="pt",
padding=True
)
input_values = features.input_values.to(device)
attention_mask = features.attention_mask.to(device)
with torch.no_grad():
logits = model(input_values, attention_mask=attention_mask).logits
pred_ids = torch.argmax(logits, dim=-1)
batch["predicted"] = processor.batch_decode(pred_ids)
return batch
# 用你自己的數據目錄編輯這些部分
dataset = load_dataset("csv", data_files={"test": "/path_to/your_test.csv"}, delimiter=" ")["test"]
dataset = dataset.map(speech_file_to_array_fn)
result = dataset.map(predict, batched=True, batch_size=4)
計算 WER 分數
wer = load_metric("wer")
print("WER: {:.2f}".format(100 * wer.compute(predictions=result["predicted"], references=result["sentence"])))
輸出結果
max_items = np.random.randint(0, len(result), 20).tolist()
for i in max_items:
reference, predicted = result["sentence"][i], result["predicted"][i]
print("reference:", reference)
print("predicted:", predicted)
print('---')
🔧 技術細節
評估
我們在私有數據集上對模型進行了評估,該數據集包含不同類型的音頻(遺憾的是,用於測試和驗證的數據集未公開,但你可以 點擊此鏈接查看數據集示例):
名稱 | 測試數據集(WER) |
---|---|
m3hrdadfi/wav2vec2 - large - xlsr - persian - v3 | 0.56754 |
此新模型 | 0.40815 |
基礎多語言模型 | 0.69746 |
- 此表顯示,添加更多數據可獲得更好的結果。
訓練詳情
之前有一個模型在波斯語 Mozilla 數據集上進行了訓練,因此我們決定在此基礎上繼續訓練。模型從 mehrdadfa
的 檢查點 進行熱啟動。
- 更多詳細信息,你可以查看 🤗 模型中心的模型卡片中的
config.json
。 - 模型訓練了 84000 步,相當於 12.42 個 epoch。
- 用於微調的基礎模型為 https://huggingface.co/m3hrdadfi/wav2vec2-large-xlsr-persian-v3/tree/main。
微調建議
進行微調時,你可以查看以下鏈接。但請注意一些提示,你可能需要進行梯度累積,因為你可能需要更大的批量大小。有許多超參數需要確保正確設置:
- learning_rate
- attention_dropout
- hidden_dropout
- feat_proj_dropout
- mask_time_prob
- layer_drop
微調示例
數據集 | 微調示例 |
---|---|
在 Mozilla 土耳其語數據集上微調 | |
其他數據集和其他語言的示例代碼 | github 鏈接 |
📄 許可證
若你對模型、預訓練、代碼或出版物有技術問題,請在倉庫中創建一個 issue,這是聯繫我們的最快方式。
引用
我們尚未就該工作發表任何論文。不過,如果你使用了該模型,請按以下格式正確引用我們:
@misc{wav2vec2-xlsr-multilingual-53-fa,
author = {Paparnchi, Seyyed Mohammad Masoud},
title = {wav2vec2-xlsr-multilingual-53-fa},
year = 2021,
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {\url{https://github.com/Hamtech-ai/wav2vec2-fa}},
}



