🚀 Wav2vec2 德語模型
該模型基於 wav2vec-large-xlsr-53
,並使用德語 CommonVoice 數據集進行了微調。它在完整測試數據集上實現了 11.26 的字錯率(WER)。該模型基本是使用 Max Idahl 提供的代碼進行訓練的,僅在數據預處理和訓練參數方面做了小調整。
🚀 快速開始
你可以使用以下代碼轉錄自己的音頻文件。請注意,輸入文件必須是 *.wav 格式,以 16 kHz 編碼,並且為單聲道。若要使用 ffmpeg 轉換音頻文件,可使用命令:"ffmpeg -i input.wav -ar 16000 -ac 1 output.wav"。轉錄過程非常消耗內存(每 10 秒約 10GB)。如果腳本以 "Killed" 結束,意味著 Python 解釋器內存不足。這種情況下,請嘗試使用更短的音頻文件。
💻 使用示例
基礎用法
import soundfile as sf
import torch
from transformers import Wav2Vec2ForCTC, Wav2Vec2Tokenizer
tokenizer = Wav2Vec2Tokenizer.from_pretrained("Noricum/wav2vec2-large-xlsr-53-german")
model = Wav2Vec2ForCTC.from_pretrained("Noricum/wav2vec2-large-xlsr-53-german")
audio_input, _ = sf.read("/path/to/your/audio.wav")
input_values = tokenizer(audio_input, return_tensors="pt").input_values
logits = model(input_values).logits
predicted_ids = torch.argmax(logits, dim=-1)
transcription = tokenizer.batch_decode(predicted_ids)[0]
print(str(transcription))
高級用法
要在完整的 CommonVoice 測試數據集上評估該模型,請運行以下腳本:
import re
import torch
import torchaudio
from datasets import load_dataset, load_metric
from transformers import Wav2Vec2ForCTC, Wav2Vec2Processor
test_dataset = load_dataset("common_voice", "de", split="test")
wer = load_metric("wer")
processor = Wav2Vec2Processor.from_pretrained("Noricum/wav2vec2-large-xlsr-53-german")
model = Wav2Vec2ForCTC.from_pretrained("Noricum/wav2vec2-large-xlsr-53-german")
model.to("cuda")
chars_to_ignore_regex = '[\\\\,\\\\?\\\\.\\\\!\\\\-\\\\;\\\\:\\\\"\\\\“]'
resampler = torchaudio.transforms.Resample(48_000, 16_000)
def speech_file_to_array_fn(batch):
batch["sentence"] = re.sub(chars_to_ignore_regex, '', batch["sentence"]).lower()
speech_array, sampling_rate = torchaudio.load(batch["path"])
batch["speech"] = resampler(speech_array).squeeze().numpy()
return batch
test_dataset = test_dataset.map(speech_file_to_array_fn)
def evaluate(batch):
inputs = processor(batch["speech"], sampling_rate=16_000, return_tensors="pt", padding=True)
with torch.no_grad():
logits = model(inputs.input_values.to("cuda"), attention_mask=inputs.attention_mask.to("cuda")).logits
pred_ids = torch.argmax(logits, dim=-1)
batch["pred_strings"] = processor.batch_decode(pred_ids)
return batch
result = test_dataset.map(evaluate, batched=True, batch_size=4)
import jiwer
def chunked_wer(targets, predictions, chunk_size=None):
if chunk_size is None: return jiwer.wer(targets, predictions)
start = 0
end = chunk_size
H, S, D, I = 0, 0, 0, 0
while start < len(targets):
chunk_metrics = jiwer.compute_measures(targets[start:end], predictions[start:end])
H = H + chunk_metrics["hits"]
S = S + chunk_metrics["substitutions"]
D = D + chunk_metrics["deletions"]
I = I + chunk_metrics["insertions"]
start += chunk_size
end += chunk_size
return float(S + D + I) / float(H + S + D)
print("Total (chunk_size=1000), WER: {:2f}".format(100 * chunked_wer(result["pred_strings"], result["sentence"], chunk_size=1000)))
輸出結果:Total (chunk_size=1000), WER: 11.256522
⚠️ 重要提示
輸入文件必須是 *.wav 格式,以 16 kHz 編碼,並且為單聲道。轉錄過程非常消耗內存(每 10 秒約 10GB)。如果腳本以 "Killed" 結束,意味著 Python 解釋器內存不足。這種情況下,請嘗試使用更短的音頻文件。
💡 使用建議
若要使用 ffmpeg 轉換音頻文件,可使用命令:"ffmpeg -i input.wav -ar 16000 -ac 1 output.wav"。在評估模型時,可使用 "test[:1%]" 對 1% 的樣本進行測試。