wbbbbb commited on
Commit
2688329
1 Parent(s): 3267f70

Update README.md

Browse files
Files changed (1) hide show
  1. README.md +54 -67
README.md CHANGED
@@ -12,7 +12,7 @@ tags:
12
  - xlsr-fine-tuning-week
13
  license: apache-2.0
14
  model-index:
15
- - name: XLSR Wav2Vec2 Chinese (zh-CN) by Jonatas Grosman
16
  results:
17
  - task:
18
  name: Speech Recognition
@@ -24,17 +24,17 @@ model-index:
24
  metrics:
25
  - name: Test WER
26
  type: wer
27
- value: 82.37
28
  - name: Test CER
29
  type: cer
30
- value: 19.03
31
  ---
32
  # Fine-tuned XLSR-53 large model for speech recognition in Chinese
33
 
34
  Fine-tuned [facebook/wav2vec2-large-xlsr-53](https://huggingface.co/facebook/wav2vec2-large-xlsr-53) on Chinese using the train and validation splits of [Common Voice 6.1](https://huggingface.co/datasets/common_voice), [CSS10](https://github.com/Kyubyong/css10) and [ST-CMDS](http://www.openslr.org/38/).
35
  When using this model, make sure that your speech input is sampled at 16kHz.
36
 
37
- This model has been fine-tuned thanks to the GPU credits generously given by the [OVHcloud](https://www.ovhcloud.com/en/public-cloud/ai-training/) :)
38
 
39
  The script used for training can be found here: https://github.com/jonatasgrosman/wav2vec2-sprint
40
 
@@ -46,55 +46,12 @@ Using the [HuggingSound](https://github.com/jonatasgrosman/huggingsound) library
46
 
47
  ```python
48
  from huggingsound import SpeechRecognitionModel
49
- model = SpeechRecognitionModel("jonatasgrosman/wav2vec2-large-xlsr-53-chinese-zh-cn")
50
  audio_paths = ["/path/to/file.mp3", "/path/to/another_file.wav"]
51
  transcriptions = model.transcribe(audio_paths)
52
  ```
53
 
54
- Writing your own inference script:
55
 
56
- ```python
57
- import torch
58
- import librosa
59
- from datasets import load_dataset
60
- from transformers import Wav2Vec2ForCTC, Wav2Vec2Processor
61
- LANG_ID = "zh-CN"
62
- MODEL_ID = "jonatasgrosman/wav2vec2-large-xlsr-53-chinese-zh-cn"
63
- SAMPLES = 10
64
- test_dataset = load_dataset("common_voice", LANG_ID, split=f"test[:{SAMPLES}]")
65
- processor = Wav2Vec2Processor.from_pretrained(MODEL_ID)
66
- model = Wav2Vec2ForCTC.from_pretrained(MODEL_ID)
67
- # Preprocessing the datasets.
68
- # We need to read the audio files as arrays
69
- def speech_file_to_array_fn(batch):
70
- speech_array, sampling_rate = librosa.load(batch["path"], sr=16_000)
71
- batch["speech"] = speech_array
72
- batch["sentence"] = batch["sentence"].upper()
73
- return batch
74
- test_dataset = test_dataset.map(speech_file_to_array_fn)
75
- inputs = processor(test_dataset["speech"], sampling_rate=16_000, return_tensors="pt", padding=True)
76
- with torch.no_grad():
77
- logits = model(inputs.input_values, attention_mask=inputs.attention_mask).logits
78
- predicted_ids = torch.argmax(logits, dim=-1)
79
- predicted_sentences = processor.batch_decode(predicted_ids)
80
- for i, predicted_sentence in enumerate(predicted_sentences):
81
- print("-" * 100)
82
- print("Reference:", test_dataset[i]["sentence"])
83
- print("Prediction:", predicted_sentence)
84
- ```
85
-
86
- | Reference | Prediction |
87
- | ------------- | ------------- |
88
- | 宋朝末年年间定居粉岭围。 | 宋朝末年年间定居分定为 |
89
- | 渐渐行动不便 | 建境行动不片 |
90
- | 二十一年去世。 | 二十一年去世 |
91
- | 他们自称恰哈拉。 | 他们自称家哈<unk> |
92
- | 局部干涩的例子包括有口干、眼睛干燥、及阴道干燥。 | 菊物干寺的例子包括有口肝眼睛干照以及阴到干<unk> |
93
- | 嘉靖三十八年,登进士第三甲第二名。 | 嘉靖三十八年登进士第三甲第二名 |
94
- | 这一名称一直沿用至今。 | 这一名称一直沿用是心 |
95
- | 同时乔凡尼还得到包税合同和许多明矾矿的经营权。 | 同时桥凡妮还得到包税合同和许多民繁矿的经营权 |
96
- | 为了惩罚西扎城和塞尔柱的结盟,盟军在抵达后将外城烧毁。 | 为了曾罚西扎城和塞尔素的节盟盟军在抵达后将外曾烧毁 |
97
- | 河内盛产黄色无鱼鳞的鳍射鱼。 | 合类生场环色无鱼林的骑射鱼 |
98
 
99
  ## Evaluation
100
 
@@ -106,21 +63,27 @@ import re
106
  import librosa
107
  from datasets import load_dataset, load_metric
108
  from transformers import Wav2Vec2ForCTC, Wav2Vec2Processor
 
 
 
 
 
 
109
  LANG_ID = "zh-CN"
110
- MODEL_ID = "jonatasgrosman/wav2vec2-large-xlsr-53-chinese-zh-cn"
111
  DEVICE = "cuda"
112
- CHARS_TO_IGNORE = [",", "?", "¿", ".", "!", "¡", ";", ";", ":", '""', "%", '"', "�", "ʿ", "·", "჻", "~", "՞",
113
- "؟", "،", "।", "॥", "«", "»", "„", "“", "”", "「", "」", "‘", "’", "《", "》", "(", ")", "[", "]",
114
- "{", "}", "=", "`", "_", "+", "<", ">", "…", "–", "°", "´", "ʾ", "‹", "›", "©", "®", "—", "→", "。",
115
- "、", "﹂", "﹁", "‧", "~", "﹏", ",", "{", "}", "(", ")", "[", "]", "【", "】", "‥", "〽",
116
- "『", "』", "〝", "〟", "⟨", "⟩", "〜", ":", "!", "?", "♪", "؛", "/", "\\", "º", "−", "^", "'", "ʻ", "ˆ"]
117
  test_dataset = load_dataset("common_voice", LANG_ID, split="test")
118
- wer = load_metric("wer.py") # https://github.com/jonatasgrosman/wav2vec2-sprint/blob/main/wer.py
119
- cer = load_metric("cer.py") # https://github.com/jonatasgrosman/wav2vec2-sprint/blob/main/cer.py
120
- chars_to_ignore_regex = f"[{re.escape(''.join(CHARS_TO_IGNORE))}]"
 
 
 
121
  processor = Wav2Vec2Processor.from_pretrained(MODEL_ID)
122
  model = Wav2Vec2ForCTC.from_pretrained(MODEL_ID)
123
  model.to(DEVICE)
 
124
  # Preprocessing the datasets.
125
  # We need to read the audio files as arrays
126
  def speech_file_to_array_fn(batch):
@@ -128,31 +91,55 @@ def speech_file_to_array_fn(batch):
128
  warnings.simplefilter("ignore")
129
  speech_array, sampling_rate = librosa.load(batch["path"], sr=16_000)
130
  batch["speech"] = speech_array
131
- batch["sentence"] = re.sub(chars_to_ignore_regex, "", batch["sentence"]).upper()
 
 
132
  return batch
133
- test_dataset = test_dataset.map(speech_file_to_array_fn)
 
 
 
 
 
 
 
134
  # Preprocessing the datasets.
135
  # We need to read the audio files as arrays
136
  def evaluate(batch):
137
- inputs = processor(batch["speech"], sampling_rate=16_000, return_tensors="pt", padding=True)
 
 
 
138
  with torch.no_grad():
139
- logits = model(inputs.input_values.to(DEVICE), attention_mask=inputs.attention_mask.to(DEVICE)).logits
 
 
 
 
140
  pred_ids = torch.argmax(logits, dim=-1)
141
  batch["pred_strings"] = processor.batch_decode(pred_ids)
142
  return batch
 
 
143
  result = test_dataset.map(evaluate, batched=True, batch_size=8)
144
- predictions = [x.upper() for x in result["pred_strings"]]
145
- references = [x.upper() for x in result["sentence"]]
146
- print(f"WER: {wer.compute(predictions=predictions, references=references, chunk_size=1000) * 100}")
147
- print(f"CER: {cer.compute(predictions=predictions, references=references, chunk_size=1000) * 100}")
 
 
 
 
 
148
  ```
149
 
150
  **Test Result**:
151
 
152
- In the table below I report the Word Error Rate (WER) and the Character Error Rate (CER) of the model. I ran the evaluation script described above on other models as well (on 2021-05-13). Note that the table below may show different results from those already reported, this may have been caused due to some specificity of the other evaluation scripts used.
153
 
154
  | Model | WER | CER |
155
  | ------------- | ------------- | ------------- |
 
156
  | jonatasgrosman/wav2vec2-large-xlsr-53-chinese-zh-cn | **82.37%** | **19.03%** |
157
  | ydshieh/wav2vec2-large-xlsr-53-chinese-zh-cn-gpt | 84.01% | 20.95% |
158
 
@@ -164,7 +151,7 @@ If you want to cite this model you can use this:
164
  @misc{grosman2021xlsr53-large-chinese,
165
  title={Fine-tuned {XLSR}-53 large model for speech recognition in {C}hinese},
166
  author={Grosman, Jonatas},
167
- howpublished={\url{https://huggingface.co/jonatasgrosman/wav2vec2-large-xlsr-53-chinese-zh-cn}},
168
  year={2021}
169
  }
170
  ```
 
12
  - xlsr-fine-tuning-week
13
  license: apache-2.0
14
  model-index:
15
+ - name: XLSR Wav2Vec2 Chinese (zh-CN) by wbbbbb
16
  results:
17
  - task:
18
  name: Speech Recognition
 
24
  metrics:
25
  - name: Test WER
26
  type: wer
27
+ value: 70.47
28
  - name: Test CER
29
  type: cer
30
+ value: 12.30
31
  ---
32
  # Fine-tuned XLSR-53 large model for speech recognition in Chinese
33
 
34
  Fine-tuned [facebook/wav2vec2-large-xlsr-53](https://huggingface.co/facebook/wav2vec2-large-xlsr-53) on Chinese using the train and validation splits of [Common Voice 6.1](https://huggingface.co/datasets/common_voice), [CSS10](https://github.com/Kyubyong/css10) and [ST-CMDS](http://www.openslr.org/38/).
35
  When using this model, make sure that your speech input is sampled at 16kHz.
36
 
37
+ This model has been fine-tuned on RTX3090 for 50h
38
 
39
  The script used for training can be found here: https://github.com/jonatasgrosman/wav2vec2-sprint
40
 
 
46
 
47
  ```python
48
  from huggingsound import SpeechRecognitionModel
49
+ model = SpeechRecognitionModel("wbbbbb/wav2vec2-large-chinese-zh-cn")
50
  audio_paths = ["/path/to/file.mp3", "/path/to/another_file.wav"]
51
  transcriptions = model.transcribe(audio_paths)
52
  ```
53
 
 
54
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
55
 
56
  ## Evaluation
57
 
 
63
  import librosa
64
  from datasets import load_dataset, load_metric
65
  from transformers import Wav2Vec2ForCTC, Wav2Vec2Processor
66
+ import warnings
67
+ import os
68
+
69
+ os.environ["KMP_AFFINITY"] = ""
70
+
71
+
72
  LANG_ID = "zh-CN"
73
+ MODEL_ID = "zh-CN-output-aishell"
74
  DEVICE = "cuda"
75
+
 
 
 
 
76
  test_dataset = load_dataset("common_voice", LANG_ID, split="test")
77
+
78
+ wer = load_metric("wer")
79
+ cer = load_metric("cer")
80
+
81
+
82
+
83
  processor = Wav2Vec2Processor.from_pretrained(MODEL_ID)
84
  model = Wav2Vec2ForCTC.from_pretrained(MODEL_ID)
85
  model.to(DEVICE)
86
+
87
  # Preprocessing the datasets.
88
  # We need to read the audio files as arrays
89
  def speech_file_to_array_fn(batch):
 
91
  warnings.simplefilter("ignore")
92
  speech_array, sampling_rate = librosa.load(batch["path"], sr=16_000)
93
  batch["speech"] = speech_array
94
+ batch["sentence"] = (
95
+ re.sub("([^\u4e00-\u9fa5\u0030-\u0039])", "", batch["sentence"]).lower() + " "
96
+ )
97
  return batch
98
+
99
+
100
+ test_dataset = test_dataset.map(
101
+ speech_file_to_array_fn,
102
+ num_proc=15,
103
+ remove_columns=['client_id', 'up_votes', 'down_votes', 'age', 'gender', 'accent', 'locale', 'segment'],
104
+ )
105
+
106
  # Preprocessing the datasets.
107
  # We need to read the audio files as arrays
108
  def evaluate(batch):
109
+ inputs = processor(
110
+ batch["speech"], sampling_rate=16_000, return_tensors="pt", padding=True
111
+ )
112
+
113
  with torch.no_grad():
114
+ logits = model(
115
+ inputs.input_values.to(DEVICE),
116
+ attention_mask=inputs.attention_mask.to(DEVICE),
117
+ ).logits
118
+
119
  pred_ids = torch.argmax(logits, dim=-1)
120
  batch["pred_strings"] = processor.batch_decode(pred_ids)
121
  return batch
122
+
123
+
124
  result = test_dataset.map(evaluate, batched=True, batch_size=8)
125
+
126
+ predictions = [x.lower() for x in result["pred_strings"]]
127
+ references = [x.lower() for x in result["sentence"]]
128
+
129
+ print(
130
+ f"WER: {wer.compute(predictions=predictions, references=references, chunk_size=1000) * 100}"
131
+ )
132
+ print(f"CER: {cer.compute(predictions=predictions, references=references) * 100}")
133
+
134
  ```
135
 
136
  **Test Result**:
137
 
138
+ In the table below I report the Word Error Rate (WER) and the Character Error Rate (CER) of the model. I ran the evaluation script described above on other models as well (on 2022-07-18). Note that the table below may show different results from those already reported, this may have been caused due to some specificity of the other evaluation scripts used.
139
 
140
  | Model | WER | CER |
141
  | ------------- | ------------- | ------------- |
142
+ | wbbbbb/wav2vec2-large-chinese-zh-cn | **70.47%** | **12.30%** |
143
  | jonatasgrosman/wav2vec2-large-xlsr-53-chinese-zh-cn | **82.37%** | **19.03%** |
144
  | ydshieh/wav2vec2-large-xlsr-53-chinese-zh-cn-gpt | 84.01% | 20.95% |
145
 
 
151
  @misc{grosman2021xlsr53-large-chinese,
152
  title={Fine-tuned {XLSR}-53 large model for speech recognition in {C}hinese},
153
  author={Grosman, Jonatas},
154
+ howpublished={\url{https://huggingface.co/wbbbbb/wav2vec2-large-chinese-zh-cn}},
155
  year={2021}
156
  }
157
  ```