初始化项目,由ModelHub XC社区提供模型
Model: sakares/wav2vec2-large-xlsr-thai-demo Source: Original Platform
This commit is contained in:
16
.gitattributes
vendored
Normal file
16
.gitattributes
vendored
Normal file
@@ -0,0 +1,16 @@
|
||||
*.bin.* filter=lfs diff=lfs merge=lfs -text
|
||||
*.lfs.* filter=lfs diff=lfs merge=lfs -text
|
||||
*.bin filter=lfs diff=lfs merge=lfs -text
|
||||
*.h5 filter=lfs diff=lfs merge=lfs -text
|
||||
*.tflite filter=lfs diff=lfs merge=lfs -text
|
||||
*.tar.gz filter=lfs diff=lfs merge=lfs -text
|
||||
*.ot filter=lfs diff=lfs merge=lfs -text
|
||||
*.onnx filter=lfs diff=lfs merge=lfs -text
|
||||
*.arrow filter=lfs diff=lfs merge=lfs -text
|
||||
*.ftz filter=lfs diff=lfs merge=lfs -text
|
||||
*.joblib filter=lfs diff=lfs merge=lfs -text
|
||||
*.model filter=lfs diff=lfs merge=lfs -text
|
||||
*.msgpack filter=lfs diff=lfs merge=lfs -text
|
||||
*.pb filter=lfs diff=lfs merge=lfs -text
|
||||
*.pt filter=lfs diff=lfs merge=lfs -text
|
||||
*.pth filter=lfs diff=lfs merge=lfs -text
|
||||
137
README.md
Normal file
137
README.md
Normal file
@@ -0,0 +1,137 @@
|
||||
---
|
||||
language: th
|
||||
datasets:
|
||||
- common_voice
|
||||
tags:
|
||||
- audio
|
||||
- automatic-speech-recognition
|
||||
- speech
|
||||
- xlsr-fine-tuning-week
|
||||
license: apache-2.0
|
||||
model-index:
|
||||
- name: XLSR Wav2Vec2 Large Thai by Sakares
|
||||
results:
|
||||
- task:
|
||||
name: Speech Recognition
|
||||
type: automatic-speech-recognition
|
||||
dataset:
|
||||
name: Common Voice th
|
||||
type: common_voice
|
||||
args: th
|
||||
metrics:
|
||||
- name: Test WER
|
||||
type: wer
|
||||
value: 44.46
|
||||
---
|
||||
|
||||
# Wav2Vec2-Large-XLSR-53-Thai
|
||||
|
||||
Fine-tuned [facebook/wav2vec2-large-xlsr-53](https://huggingface.co/facebook/wav2vec2-large-xlsr-53) in Thai using the [Common Voice](https://huggingface.co/datasets/common_voice)
|
||||
When using this model, make sure that your speech input is sampled at 16kHz.
|
||||
|
||||
## Usage
|
||||
|
||||
The model can be used directly (without a language model) as follows:
|
||||
|
||||
```python
|
||||
import torch
|
||||
import torchaudio
|
||||
from datasets import load_dataset
|
||||
from transformers import Wav2Vec2ForCTC, Wav2Vec2Processor
|
||||
from pythainlp.tokenize import word_tokenize
|
||||
|
||||
test_dataset = load_dataset("common_voice", "th", split="test[:2%]")
|
||||
|
||||
processor = Wav2Vec2Processor.from_pretrained("sakares/wav2vec2-large-xlsr-thai-demo")
|
||||
model = Wav2Vec2ForCTC.from_pretrained("sakares/wav2vec2-large-xlsr-thai-demo")
|
||||
|
||||
resampler = torchaudio.transforms.Resample(48_000, 16_000)
|
||||
|
||||
## For Thai NLP Library, please feel free to check https://pythainlp.github.io/docs/2.2/api/tokenize.html
|
||||
def th_tokenize(batch):
|
||||
batch["sentence"] = " ".join(word_tokenize(batch["sentence"], engine="newmm"))
|
||||
return batch
|
||||
|
||||
# Preprocessing the datasets.
|
||||
# We need to read the aduio files as arrays
|
||||
def speech_file_to_array_fn(batch):
|
||||
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).map(th_tokenize)
|
||||
inputs = processor(test_dataset["speech"][:2], sampling_rate=16_000, return_tensors="pt", padding=True)
|
||||
|
||||
with torch.no_grad():
|
||||
logits = model(inputs.input_values, attention_mask=inputs.attention_mask).logits
|
||||
|
||||
predicted_ids = torch.argmax(logits, dim=-1)
|
||||
|
||||
print("Prediction:", processor.batch_decode(predicted_ids))
|
||||
print("Reference:", test_dataset["sentence"][:2])
|
||||
```
|
||||
Usage script [here](https://colab.research.google.com/drive/1w0VywsBtjrO2pHHPmiPugYI9yeF8nUKg?usp=sharing)
|
||||
|
||||
## Evaluation
|
||||
|
||||
The model can be evaluated as follows on the {language} test data of Common Voice.
|
||||
|
||||
|
||||
```python
|
||||
import torch
|
||||
import torchaudio
|
||||
from datasets import load_dataset, load_metric
|
||||
from transformers import Wav2Vec2ForCTC, Wav2Vec2Processor
|
||||
from pythainlp.tokenize import word_tokenize
|
||||
import re
|
||||
|
||||
test_dataset = load_dataset("common_voice", "th", split="test")
|
||||
wer = load_metric("wer")
|
||||
|
||||
processor = Wav2Vec2Processor.from_pretrained("sakares/wav2vec2-large-xlsr-thai-demo")
|
||||
model = Wav2Vec2ForCTC.from_pretrained("sakares/wav2vec2-large-xlsr-thai-demo")
|
||||
model.to("cuda")
|
||||
|
||||
chars_to_ignore_regex = '[\,\?\.\!\-\;\:\"\“]'
|
||||
resampler = torchaudio.transforms.Resample(48_000, 16_000)
|
||||
|
||||
## For Thai NLP Library, please feel free to check https://pythainlp.github.io/docs/2.2/api/tokenize.html
|
||||
def th_tokenize(batch):
|
||||
batch["sentence"] = " ".join(word_tokenize(batch["sentence"], engine="newmm"))
|
||||
return batch
|
||||
|
||||
# Preprocessing the datasets.
|
||||
# We need to read the aduio files as arrays
|
||||
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).map(th_tokenize)
|
||||
|
||||
# Preprocessing the datasets.
|
||||
# We need to read the aduio files as arrays
|
||||
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=8)
|
||||
|
||||
print("WER: {:2f}".format(100 * wer.compute(predictions=result["pred_strings"], references=result["sentence"])))
|
||||
```
|
||||
|
||||
**Test Result**: 44.46 %
|
||||
Evaluate script [here](https://colab.research.google.com/drive/1WZGtHKWXBztRsuXHIdebf6uoAsp7rTnK?usp=sharing)
|
||||
|
||||
## Training
|
||||
|
||||
The Common Voice `train`, `validation` datasets were used for training.
|
||||
|
||||
The script used for training can be found [here](https://colab.research.google.com/drive/18oUbeZgBGSkz16zC_WOa154QZOdmvjyt?usp=sharing)
|
||||
76
config.json
Normal file
76
config.json
Normal file
@@ -0,0 +1,76 @@
|
||||
{
|
||||
"_name_or_path": "facebook/wav2vec2-large-xlsr-53",
|
||||
"activation_dropout": 0.0,
|
||||
"apply_spec_augment": true,
|
||||
"architectures": [
|
||||
"Wav2Vec2ForCTC"
|
||||
],
|
||||
"attention_dropout": 0.1,
|
||||
"bos_token_id": 1,
|
||||
"conv_bias": true,
|
||||
"conv_dim": [
|
||||
512,
|
||||
512,
|
||||
512,
|
||||
512,
|
||||
512,
|
||||
512,
|
||||
512
|
||||
],
|
||||
"conv_kernel": [
|
||||
10,
|
||||
3,
|
||||
3,
|
||||
3,
|
||||
3,
|
||||
2,
|
||||
2
|
||||
],
|
||||
"conv_stride": [
|
||||
5,
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2
|
||||
],
|
||||
"ctc_loss_reduction": "mean",
|
||||
"ctc_zero_infinity": false,
|
||||
"do_stable_layer_norm": true,
|
||||
"eos_token_id": 2,
|
||||
"feat_extract_activation": "gelu",
|
||||
"feat_extract_dropout": 0.0,
|
||||
"feat_extract_norm": "layer",
|
||||
"feat_proj_dropout": 0.0,
|
||||
"final_dropout": 0.0,
|
||||
"gradient_checkpointing": true,
|
||||
"hidden_act": "gelu",
|
||||
"hidden_dropout": 0.1,
|
||||
"hidden_size": 1024,
|
||||
"initializer_range": 0.02,
|
||||
"intermediate_size": 4096,
|
||||
"layer_norm_eps": 1e-05,
|
||||
"layerdrop": 0.1,
|
||||
"mask_channel_length": 10,
|
||||
"mask_channel_min_space": 1,
|
||||
"mask_channel_other": 0.0,
|
||||
"mask_channel_prob": 0.0,
|
||||
"mask_channel_selection": "static",
|
||||
"mask_feature_length": 10,
|
||||
"mask_feature_prob": 0.0,
|
||||
"mask_time_length": 10,
|
||||
"mask_time_min_space": 1,
|
||||
"mask_time_other": 0.0,
|
||||
"mask_time_prob": 0.05,
|
||||
"mask_time_selection": "static",
|
||||
"model_type": "wav2vec2",
|
||||
"num_attention_heads": 16,
|
||||
"num_conv_pos_embedding_groups": 16,
|
||||
"num_conv_pos_embeddings": 128,
|
||||
"num_feat_extract_layers": 7,
|
||||
"num_hidden_layers": 24,
|
||||
"pad_token_id": 70,
|
||||
"transformers_version": "4.4.0",
|
||||
"vocab_size": 71
|
||||
}
|
||||
3
optimizer.pt
Normal file
3
optimizer.pt
Normal file
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:9cb1f03e6996f45067b37846665462c9469495843102ce187588b897e28a7f4e
|
||||
size 2490659335
|
||||
8
preprocessor_config.json
Normal file
8
preprocessor_config.json
Normal file
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"do_normalize": true,
|
||||
"feature_size": 1,
|
||||
"padding_side": "right",
|
||||
"padding_value": 0.0,
|
||||
"return_attention_mask": true,
|
||||
"sampling_rate": 16000
|
||||
}
|
||||
3
pytorch_model.bin
Normal file
3
pytorch_model.bin
Normal file
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:8cf9e30486947e5ed90fbee04baf77edce0daadf0effb971a783e7eee53f6215
|
||||
size 1262224919
|
||||
3
scheduler.pt
Normal file
3
scheduler.pt
Normal file
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:4eadfc8ad40d25eb205d452eb44ca33a8d304d9199be7da405ad3378ff843c81
|
||||
size 623
|
||||
1
special_tokens_map.json
Normal file
1
special_tokens_map.json
Normal file
@@ -0,0 +1 @@
|
||||
{"bos_token": "<s>", "eos_token": "</s>", "unk_token": "[UNK]", "pad_token": "[PAD]"}
|
||||
1
tokenizer_config.json
Normal file
1
tokenizer_config.json
Normal file
@@ -0,0 +1 @@
|
||||
{"unk_token": "[UNK]", "bos_token": "<s>", "eos_token": "</s>", "pad_token": "[PAD]", "do_lower_case": false, "word_delimiter_token": "|"}
|
||||
142
trainer_state.json
Normal file
142
trainer_state.json
Normal file
@@ -0,0 +1,142 @@
|
||||
{
|
||||
"best_metric": null,
|
||||
"best_model_checkpoint": null,
|
||||
"epoch": 23.83828382838284,
|
||||
"global_step": 3600,
|
||||
"is_hyper_param_search": false,
|
||||
"is_local_process_zero": true,
|
||||
"is_world_process_zero": true,
|
||||
"log_history": [
|
||||
{
|
||||
"epoch": 2.65,
|
||||
"learning_rate": 0.00023999999999999998,
|
||||
"loss": 6.5741,
|
||||
"step": 400
|
||||
},
|
||||
{
|
||||
"epoch": 2.65,
|
||||
"eval_loss": 3.4423439502716064,
|
||||
"eval_runtime": 231.306,
|
||||
"eval_samples_per_second": 9.459,
|
||||
"eval_wer": 1.0,
|
||||
"step": 400
|
||||
},
|
||||
{
|
||||
"epoch": 5.3,
|
||||
"learning_rate": 0.0002711907810499359,
|
||||
"loss": 1.6231,
|
||||
"step": 800
|
||||
},
|
||||
{
|
||||
"epoch": 5.3,
|
||||
"eval_loss": 0.6918022036552429,
|
||||
"eval_runtime": 234.8428,
|
||||
"eval_samples_per_second": 9.317,
|
||||
"eval_wer": 0.7177260916407884,
|
||||
"step": 800
|
||||
},
|
||||
{
|
||||
"epoch": 7.94,
|
||||
"learning_rate": 0.00023277848911651725,
|
||||
"loss": 0.5103,
|
||||
"step": 1200
|
||||
},
|
||||
{
|
||||
"epoch": 7.94,
|
||||
"eval_loss": 0.5981740951538086,
|
||||
"eval_runtime": 233.6413,
|
||||
"eval_samples_per_second": 9.365,
|
||||
"eval_wer": 0.6444007858546169,
|
||||
"step": 1200
|
||||
},
|
||||
{
|
||||
"epoch": 10.59,
|
||||
"learning_rate": 0.0001943661971830986,
|
||||
"loss": 0.316,
|
||||
"step": 1600
|
||||
},
|
||||
{
|
||||
"epoch": 10.59,
|
||||
"eval_loss": 0.6127611398696899,
|
||||
"eval_runtime": 239.3303,
|
||||
"eval_samples_per_second": 9.142,
|
||||
"eval_wer": 0.6053615564991445,
|
||||
"step": 1600
|
||||
},
|
||||
{
|
||||
"epoch": 13.24,
|
||||
"learning_rate": 0.0001559539052496799,
|
||||
"loss": 0.227,
|
||||
"step": 2000
|
||||
},
|
||||
{
|
||||
"epoch": 13.24,
|
||||
"eval_loss": 0.6392495036125183,
|
||||
"eval_runtime": 236.7294,
|
||||
"eval_samples_per_second": 9.243,
|
||||
"eval_wer": 0.5767158882058432,
|
||||
"step": 2000
|
||||
},
|
||||
{
|
||||
"epoch": 15.89,
|
||||
"learning_rate": 0.00011754161331626119,
|
||||
"loss": 0.1783,
|
||||
"step": 2400
|
||||
},
|
||||
{
|
||||
"epoch": 15.89,
|
||||
"eval_loss": 0.6448690891265869,
|
||||
"eval_runtime": 240.8912,
|
||||
"eval_samples_per_second": 9.083,
|
||||
"eval_wer": 0.5625831801761836,
|
||||
"step": 2400
|
||||
},
|
||||
{
|
||||
"epoch": 18.54,
|
||||
"learning_rate": 7.91293213828425e-05,
|
||||
"loss": 0.1346,
|
||||
"step": 2800
|
||||
},
|
||||
{
|
||||
"epoch": 18.54,
|
||||
"eval_loss": 0.6509573459625244,
|
||||
"eval_runtime": 238.9168,
|
||||
"eval_samples_per_second": 9.158,
|
||||
"eval_wer": 0.5524431206033336,
|
||||
"step": 2800
|
||||
},
|
||||
{
|
||||
"epoch": 21.19,
|
||||
"learning_rate": 4.071702944942381e-05,
|
||||
"loss": 0.1149,
|
||||
"step": 3200
|
||||
},
|
||||
{
|
||||
"epoch": 21.19,
|
||||
"eval_loss": 0.7118895053863525,
|
||||
"eval_runtime": 239.1827,
|
||||
"eval_samples_per_second": 9.148,
|
||||
"eval_wer": 0.5582736548577223,
|
||||
"step": 3200
|
||||
},
|
||||
{
|
||||
"epoch": 23.84,
|
||||
"learning_rate": 2.3047375160051214e-06,
|
||||
"loss": 0.1024,
|
||||
"step": 3600
|
||||
},
|
||||
{
|
||||
"epoch": 23.84,
|
||||
"eval_loss": 0.6984374523162842,
|
||||
"eval_runtime": 239.7197,
|
||||
"eval_samples_per_second": 9.127,
|
||||
"eval_wer": 0.5488307243805057,
|
||||
"step": 3600
|
||||
}
|
||||
],
|
||||
"max_steps": 3624,
|
||||
"num_train_epochs": 24,
|
||||
"total_flos": 1.4828294022260212e+19,
|
||||
"trial_name": null,
|
||||
"trial_params": null
|
||||
}
|
||||
3
training_args.bin
Normal file
3
training_args.bin
Normal file
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:172c59484ed932416417e6a198f03373837732beb2793acc906d873aa5e63514
|
||||
size 2351
|
||||
1
vocab.json
Normal file
1
vocab.json
Normal file
@@ -0,0 +1 @@
|
||||
{"ู": 0, "ั": 1, "ะ": 2, "ฆ": 3, "ำ": 4, "ึ": 5, "๋": 6, "ส": 7, "์": 8, "ฮ": 9, "ค": 10, "่": 11, "ผ": 12, "ศ": 13, "จ": 14, "ล": 15, "ฒ": 16, "ป": 17, "ม": 18, "็": 19, "’": 20, "ง": 21, "ํ": 22, "ฝ": 23, "ื": 24, "โ": 25, "ห": 26, "้": 27, "ษ": 29, "ๆ": 30, "า": 31, "ฟ": 32, "แ": 33, "ด": 34, "ท": 35, "ใ": 36, "ณ": 37, "ฬ": 38, "ไ": 39, "ๅ": 40, "อ": 41, "ี": 42, "๊": 43, "บ": 44, "ย": 45, "ิ": 46, "ฉ": 47, "ภ": 48, "ฏ": 49, "ข": 50, "ก": 51, "'": 52, "เ": 53, "พ": 54, "ฐ": 55, "ญ": 56, "น": 57, "ธ": 58, "ถ": 59, "ซ": 60, "ร": 61, "ฤ": 62, "ช": 63, "ุ": 64, "ต": 65, "ฑ": 66, "ฎ": 67, "ว": 68, "|": 28, "[UNK]": 69, "[PAD]": 70}
|
||||
Reference in New Issue
Block a user