Duplicate from Derur/vosk-models
Browse filesCo-authored-by: Derur <Derur@users.noreply.huggingface.co>
This view is limited to 50 files because it contains too many changes. See raw diff
- .gitattributes +567 -0
- README.md +52 -0
- punctuation/vosk-recasepunc-de-0.21.7z +3 -0
- punctuation/vosk-recasepunc-de-0.21/README +7 -0
- punctuation/vosk-recasepunc-de-0.21/checkpoint +3 -0
- punctuation/vosk-recasepunc-de-0.21/de-test.txt +6 -0
- punctuation/vosk-recasepunc-de-0.21/de-test.txt.orig +6 -0
- punctuation/vosk-recasepunc-de-0.21/example.py +23 -0
- punctuation/vosk-recasepunc-de-0.21/recasepunc.py +742 -0
- punctuation/vosk-recasepunc-en-0.22.7z +3 -0
- punctuation/vosk-recasepunc-en-0.22/README +7 -0
- punctuation/vosk-recasepunc-en-0.22/checkpoint +3 -0
- punctuation/vosk-recasepunc-en-0.22/example.py +26 -0
- punctuation/vosk-recasepunc-en-0.22/recasepunc.py +742 -0
- punctuation/vosk-recasepunc-en-0.22/vosk-adapted.txt +17 -0
- punctuation/vosk-recasepunc-en-0.22/vosk-adapted.txt.punc +1 -0
- punctuation/vosk-recasepunc-ru-0.22.7z +3 -0
- punctuation/vosk-recasepunc-ru-0.22/README +7 -0
- punctuation/vosk-recasepunc-ru-0.22/checkpoint +3 -0
- punctuation/vosk-recasepunc-ru-0.22/example.py +23 -0
- punctuation/vosk-recasepunc-ru-0.22/recasepunc.py +743 -0
- punctuation/vosk-recasepunc-ru-0.22/ru-test.txt +17 -0
- punctuation/vosk-recasepunc-ru-0.22/ru-test.txt.orig +17 -0
- speaker_indentification/vosk-model-spk-0.4.7z +3 -0
- speaker_indentification/vosk-model-spk-0.4/README.txt +119 -0
- speaker_indentification/vosk-model-spk-0.4/final.ext.raw +3 -0
- speaker_indentification/vosk-model-spk-0.4/mean.vec +1 -0
- speaker_indentification/vosk-model-spk-0.4/mfcc.conf +5 -0
- speaker_indentification/vosk-model-spk-0.4/transform.mat +0 -0
- stt/ar-tn/vosk-model-ar-tn-0.1-linto.7z +3 -0
- stt/ar-tn/vosk-model-ar-tn-0.1-linto/am/cmvn_opts +1 -0
- stt/ar-tn/vosk-model-ar-tn-0.1-linto/am/final.ie.id +1 -0
- stt/ar-tn/vosk-model-ar-tn-0.1-linto/am/final.mdl +3 -0
- stt/ar-tn/vosk-model-ar-tn-0.1-linto/am/frame_subsampling_factor +1 -0
- stt/ar-tn/vosk-model-ar-tn-0.1-linto/am/num_jobs +1 -0
- stt/ar-tn/vosk-model-ar-tn-0.1-linto/am/phones.txt +302 -0
- stt/ar-tn/vosk-model-ar-tn-0.1-linto/am/tree +3 -0
- stt/ar-tn/vosk-model-ar-tn-0.1-linto/conf/mfcc.conf +10 -0
- stt/ar-tn/vosk-model-ar-tn-0.1-linto/conf/model.conf +10 -0
- stt/ar-tn/vosk-model-ar-tn-0.1-linto/conf/splice.conf +3 -0
- stt/ar-tn/vosk-model-ar-tn-0.1-linto/graph/HCLG.fst +3 -0
- stt/ar-tn/vosk-model-ar-tn-0.1-linto/graph/disambig_tid.int +4 -0
- stt/ar-tn/vosk-model-ar-tn-0.1-linto/graph/num_pdfs +1 -0
- stt/ar-tn/vosk-model-ar-tn-0.1-linto/graph/phones.txt +302 -0
- stt/ar-tn/vosk-model-ar-tn-0.1-linto/graph/phones/align_lexicon.int +0 -0
- stt/ar-tn/vosk-model-ar-tn-0.1-linto/graph/phones/align_lexicon.txt +3 -0
- stt/ar-tn/vosk-model-ar-tn-0.1-linto/graph/phones/disambig.int +4 -0
- stt/ar-tn/vosk-model-ar-tn-0.1-linto/graph/phones/disambig.txt +4 -0
- stt/ar-tn/vosk-model-ar-tn-0.1-linto/graph/phones/optional_silence.csl +1 -0
- stt/ar-tn/vosk-model-ar-tn-0.1-linto/graph/phones/optional_silence.int +1 -0
.gitattributes
ADDED
|
@@ -0,0 +1,567 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
*.7z filter=lfs diff=lfs merge=lfs -text
|
| 2 |
+
*.arrow filter=lfs diff=lfs merge=lfs -text
|
| 3 |
+
*.bin filter=lfs diff=lfs merge=lfs -text
|
| 4 |
+
*.bz2 filter=lfs diff=lfs merge=lfs -text
|
| 5 |
+
*.ckpt filter=lfs diff=lfs merge=lfs -text
|
| 6 |
+
*.ftz filter=lfs diff=lfs merge=lfs -text
|
| 7 |
+
*.gz filter=lfs diff=lfs merge=lfs -text
|
| 8 |
+
*.h5 filter=lfs diff=lfs merge=lfs -text
|
| 9 |
+
*.joblib filter=lfs diff=lfs merge=lfs -text
|
| 10 |
+
*.lfs.* filter=lfs diff=lfs merge=lfs -text
|
| 11 |
+
*.mlmodel filter=lfs diff=lfs merge=lfs -text
|
| 12 |
+
*.model filter=lfs diff=lfs merge=lfs -text
|
| 13 |
+
*.msgpack filter=lfs diff=lfs merge=lfs -text
|
| 14 |
+
*.npy filter=lfs diff=lfs merge=lfs -text
|
| 15 |
+
*.npz filter=lfs diff=lfs merge=lfs -text
|
| 16 |
+
*.onnx filter=lfs diff=lfs merge=lfs -text
|
| 17 |
+
*.ot filter=lfs diff=lfs merge=lfs -text
|
| 18 |
+
*.parquet filter=lfs diff=lfs merge=lfs -text
|
| 19 |
+
*.pb filter=lfs diff=lfs merge=lfs -text
|
| 20 |
+
*.pickle filter=lfs diff=lfs merge=lfs -text
|
| 21 |
+
*.pkl filter=lfs diff=lfs merge=lfs -text
|
| 22 |
+
*.pt filter=lfs diff=lfs merge=lfs -text
|
| 23 |
+
*.pth filter=lfs diff=lfs merge=lfs -text
|
| 24 |
+
*.rar filter=lfs diff=lfs merge=lfs -text
|
| 25 |
+
*.safetensors filter=lfs diff=lfs merge=lfs -text
|
| 26 |
+
saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
| 27 |
+
*.tar.* filter=lfs diff=lfs merge=lfs -text
|
| 28 |
+
*.tar filter=lfs diff=lfs merge=lfs -text
|
| 29 |
+
*.tflite filter=lfs diff=lfs merge=lfs -text
|
| 30 |
+
*.tgz filter=lfs diff=lfs merge=lfs -text
|
| 31 |
+
*.wasm filter=lfs diff=lfs merge=lfs -text
|
| 32 |
+
*.xz filter=lfs diff=lfs merge=lfs -text
|
| 33 |
+
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
+
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
+
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
| 36 |
+
punctuation/vosk-recasepunc-de-0.21/checkpoint filter=lfs diff=lfs merge=lfs -text
|
| 37 |
+
punctuation/vosk-recasepunc-en-0.22/checkpoint filter=lfs diff=lfs merge=lfs -text
|
| 38 |
+
punctuation/vosk-recasepunc-ru-0.22/checkpoint filter=lfs diff=lfs merge=lfs -text
|
| 39 |
+
speaker_indentification/vosk-model-spk-0.4/final.ext.raw filter=lfs diff=lfs merge=lfs -text
|
| 40 |
+
tts/vosk-model-tts-ru-0.9-multi/dictionary filter=lfs diff=lfs merge=lfs -text
|
| 41 |
+
stt/ar-tn/vosk-model-ar-tn-0.1-linto/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 42 |
+
stt/ar-tn/vosk-model-ar-tn-0.1-linto/am/tree filter=lfs diff=lfs merge=lfs -text
|
| 43 |
+
stt/ar-tn/vosk-model-ar-tn-0.1-linto/graph/HCLG.fst filter=lfs diff=lfs merge=lfs -text
|
| 44 |
+
stt/ar-tn/vosk-model-ar-tn-0.1-linto/graph/phones/align_lexicon.txt filter=lfs diff=lfs merge=lfs -text
|
| 45 |
+
stt/ar-tn/vosk-model-ar-tn-0.1-linto/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 46 |
+
stt/ar-tn/vosk-model-ar-tn-0.1-linto/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 47 |
+
stt/ar-tn/vosk-model-small-ar-tn-0.1-linto/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 48 |
+
stt/ar-tn/vosk-model-small-ar-tn-0.1-linto/am/tree filter=lfs diff=lfs merge=lfs -text
|
| 49 |
+
stt/ar-tn/vosk-model-small-ar-tn-0.1-linto/graph/Gr.fst filter=lfs diff=lfs merge=lfs -text
|
| 50 |
+
stt/ar-tn/vosk-model-small-ar-tn-0.1-linto/graph/HCLr.fst filter=lfs diff=lfs merge=lfs -text
|
| 51 |
+
stt/ar-tn/vosk-model-small-ar-tn-0.1-linto/graph/phones/align_lexicon.txt filter=lfs diff=lfs merge=lfs -text
|
| 52 |
+
stt/ar-tn/vosk-model-small-ar-tn-0.1-linto/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 53 |
+
stt/ar-tn/vosk-model-small-ar-tn-0.1-linto/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 54 |
+
stt/ar/vosk-model-ar-0.22-linto-1.1.0/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 55 |
+
stt/ar/vosk-model-ar-0.22-linto-1.1.0/am/tree filter=lfs diff=lfs merge=lfs -text
|
| 56 |
+
stt/ar/vosk-model-ar-0.22-linto-1.1.0/graph/HCLG.fst filter=lfs diff=lfs merge=lfs -text
|
| 57 |
+
stt/ar/vosk-model-ar-0.22-linto-1.1.0/graph/phones/align_lexicon.int filter=lfs diff=lfs merge=lfs -text
|
| 58 |
+
stt/ar/vosk-model-ar-0.22-linto-1.1.0/graph/phones/align_lexicon.txt filter=lfs diff=lfs merge=lfs -text
|
| 59 |
+
stt/ar/vosk-model-ar-0.22-linto-1.1.0/graph/words.txt filter=lfs diff=lfs merge=lfs -text
|
| 60 |
+
stt/ar/vosk-model-ar-0.22-linto-1.1.0/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 61 |
+
stt/ar/vosk-model-ar-0.22-linto-1.1.0/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 62 |
+
stt/ar/vosk-model-ar-0.22-linto-1.1.0/rescore/G.carpa filter=lfs diff=lfs merge=lfs -text
|
| 63 |
+
stt/ar/vosk-model-ar-0.22-linto-1.1.0/rescore/G.fst filter=lfs diff=lfs merge=lfs -text
|
| 64 |
+
stt/ar/vosk-model-ar-mgb2-0.4/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 65 |
+
stt/ar/vosk-model-ar-mgb2-0.4/am/tree filter=lfs diff=lfs merge=lfs -text
|
| 66 |
+
stt/ar/vosk-model-ar-mgb2-0.4/graph/HCLG.fst filter=lfs diff=lfs merge=lfs -text
|
| 67 |
+
stt/ar/vosk-model-ar-mgb2-0.4/graph/phones/align_lexicon.int filter=lfs diff=lfs merge=lfs -text
|
| 68 |
+
stt/ar/vosk-model-ar-mgb2-0.4/graph/phones/align_lexicon.txt filter=lfs diff=lfs merge=lfs -text
|
| 69 |
+
stt/ar/vosk-model-ar-mgb2-0.4/graph/words_bw.txt filter=lfs diff=lfs merge=lfs -text
|
| 70 |
+
stt/ar/vosk-model-ar-mgb2-0.4/graph/words.txt filter=lfs diff=lfs merge=lfs -text
|
| 71 |
+
stt/ar/vosk-model-ar-mgb2-0.4/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 72 |
+
stt/ar/vosk-model-ar-mgb2-0.4/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 73 |
+
stt/br/vosk-model-br-0.8/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 74 |
+
stt/br/vosk-model-br-0.8/HCLG.fst filter=lfs diff=lfs merge=lfs -text
|
| 75 |
+
stt/br/vosk-model-br-0.8/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 76 |
+
stt/br/vosk-model-br-0.8/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 77 |
+
stt/ca/vosk-model-small-ca-0.4/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 78 |
+
stt/ca/vosk-model-small-ca-0.4/am/tree filter=lfs diff=lfs merge=lfs -text
|
| 79 |
+
stt/ca/vosk-model-small-ca-0.4/graph/Gr.fst filter=lfs diff=lfs merge=lfs -text
|
| 80 |
+
stt/ca/vosk-model-small-ca-0.4/graph/HCLr.fst filter=lfs diff=lfs merge=lfs -text
|
| 81 |
+
stt/ca/vosk-model-small-ca-0.4/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 82 |
+
stt/ca/vosk-model-small-ca-0.4/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 83 |
+
stt/cn_other/vosk-model-cn-kaldi-multicn-0.15/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 84 |
+
stt/cn_other/vosk-model-cn-kaldi-multicn-0.15/am/tree filter=lfs diff=lfs merge=lfs -text
|
| 85 |
+
stt/cn_other/vosk-model-cn-kaldi-multicn-0.15/graph/HCLG.fst filter=lfs diff=lfs merge=lfs -text
|
| 86 |
+
stt/cn_other/vosk-model-cn-kaldi-multicn-0.15/graph/phones/align_lexicon.int filter=lfs diff=lfs merge=lfs -text
|
| 87 |
+
stt/cn_other/vosk-model-cn-kaldi-multicn-0.15/graph/phones/align_lexicon.txt filter=lfs diff=lfs merge=lfs -text
|
| 88 |
+
stt/cn_other/vosk-model-cn-kaldi-multicn-0.15/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 89 |
+
stt/cn_other/vosk-model-cn-kaldi-multicn-0.15/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 90 |
+
stt/cn_other/vosk-model-cn-kaldi-multicn-0.15/rescore/G.carpa filter=lfs diff=lfs merge=lfs -text
|
| 91 |
+
stt/cn_other/vosk-model-cn-kaldi-multicn-0.15/rescore/G.fst filter=lfs diff=lfs merge=lfs -text
|
| 92 |
+
stt/cn/vosk-model-cn-0.22/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 93 |
+
stt/cn/vosk-model-cn-0.22/graph/HCLG.fst filter=lfs diff=lfs merge=lfs -text
|
| 94 |
+
stt/cn/vosk-model-cn-0.22/graph/words.txt filter=lfs diff=lfs merge=lfs -text
|
| 95 |
+
stt/cn/vosk-model-cn-0.22/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 96 |
+
stt/cn/vosk-model-cn-0.22/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 97 |
+
stt/cn/vosk-model-cn-0.22/rescore/G.carpa filter=lfs diff=lfs merge=lfs -text
|
| 98 |
+
stt/cn/vosk-model-cn-0.22/rescore/G.fst filter=lfs diff=lfs merge=lfs -text
|
| 99 |
+
stt/cn/vosk-model-cn-0.22/rnnlm/feat_embedding.final.mat filter=lfs diff=lfs merge=lfs -text
|
| 100 |
+
stt/cn/vosk-model-cn-0.22/rnnlm/final.raw filter=lfs diff=lfs merge=lfs -text
|
| 101 |
+
stt/cn/vosk-model-cn-0.22/rnnlm/word_feats.txt filter=lfs diff=lfs merge=lfs -text
|
| 102 |
+
stt/cn/vosk-model-small-cn-0.22/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 103 |
+
stt/cn/vosk-model-small-cn-0.22/graph/Gr.fst filter=lfs diff=lfs merge=lfs -text
|
| 104 |
+
stt/cn/vosk-model-small-cn-0.22/graph/HCLr.fst filter=lfs diff=lfs merge=lfs -text
|
| 105 |
+
stt/cn/vosk-model-small-cn-0.22/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 106 |
+
stt/cn/vosk-model-small-cn-0.22/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 107 |
+
stt/cs/vosk-model-small-cs-0.4-rhasspy/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 108 |
+
stt/cs/vosk-model-small-cs-0.4-rhasspy/graph/Gr.fst filter=lfs diff=lfs merge=lfs -text
|
| 109 |
+
stt/cs/vosk-model-small-cs-0.4-rhasspy/graph/HCLr.fst filter=lfs diff=lfs merge=lfs -text
|
| 110 |
+
stt/cs/vosk-model-small-cs-0.4-rhasspy/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 111 |
+
stt/cs/vosk-model-small-cs-0.4-rhasspy/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 112 |
+
stt/de/vosk-model-de-0.21/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 113 |
+
stt/de/vosk-model-de-0.21/am/tree filter=lfs diff=lfs merge=lfs -text
|
| 114 |
+
stt/de/vosk-model-de-0.21/graph/HCLG.fst filter=lfs diff=lfs merge=lfs -text
|
| 115 |
+
stt/de/vosk-model-de-0.21/graph/phones/align_lexicon.int filter=lfs diff=lfs merge=lfs -text
|
| 116 |
+
stt/de/vosk-model-de-0.21/graph/phones/align_lexicon.txt filter=lfs diff=lfs merge=lfs -text
|
| 117 |
+
stt/de/vosk-model-de-0.21/graph/words.txt filter=lfs diff=lfs merge=lfs -text
|
| 118 |
+
stt/de/vosk-model-de-0.21/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 119 |
+
stt/de/vosk-model-de-0.21/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 120 |
+
stt/de/vosk-model-de-0.21/rescore/G.carpa filter=lfs diff=lfs merge=lfs -text
|
| 121 |
+
stt/de/vosk-model-de-0.21/rescore/G.fst filter=lfs diff=lfs merge=lfs -text
|
| 122 |
+
stt/de/vosk-model-de-0.21/rnnlm/feat_embedding.final.mat filter=lfs diff=lfs merge=lfs -text
|
| 123 |
+
stt/de/vosk-model-de-0.21/rnnlm/final.raw filter=lfs diff=lfs merge=lfs -text
|
| 124 |
+
stt/de/vosk-model-de-0.21/rnnlm/word_feats.txt filter=lfs diff=lfs merge=lfs -text
|
| 125 |
+
stt/de/vosk-model-de-tuda-0.6-900k/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 126 |
+
stt/de/vosk-model-de-tuda-0.6-900k/am/tree filter=lfs diff=lfs merge=lfs -text
|
| 127 |
+
stt/de/vosk-model-de-tuda-0.6-900k/graph/HCLG.fst filter=lfs diff=lfs merge=lfs -text
|
| 128 |
+
stt/de/vosk-model-de-tuda-0.6-900k/graph/phones/align_lexicon.int filter=lfs diff=lfs merge=lfs -text
|
| 129 |
+
stt/de/vosk-model-de-tuda-0.6-900k/graph/phones/align_lexicon.txt filter=lfs diff=lfs merge=lfs -text
|
| 130 |
+
stt/de/vosk-model-de-tuda-0.6-900k/graph/words.txt filter=lfs diff=lfs merge=lfs -text
|
| 131 |
+
stt/de/vosk-model-de-tuda-0.6-900k/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 132 |
+
stt/de/vosk-model-de-tuda-0.6-900k/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 133 |
+
stt/de/vosk-model-de-tuda-0.6-900k/rescore/G.carpa filter=lfs diff=lfs merge=lfs -text
|
| 134 |
+
stt/de/vosk-model-de-tuda-0.6-900k/rescore/G.fst filter=lfs diff=lfs merge=lfs -text
|
| 135 |
+
stt/de/vosk-model-de-tuda-0.6-900k/rnnlm/feat_embedding.final.mat filter=lfs diff=lfs merge=lfs -text
|
| 136 |
+
stt/de/vosk-model-de-tuda-0.6-900k/rnnlm/final.raw filter=lfs diff=lfs merge=lfs -text
|
| 137 |
+
stt/de/vosk-model-de-tuda-0.6-900k/rnnlm/unigram_probs.txt filter=lfs diff=lfs merge=lfs -text
|
| 138 |
+
stt/de/vosk-model-de-tuda-0.6-900k/rnnlm/word_feats.txt filter=lfs diff=lfs merge=lfs -text
|
| 139 |
+
stt/de/vosk-model-small-de-0.15/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 140 |
+
stt/de/vosk-model-small-de-0.15/graph/Gr.fst filter=lfs diff=lfs merge=lfs -text
|
| 141 |
+
stt/de/vosk-model-small-de-0.15/graph/HCLr.fst filter=lfs diff=lfs merge=lfs -text
|
| 142 |
+
stt/de/vosk-model-small-de-0.15/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 143 |
+
stt/de/vosk-model-small-de-0.15/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 144 |
+
stt/de/vosk-model-small-de-zamia-0.3/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 145 |
+
stt/de/vosk-model-small-de-zamia-0.3/Gr.fst filter=lfs diff=lfs merge=lfs -text
|
| 146 |
+
stt/de/vosk-model-small-de-zamia-0.3/HCLr.fst filter=lfs diff=lfs merge=lfs -text
|
| 147 |
+
stt/de/vosk-model-small-de-zamia-0.3/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 148 |
+
stt/de/vosk-model-small-de-zamia-0.3/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 149 |
+
stt/en-in/vosk-model-en-in-0.5/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 150 |
+
stt/en-in/vosk-model-en-in-0.5/graph/HCLG.fst filter=lfs diff=lfs merge=lfs -text
|
| 151 |
+
stt/en-in/vosk-model-en-in-0.5/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 152 |
+
stt/en-in/vosk-model-en-in-0.5/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 153 |
+
stt/en-in/vosk-model-en-in-0.5/rescore/G.carpa filter=lfs diff=lfs merge=lfs -text
|
| 154 |
+
stt/en-in/vosk-model-en-in-0.5/rescore/G.fst filter=lfs diff=lfs merge=lfs -text
|
| 155 |
+
stt/en-in/vosk-model-small-en-in-0.4/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 156 |
+
stt/en-in/vosk-model-small-en-in-0.4/graph/Gr.fst filter=lfs diff=lfs merge=lfs -text
|
| 157 |
+
stt/en-in/vosk-model-small-en-in-0.4/graph/HCLr.fst filter=lfs diff=lfs merge=lfs -text
|
| 158 |
+
stt/en-in/vosk-model-small-en-in-0.4/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 159 |
+
stt/en-in/vosk-model-small-en-in-0.4/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 160 |
+
stt/en-us_other/vosk-model-en-us-0.21/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 161 |
+
stt/en-us_other/vosk-model-en-us-0.21/am/tree filter=lfs diff=lfs merge=lfs -text
|
| 162 |
+
stt/en-us_other/vosk-model-en-us-0.21/graph/HCLG.fst filter=lfs diff=lfs merge=lfs -text
|
| 163 |
+
stt/en-us_other/vosk-model-en-us-0.21/graph/phones/align_lexicon.txt filter=lfs diff=lfs merge=lfs -text
|
| 164 |
+
stt/en-us_other/vosk-model-en-us-0.21/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 165 |
+
stt/en-us_other/vosk-model-en-us-0.21/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 166 |
+
stt/en-us_other/vosk-model-en-us-0.21/rescore/G.carpa filter=lfs diff=lfs merge=lfs -text
|
| 167 |
+
stt/en-us_other/vosk-model-en-us-0.21/rescore/G.fst filter=lfs diff=lfs merge=lfs -text
|
| 168 |
+
stt/en-us_other/vosk-model-en-us-0.21/rnnlm/feat_embedding.final.mat filter=lfs diff=lfs merge=lfs -text
|
| 169 |
+
stt/en-us_other/vosk-model-en-us-0.21/rnnlm/final.raw filter=lfs diff=lfs merge=lfs -text
|
| 170 |
+
stt/en-us_other/vosk-model-en-us-0.21/rnnlm/word_feats.txt filter=lfs diff=lfs merge=lfs -text
|
| 171 |
+
stt/en-us_other/vosk-model-en-us-aspire-0.2/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 172 |
+
stt/en-us_other/vosk-model-en-us-aspire-0.2/am/tree filter=lfs diff=lfs merge=lfs -text
|
| 173 |
+
stt/en-us_other/vosk-model-en-us-aspire-0.2/graph/HCLG.fst filter=lfs diff=lfs merge=lfs -text
|
| 174 |
+
stt/en-us_other/vosk-model-en-us-aspire-0.2/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 175 |
+
stt/en-us_other/vosk-model-en-us-aspire-0.2/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 176 |
+
stt/en-us_other/vosk-model-en-us-aspire-0.2/rescore/G.carpa filter=lfs diff=lfs merge=lfs -text
|
| 177 |
+
stt/en-us_other/vosk-model-en-us-aspire-0.2/rescore/G.fst filter=lfs diff=lfs merge=lfs -text
|
| 178 |
+
stt/en-us_other/vosk-model-en-us-daanzu-lgraph/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 179 |
+
stt/en-us_other/vosk-model-en-us-daanzu-lgraph/am/tree filter=lfs diff=lfs merge=lfs -text
|
| 180 |
+
stt/en-us_other/vosk-model-en-us-daanzu-lgraph/graph/Gr.fst filter=lfs diff=lfs merge=lfs -text
|
| 181 |
+
stt/en-us_other/vosk-model-en-us-daanzu-lgraph/graph/HCLr.fst filter=lfs diff=lfs merge=lfs -text
|
| 182 |
+
stt/en-us_other/vosk-model-en-us-daanzu-lgraph/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 183 |
+
stt/en-us_other/vosk-model-en-us-daanzu-lgraph/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 184 |
+
stt/en-us_other/vosk-model-en-us-daanzu/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 185 |
+
stt/en-us_other/vosk-model-en-us-daanzu/am/tree filter=lfs diff=lfs merge=lfs -text
|
| 186 |
+
stt/en-us_other/vosk-model-en-us-daanzu/graph/HCLG.fst filter=lfs diff=lfs merge=lfs -text
|
| 187 |
+
stt/en-us_other/vosk-model-en-us-daanzu/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 188 |
+
stt/en-us_other/vosk-model-en-us-daanzu/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 189 |
+
stt/en-us_other/vosk-model-en-us-daanzu/rescore/G.carpa filter=lfs diff=lfs merge=lfs -text
|
| 190 |
+
stt/en-us_other/vosk-model-en-us-daanzu/rescore/G.fst filter=lfs diff=lfs merge=lfs -text
|
| 191 |
+
stt/en-us_other/vosk-model-en-us-librispeech-0.2/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 192 |
+
stt/en-us_other/vosk-model-en-us-librispeech-0.2/am/tree filter=lfs diff=lfs merge=lfs -text
|
| 193 |
+
stt/en-us_other/vosk-model-en-us-librispeech-0.2/graph/HCLG.fst filter=lfs diff=lfs merge=lfs -text
|
| 194 |
+
stt/en-us_other/vosk-model-en-us-librispeech-0.2/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 195 |
+
stt/en-us_other/vosk-model-en-us-librispeech-0.2/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 196 |
+
stt/en-us_other/vosk-model-en-us-librispeech-0.2/rescore/G.carpa filter=lfs diff=lfs merge=lfs -text
|
| 197 |
+
stt/en-us_other/vosk-model-en-us-librispeech-0.2/rescore/G.fst filter=lfs diff=lfs merge=lfs -text
|
| 198 |
+
stt/en-us_other/vosk-model-small-en-us-zamia-0.5/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 199 |
+
stt/en-us_other/vosk-model-small-en-us-zamia-0.5/graph/Gr.fst filter=lfs diff=lfs merge=lfs -text
|
| 200 |
+
stt/en-us_other/vosk-model-small-en-us-zamia-0.5/graph/HCLr.fst filter=lfs diff=lfs merge=lfs -text
|
| 201 |
+
stt/en-us_other/vosk-model-small-en-us-zamia-0.5/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 202 |
+
stt/en-us_other/vosk-model-small-en-us-zamia-0.5/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 203 |
+
stt/en-us/vosk-model-en-us-0.22-lgraph/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 204 |
+
stt/en-us/vosk-model-en-us-0.22-lgraph/am/tree filter=lfs diff=lfs merge=lfs -text
|
| 205 |
+
stt/en-us/vosk-model-en-us-0.22-lgraph/graph/Gr.fst filter=lfs diff=lfs merge=lfs -text
|
| 206 |
+
stt/en-us/vosk-model-en-us-0.22-lgraph/graph/HCLr.fst filter=lfs diff=lfs merge=lfs -text
|
| 207 |
+
stt/en-us/vosk-model-en-us-0.22-lgraph/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 208 |
+
stt/en-us/vosk-model-en-us-0.22-lgraph/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 209 |
+
stt/en-us/vosk-model-en-us-0.22/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 210 |
+
stt/en-us/vosk-model-en-us-0.22/am/tree filter=lfs diff=lfs merge=lfs -text
|
| 211 |
+
stt/en-us/vosk-model-en-us-0.22/graph/HCLG.fst filter=lfs diff=lfs merge=lfs -text
|
| 212 |
+
stt/en-us/vosk-model-en-us-0.22/graph/phones/align_lexicon.int filter=lfs diff=lfs merge=lfs -text
|
| 213 |
+
stt/en-us/vosk-model-en-us-0.22/graph/phones/align_lexicon.txt filter=lfs diff=lfs merge=lfs -text
|
| 214 |
+
stt/en-us/vosk-model-en-us-0.22/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 215 |
+
stt/en-us/vosk-model-en-us-0.22/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 216 |
+
stt/en-us/vosk-model-en-us-0.22/rescore/G.carpa filter=lfs diff=lfs merge=lfs -text
|
| 217 |
+
stt/en-us/vosk-model-en-us-0.22/rescore/G.fst filter=lfs diff=lfs merge=lfs -text
|
| 218 |
+
stt/en-us/vosk-model-en-us-0.22/rnnlm/feat_embedding.final.mat filter=lfs diff=lfs merge=lfs -text
|
| 219 |
+
stt/en-us/vosk-model-en-us-0.22/rnnlm/final.raw filter=lfs diff=lfs merge=lfs -text
|
| 220 |
+
stt/en-us/vosk-model-en-us-0.22/rnnlm/word_feats.txt filter=lfs diff=lfs merge=lfs -text
|
| 221 |
+
stt/en-us/vosk-model-en-us-0.42-gigaspeech/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 222 |
+
stt/en-us/vosk-model-en-us-0.42-gigaspeech/am/tree filter=lfs diff=lfs merge=lfs -text
|
| 223 |
+
stt/en-us/vosk-model-en-us-0.42-gigaspeech/graph/HCLG.fst filter=lfs diff=lfs merge=lfs -text
|
| 224 |
+
stt/en-us/vosk-model-en-us-0.42-gigaspeech/graph/phones/align_lexicon.int filter=lfs diff=lfs merge=lfs -text
|
| 225 |
+
stt/en-us/vosk-model-en-us-0.42-gigaspeech/graph/phones/align_lexicon.txt filter=lfs diff=lfs merge=lfs -text
|
| 226 |
+
stt/en-us/vosk-model-en-us-0.42-gigaspeech/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 227 |
+
stt/en-us/vosk-model-en-us-0.42-gigaspeech/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 228 |
+
stt/en-us/vosk-model-en-us-0.42-gigaspeech/rescore/G.carpa filter=lfs diff=lfs merge=lfs -text
|
| 229 |
+
stt/en-us/vosk-model-en-us-0.42-gigaspeech/rescore/G.fst filter=lfs diff=lfs merge=lfs -text
|
| 230 |
+
stt/en-us/vosk-model-en-us-0.42-gigaspeech/rnnlm/feat_embedding.final.mat filter=lfs diff=lfs merge=lfs -text
|
| 231 |
+
stt/en-us/vosk-model-en-us-0.42-gigaspeech/rnnlm/final.raw filter=lfs diff=lfs merge=lfs -text
|
| 232 |
+
stt/en-us/vosk-model-en-us-0.42-gigaspeech/rnnlm/word_feats.txt filter=lfs diff=lfs merge=lfs -text
|
| 233 |
+
stt/en-us/vosk-model-small-en-us-0.15/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 234 |
+
stt/en-us/vosk-model-small-en-us-0.15/graph/Gr.fst filter=lfs diff=lfs merge=lfs -text
|
| 235 |
+
stt/en-us/vosk-model-small-en-us-0.15/graph/HCLr.fst filter=lfs diff=lfs merge=lfs -text
|
| 236 |
+
stt/en-us/vosk-model-small-en-us-0.15/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 237 |
+
stt/en-us/vosk-model-small-en-us-0.15/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 238 |
+
stt/eo/vosk-model-small-eo-0.42/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 239 |
+
stt/eo/vosk-model-small-eo-0.42/graph/Gr.fst filter=lfs diff=lfs merge=lfs -text
|
| 240 |
+
stt/eo/vosk-model-small-eo-0.42/graph/HCLr.fst filter=lfs diff=lfs merge=lfs -text
|
| 241 |
+
stt/eo/vosk-model-small-eo-0.42/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 242 |
+
stt/eo/vosk-model-small-eo-0.42/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 243 |
+
stt/es/vosk-model-es-0.42/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 244 |
+
stt/es/vosk-model-es-0.42/graph/HCLG.fst filter=lfs diff=lfs merge=lfs -text
|
| 245 |
+
stt/es/vosk-model-es-0.42/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 246 |
+
stt/es/vosk-model-es-0.42/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 247 |
+
stt/es/vosk-model-es-0.42/rescore/G.carpa filter=lfs diff=lfs merge=lfs -text
|
| 248 |
+
stt/es/vosk-model-es-0.42/rescore/G.fst filter=lfs diff=lfs merge=lfs -text
|
| 249 |
+
stt/es/vosk-model-es-0.42/rnnlm/feat_embedding.final.mat filter=lfs diff=lfs merge=lfs -text
|
| 250 |
+
stt/es/vosk-model-es-0.42/rnnlm/final.raw filter=lfs diff=lfs merge=lfs -text
|
| 251 |
+
stt/es/vosk-model-es-0.42/rnnlm/word_feats.txt filter=lfs diff=lfs merge=lfs -text
|
| 252 |
+
stt/es/vosk-model-small-es-0.42/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 253 |
+
stt/es/vosk-model-small-es-0.42/graph/Gr.fst filter=lfs diff=lfs merge=lfs -text
|
| 254 |
+
stt/es/vosk-model-small-es-0.42/graph/HCLr.fst filter=lfs diff=lfs merge=lfs -text
|
| 255 |
+
stt/es/vosk-model-small-es-0.42/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 256 |
+
stt/es/vosk-model-small-es-0.42/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 257 |
+
stt/fa_other/vosk-model-fa-0.5/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 258 |
+
stt/fa_other/vosk-model-fa-0.5/am/tree filter=lfs diff=lfs merge=lfs -text
|
| 259 |
+
stt/fa_other/vosk-model-fa-0.5/graph/HCLG.fst filter=lfs diff=lfs merge=lfs -text
|
| 260 |
+
stt/fa_other/vosk-model-fa-0.5/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 261 |
+
stt/fa_other/vosk-model-fa-0.5/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 262 |
+
stt/fa_other/vosk-model-fa-0.5/rescore/G.carpa filter=lfs diff=lfs merge=lfs -text
|
| 263 |
+
stt/fa_other/vosk-model-fa-0.5/rescore/G.fst filter=lfs diff=lfs merge=lfs -text
|
| 264 |
+
stt/fa_other/vosk-model-fa-0.5/test/test.wav filter=lfs diff=lfs merge=lfs -text
|
| 265 |
+
stt/fa_other/vosk-model-small-fa-0.5/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 266 |
+
stt/fa_other/vosk-model-small-fa-0.5/am/tree filter=lfs diff=lfs merge=lfs -text
|
| 267 |
+
stt/fa_other/vosk-model-small-fa-0.5/graph/Gr.fst filter=lfs diff=lfs merge=lfs -text
|
| 268 |
+
stt/fa_other/vosk-model-small-fa-0.5/graph/HCLr.fst filter=lfs diff=lfs merge=lfs -text
|
| 269 |
+
stt/fa_other/vosk-model-small-fa-0.5/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 270 |
+
stt/fa_other/vosk-model-small-fa-0.5/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 271 |
+
stt/fa_other/vosk-model-small-fa-0.5/test/test.wav filter=lfs diff=lfs merge=lfs -text
|
| 272 |
+
stt/fa/vosk-model-fa-0.42/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 273 |
+
stt/fa/vosk-model-fa-0.42/graph/HCLG.fst filter=lfs diff=lfs merge=lfs -text
|
| 274 |
+
stt/fa/vosk-model-fa-0.42/graph/phones/align_lexicon.int filter=lfs diff=lfs merge=lfs -text
|
| 275 |
+
stt/fa/vosk-model-fa-0.42/graph/phones/align_lexicon.txt filter=lfs diff=lfs merge=lfs -text
|
| 276 |
+
stt/fa/vosk-model-fa-0.42/graph/words.txt filter=lfs diff=lfs merge=lfs -text
|
| 277 |
+
stt/fa/vosk-model-fa-0.42/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 278 |
+
stt/fa/vosk-model-fa-0.42/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 279 |
+
stt/fa/vosk-model-fa-0.42/rescore/G.carpa filter=lfs diff=lfs merge=lfs -text
|
| 280 |
+
stt/fa/vosk-model-fa-0.42/rescore/G.fst filter=lfs diff=lfs merge=lfs -text
|
| 281 |
+
stt/fa/vosk-model-fa-0.42/test/test.wav filter=lfs diff=lfs merge=lfs -text
|
| 282 |
+
stt/fa/vosk-model-small-fa-0.42/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 283 |
+
stt/fa/vosk-model-small-fa-0.42/graph/Gr.fst filter=lfs diff=lfs merge=lfs -text
|
| 284 |
+
stt/fa/vosk-model-small-fa-0.42/graph/HCLr.fst filter=lfs diff=lfs merge=lfs -text
|
| 285 |
+
stt/fa/vosk-model-small-fa-0.42/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 286 |
+
stt/fa/vosk-model-small-fa-0.42/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 287 |
+
stt/fa/vosk-model-small-fa-0.42/test/test.wav filter=lfs diff=lfs merge=lfs -text
|
| 288 |
+
stt/fr_other/vosk-model-fr-0.6-linto-2.2.0/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 289 |
+
stt/fr_other/vosk-model-fr-0.6-linto-2.2.0/am/tree filter=lfs diff=lfs merge=lfs -text
|
| 290 |
+
stt/fr_other/vosk-model-fr-0.6-linto-2.2.0/graph/HCLG.fst filter=lfs diff=lfs merge=lfs -text
|
| 291 |
+
stt/fr_other/vosk-model-fr-0.6-linto-2.2.0/graph/phones/align_lexicon.int filter=lfs diff=lfs merge=lfs -text
|
| 292 |
+
stt/fr_other/vosk-model-fr-0.6-linto-2.2.0/graph/phones/align_lexicon.txt filter=lfs diff=lfs merge=lfs -text
|
| 293 |
+
stt/fr_other/vosk-model-fr-0.6-linto-2.2.0/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 294 |
+
stt/fr_other/vosk-model-fr-0.6-linto-2.2.0/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 295 |
+
stt/fr_other/vosk-model-fr-0.6-linto-2.2.0/rescore/G.carpa filter=lfs diff=lfs merge=lfs -text
|
| 296 |
+
stt/fr_other/vosk-model-fr-0.6-linto-2.2.0/rescore/G.fst filter=lfs diff=lfs merge=lfs -text
|
| 297 |
+
stt/fr_other/vosk-model-small-fr-pguyot-0.3/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 298 |
+
stt/fr_other/vosk-model-small-fr-pguyot-0.3/Gr.fst filter=lfs diff=lfs merge=lfs -text
|
| 299 |
+
stt/fr_other/vosk-model-small-fr-pguyot-0.3/HCLr.fst filter=lfs diff=lfs merge=lfs -text
|
| 300 |
+
stt/fr_other/vosk-model-small-fr-pguyot-0.3/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 301 |
+
stt/fr_other/vosk-model-small-fr-pguyot-0.3/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 302 |
+
stt/fr/vosk-model-fr-0.22/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 303 |
+
stt/fr/vosk-model-fr-0.22/graph/HCLG.fst filter=lfs diff=lfs merge=lfs -text
|
| 304 |
+
stt/fr/vosk-model-fr-0.22/graph/phones/align_lexicon.int filter=lfs diff=lfs merge=lfs -text
|
| 305 |
+
stt/fr/vosk-model-fr-0.22/graph/phones/align_lexicon.txt filter=lfs diff=lfs merge=lfs -text
|
| 306 |
+
stt/fr/vosk-model-fr-0.22/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 307 |
+
stt/fr/vosk-model-fr-0.22/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 308 |
+
stt/fr/vosk-model-fr-0.22/rescore/G.carpa filter=lfs diff=lfs merge=lfs -text
|
| 309 |
+
stt/fr/vosk-model-fr-0.22/rescore/G.fst filter=lfs diff=lfs merge=lfs -text
|
| 310 |
+
stt/fr/vosk-model-fr-0.22/rnnlm/feat_embedding.final.mat filter=lfs diff=lfs merge=lfs -text
|
| 311 |
+
stt/fr/vosk-model-fr-0.22/rnnlm/final.raw filter=lfs diff=lfs merge=lfs -text
|
| 312 |
+
stt/fr/vosk-model-fr-0.22/rnnlm/unigram_probs.txt filter=lfs diff=lfs merge=lfs -text
|
| 313 |
+
stt/fr/vosk-model-fr-0.22/rnnlm/word_feats.txt filter=lfs diff=lfs merge=lfs -text
|
| 314 |
+
stt/fr/vosk-model-small-fr-0.22/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 315 |
+
stt/fr/vosk-model-small-fr-0.22/graph/Gr.fst filter=lfs diff=lfs merge=lfs -text
|
| 316 |
+
stt/fr/vosk-model-small-fr-0.22/graph/HCLr.fst filter=lfs diff=lfs merge=lfs -text
|
| 317 |
+
stt/fr/vosk-model-small-fr-0.22/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 318 |
+
stt/fr/vosk-model-small-fr-0.22/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 319 |
+
stt/gr/vosk-model-el-gr-0.7/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 320 |
+
stt/gr/vosk-model-el-gr-0.7/am/tree filter=lfs diff=lfs merge=lfs -text
|
| 321 |
+
stt/gr/vosk-model-el-gr-0.7/graph/HCLG.fst filter=lfs diff=lfs merge=lfs -text
|
| 322 |
+
stt/gr/vosk-model-el-gr-0.7/graph/phones/align_lexicon.int filter=lfs diff=lfs merge=lfs -text
|
| 323 |
+
stt/gr/vosk-model-el-gr-0.7/graph/phones/align_lexicon.txt filter=lfs diff=lfs merge=lfs -text
|
| 324 |
+
stt/gr/vosk-model-el-gr-0.7/graph/words.txt filter=lfs diff=lfs merge=lfs -text
|
| 325 |
+
stt/gr/vosk-model-el-gr-0.7/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 326 |
+
stt/gr/vosk-model-el-gr-0.7/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 327 |
+
stt/gr/vosk-model-el-gr-0.7/other/el-gr.dic filter=lfs diff=lfs merge=lfs -text
|
| 328 |
+
stt/gr/vosk-model-el-gr-0.7/rescore/G.carpa filter=lfs diff=lfs merge=lfs -text
|
| 329 |
+
stt/gr/vosk-model-el-gr-0.7/rescore/G.fst filter=lfs diff=lfs merge=lfs -text
|
| 330 |
+
stt/gu/vosk-model-gu-0.42/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 331 |
+
stt/gu/vosk-model-gu-0.42/graph/HCLG.fst filter=lfs diff=lfs merge=lfs -text
|
| 332 |
+
stt/gu/vosk-model-gu-0.42/graph/phones/align_lexicon.int filter=lfs diff=lfs merge=lfs -text
|
| 333 |
+
stt/gu/vosk-model-gu-0.42/graph/phones/align_lexicon.txt filter=lfs diff=lfs merge=lfs -text
|
| 334 |
+
stt/gu/vosk-model-gu-0.42/graph/words.txt filter=lfs diff=lfs merge=lfs -text
|
| 335 |
+
stt/gu/vosk-model-gu-0.42/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 336 |
+
stt/gu/vosk-model-gu-0.42/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 337 |
+
stt/gu/vosk-model-gu-0.42/rescore/G.carpa filter=lfs diff=lfs merge=lfs -text
|
| 338 |
+
stt/gu/vosk-model-gu-0.42/rescore/G.fst filter=lfs diff=lfs merge=lfs -text
|
| 339 |
+
stt/gu/vosk-model-small-gu-0.42/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 340 |
+
stt/gu/vosk-model-small-gu-0.42/graph/Gr.fst filter=lfs diff=lfs merge=lfs -text
|
| 341 |
+
stt/gu/vosk-model-small-gu-0.42/graph/HCLr.fst filter=lfs diff=lfs merge=lfs -text
|
| 342 |
+
stt/gu/vosk-model-small-gu-0.42/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 343 |
+
stt/gu/vosk-model-small-gu-0.42/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 344 |
+
stt/hi/vosk-model-hi-0.22/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 345 |
+
stt/hi/vosk-model-hi-0.22/graph/HCLG.fst filter=lfs diff=lfs merge=lfs -text
|
| 346 |
+
stt/hi/vosk-model-hi-0.22/graph/phones/align_lexicon.txt filter=lfs diff=lfs merge=lfs -text
|
| 347 |
+
stt/hi/vosk-model-hi-0.22/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 348 |
+
stt/hi/vosk-model-hi-0.22/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 349 |
+
stt/hi/vosk-model-hi-0.22/rescore/G.carpa filter=lfs diff=lfs merge=lfs -text
|
| 350 |
+
stt/hi/vosk-model-hi-0.22/rescore/G.fst filter=lfs diff=lfs merge=lfs -text
|
| 351 |
+
stt/hi/vosk-model-hi-0.22/rnnlm/feat_embedding.final.mat filter=lfs diff=lfs merge=lfs -text
|
| 352 |
+
stt/hi/vosk-model-hi-0.22/rnnlm/final.raw filter=lfs diff=lfs merge=lfs -text
|
| 353 |
+
stt/hi/vosk-model-hi-0.22/rnnlm/word_feats.txt filter=lfs diff=lfs merge=lfs -text
|
| 354 |
+
stt/hi/vosk-model-small-hi-0.22/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 355 |
+
stt/hi/vosk-model-small-hi-0.22/graph/Gr.fst filter=lfs diff=lfs merge=lfs -text
|
| 356 |
+
stt/hi/vosk-model-small-hi-0.22/graph/HCLr.fst filter=lfs diff=lfs merge=lfs -text
|
| 357 |
+
stt/hi/vosk-model-small-hi-0.22/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 358 |
+
stt/hi/vosk-model-small-hi-0.22/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 359 |
+
stt/it/vosk-model-it-0.22/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 360 |
+
stt/it/vosk-model-it-0.22/graph/HCLG.fst filter=lfs diff=lfs merge=lfs -text
|
| 361 |
+
stt/it/vosk-model-it-0.22/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 362 |
+
stt/it/vosk-model-it-0.22/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 363 |
+
stt/it/vosk-model-it-0.22/rescore/G.carpa filter=lfs diff=lfs merge=lfs -text
|
| 364 |
+
stt/it/vosk-model-it-0.22/rescore/G.fst filter=lfs diff=lfs merge=lfs -text
|
| 365 |
+
stt/it/vosk-model-small-it-0.22/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 366 |
+
stt/it/vosk-model-small-it-0.22/graph/Gr.fst filter=lfs diff=lfs merge=lfs -text
|
| 367 |
+
stt/it/vosk-model-small-it-0.22/graph/HCLr.fst filter=lfs diff=lfs merge=lfs -text
|
| 368 |
+
stt/it/vosk-model-small-it-0.22/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 369 |
+
stt/it/vosk-model-small-it-0.22/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 370 |
+
stt/ja/vosk-model-ja-0.22/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 371 |
+
stt/ja/vosk-model-ja-0.22/graph/HCLG.fst filter=lfs diff=lfs merge=lfs -text
|
| 372 |
+
stt/ja/vosk-model-ja-0.22/graph/phones/align_lexicon.int filter=lfs diff=lfs merge=lfs -text
|
| 373 |
+
stt/ja/vosk-model-ja-0.22/graph/phones/align_lexicon.txt filter=lfs diff=lfs merge=lfs -text
|
| 374 |
+
stt/ja/vosk-model-ja-0.22/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 375 |
+
stt/ja/vosk-model-ja-0.22/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 376 |
+
stt/ja/vosk-model-ja-0.22/rescore/G.carpa filter=lfs diff=lfs merge=lfs -text
|
| 377 |
+
stt/ja/vosk-model-ja-0.22/rescore/G.fst filter=lfs diff=lfs merge=lfs -text
|
| 378 |
+
stt/ja/vosk-model-small-ja-0.22/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 379 |
+
stt/ja/vosk-model-small-ja-0.22/graph/Gr.fst filter=lfs diff=lfs merge=lfs -text
|
| 380 |
+
stt/ja/vosk-model-small-ja-0.22/graph/HCLr.fst filter=lfs diff=lfs merge=lfs -text
|
| 381 |
+
stt/ja/vosk-model-small-ja-0.22/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 382 |
+
stt/ja/vosk-model-small-ja-0.22/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 383 |
+
stt/ko/vosk-model-small-ko-0.22/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 384 |
+
stt/ko/vosk-model-small-ko-0.22/graph/Gr.fst filter=lfs diff=lfs merge=lfs -text
|
| 385 |
+
stt/ko/vosk-model-small-ko-0.22/graph/HCLr.fst filter=lfs diff=lfs merge=lfs -text
|
| 386 |
+
stt/ko/vosk-model-small-ko-0.22/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 387 |
+
stt/ko/vosk-model-small-ko-0.22/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 388 |
+
stt/kz/vosk-model-kz-0.15/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 389 |
+
stt/kz/vosk-model-kz-0.15/am/tree filter=lfs diff=lfs merge=lfs -text
|
| 390 |
+
stt/kz/vosk-model-kz-0.15/graph/HCLG.fst filter=lfs diff=lfs merge=lfs -text
|
| 391 |
+
stt/kz/vosk-model-kz-0.15/graph/phones/align_lexicon.txt filter=lfs diff=lfs merge=lfs -text
|
| 392 |
+
stt/kz/vosk-model-kz-0.15/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 393 |
+
stt/kz/vosk-model-kz-0.15/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 394 |
+
stt/kz/vosk-model-kz-0.15/rescore/G.carpa filter=lfs diff=lfs merge=lfs -text
|
| 395 |
+
stt/kz/vosk-model-kz-0.15/rescore/G.fst filter=lfs diff=lfs merge=lfs -text
|
| 396 |
+
stt/kz/vosk-model-small-kz-0.15/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 397 |
+
stt/kz/vosk-model-small-kz-0.15/am/tree filter=lfs diff=lfs merge=lfs -text
|
| 398 |
+
stt/kz/vosk-model-small-kz-0.15/graph/Gr.fst filter=lfs diff=lfs merge=lfs -text
|
| 399 |
+
stt/kz/vosk-model-small-kz-0.15/graph/HCLr.fst filter=lfs diff=lfs merge=lfs -text
|
| 400 |
+
stt/kz/vosk-model-small-kz-0.15/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 401 |
+
stt/kz/vosk-model-small-kz-0.15/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 402 |
+
stt/nl_other/vosk-model-nl-spraakherkenning-0.6-lgraph/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 403 |
+
stt/nl_other/vosk-model-nl-spraakherkenning-0.6-lgraph/am/tree filter=lfs diff=lfs merge=lfs -text
|
| 404 |
+
stt/nl_other/vosk-model-nl-spraakherkenning-0.6-lgraph/graph/Gr.fst filter=lfs diff=lfs merge=lfs -text
|
| 405 |
+
stt/nl_other/vosk-model-nl-spraakherkenning-0.6-lgraph/graph/HCLr.fst filter=lfs diff=lfs merge=lfs -text
|
| 406 |
+
stt/nl_other/vosk-model-nl-spraakherkenning-0.6-lgraph/graph/phones/align_lexicon.int filter=lfs diff=lfs merge=lfs -text
|
| 407 |
+
stt/nl_other/vosk-model-nl-spraakherkenning-0.6-lgraph/graph/phones/align_lexicon.txt filter=lfs diff=lfs merge=lfs -text
|
| 408 |
+
stt/nl_other/vosk-model-nl-spraakherkenning-0.6-lgraph/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 409 |
+
stt/nl_other/vosk-model-nl-spraakherkenning-0.6-lgraph/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 410 |
+
stt/nl_other/vosk-model-nl-spraakherkenning-0.6/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 411 |
+
stt/nl_other/vosk-model-nl-spraakherkenning-0.6/am/tree filter=lfs diff=lfs merge=lfs -text
|
| 412 |
+
stt/nl_other/vosk-model-nl-spraakherkenning-0.6/graph/HCLG.fst filter=lfs diff=lfs merge=lfs -text
|
| 413 |
+
stt/nl_other/vosk-model-nl-spraakherkenning-0.6/graph/phones/align_lexicon.int filter=lfs diff=lfs merge=lfs -text
|
| 414 |
+
stt/nl_other/vosk-model-nl-spraakherkenning-0.6/graph/phones/align_lexicon.txt filter=lfs diff=lfs merge=lfs -text
|
| 415 |
+
stt/nl_other/vosk-model-nl-spraakherkenning-0.6/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 416 |
+
stt/nl_other/vosk-model-nl-spraakherkenning-0.6/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 417 |
+
stt/nl_other/vosk-model-nl-spraakherkenning-0.6/rescore/G.carpa filter=lfs diff=lfs merge=lfs -text
|
| 418 |
+
stt/nl_other/vosk-model-nl-spraakherkenning-0.6/rescore/G.fst filter=lfs diff=lfs merge=lfs -text
|
| 419 |
+
stt/nl/vosk-model-small-nl-0.22/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 420 |
+
stt/nl/vosk-model-small-nl-0.22/graph/Gr.fst filter=lfs diff=lfs merge=lfs -text
|
| 421 |
+
stt/nl/vosk-model-small-nl-0.22/graph/HCLr.fst filter=lfs diff=lfs merge=lfs -text
|
| 422 |
+
stt/nl/vosk-model-small-nl-0.22/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 423 |
+
stt/nl/vosk-model-small-nl-0.22/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 424 |
+
stt/pl/vosk-model-small-pl-0.22/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 425 |
+
stt/pl/vosk-model-small-pl-0.22/graph/Gr.fst filter=lfs diff=lfs merge=lfs -text
|
| 426 |
+
stt/pl/vosk-model-small-pl-0.22/graph/HCLr.fst filter=lfs diff=lfs merge=lfs -text
|
| 427 |
+
stt/pl/vosk-model-small-pl-0.22/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 428 |
+
stt/pl/vosk-model-small-pl-0.22/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 429 |
+
stt/pt/vosk-model-pt-fb-v0.1.1/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 430 |
+
stt/pt/vosk-model-pt-fb-v0.1.1/am/tree filter=lfs diff=lfs merge=lfs -text
|
| 431 |
+
stt/pt/vosk-model-pt-fb-v0.1.1/graph/Gr.fst filter=lfs diff=lfs merge=lfs -text
|
| 432 |
+
stt/pt/vosk-model-pt-fb-v0.1.1/graph/HCLG.fst filter=lfs diff=lfs merge=lfs -text
|
| 433 |
+
stt/pt/vosk-model-pt-fb-v0.1.1/graph/HCLr.fst filter=lfs diff=lfs merge=lfs -text
|
| 434 |
+
stt/pt/vosk-model-pt-fb-v0.1.1/graph/phones/align_lexicon.int filter=lfs diff=lfs merge=lfs -text
|
| 435 |
+
stt/pt/vosk-model-pt-fb-v0.1.1/graph/phones/align_lexicon.txt filter=lfs diff=lfs merge=lfs -text
|
| 436 |
+
stt/pt/vosk-model-pt-fb-v0.1.1/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 437 |
+
stt/pt/vosk-model-pt-fb-v0.1.1/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 438 |
+
stt/pt/vosk-model-pt-fb-v0.1.1/rescore/G.carpa filter=lfs diff=lfs merge=lfs -text
|
| 439 |
+
stt/pt/vosk-model-pt-fb-v0.1.1/rescore/G.fst filter=lfs diff=lfs merge=lfs -text
|
| 440 |
+
stt/pt/vosk-model-small-pt-0.3/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 441 |
+
stt/pt/vosk-model-small-pt-0.3/Gr.fst filter=lfs diff=lfs merge=lfs -text
|
| 442 |
+
stt/pt/vosk-model-small-pt-0.3/HCLr.fst filter=lfs diff=lfs merge=lfs -text
|
| 443 |
+
stt/pt/vosk-model-small-pt-0.3/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 444 |
+
stt/pt/vosk-model-small-pt-0.3/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 445 |
+
stt/ru_other/vosk-model-ru-0.10/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 446 |
+
stt/ru_other/vosk-model-ru-0.10/am/tree filter=lfs diff=lfs merge=lfs -text
|
| 447 |
+
stt/ru_other/vosk-model-ru-0.10/decoder-test.wav filter=lfs diff=lfs merge=lfs -text
|
| 448 |
+
stt/ru_other/vosk-model-ru-0.10/extra/db/ru.dic filter=lfs diff=lfs merge=lfs -text
|
| 449 |
+
stt/ru_other/vosk-model-ru-0.10/graph/HCLG.fst filter=lfs diff=lfs merge=lfs -text
|
| 450 |
+
stt/ru_other/vosk-model-ru-0.10/graph/phones/align_lexicon.int filter=lfs diff=lfs merge=lfs -text
|
| 451 |
+
stt/ru_other/vosk-model-ru-0.10/graph/phones/align_lexicon.txt filter=lfs diff=lfs merge=lfs -text
|
| 452 |
+
stt/ru_other/vosk-model-ru-0.10/graph/words.txt filter=lfs diff=lfs merge=lfs -text
|
| 453 |
+
stt/ru_other/vosk-model-ru-0.10/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 454 |
+
stt/ru_other/vosk-model-ru-0.10/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 455 |
+
stt/ru_other/vosk-model-ru-0.10/rescore/G.carpa filter=lfs diff=lfs merge=lfs -text
|
| 456 |
+
stt/ru_other/vosk-model-ru-0.10/rescore/G.fst filter=lfs diff=lfs merge=lfs -text
|
| 457 |
+
stt/ru_other/vosk-model-ru-0.10/rescore/phones/align_lexicon.int filter=lfs diff=lfs merge=lfs -text
|
| 458 |
+
stt/ru_other/vosk-model-ru-0.10/rescore/phones/align_lexicon.txt filter=lfs diff=lfs merge=lfs -text
|
| 459 |
+
stt/ru_other/vosk-model-ru-0.10/rescore/words.txt filter=lfs diff=lfs merge=lfs -text
|
| 460 |
+
stt/ru_other/vosk-model-ru-0.10/rnnlm/feat_embedding.final.mat filter=lfs diff=lfs merge=lfs -text
|
| 461 |
+
stt/ru_other/vosk-model-ru-0.10/rnnlm/final.raw filter=lfs diff=lfs merge=lfs -text
|
| 462 |
+
stt/ru_other/vosk-model-ru-0.10/rnnlm/word_feats.txt filter=lfs diff=lfs merge=lfs -text
|
| 463 |
+
stt/ru_other/vosk-model-ru-0.22/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 464 |
+
stt/ru_other/vosk-model-ru-0.22/am/tree filter=lfs diff=lfs merge=lfs -text
|
| 465 |
+
stt/ru_other/vosk-model-ru-0.22/decoder-test.wav filter=lfs diff=lfs merge=lfs -text
|
| 466 |
+
stt/ru_other/vosk-model-ru-0.22/graph/HCLG.fst filter=lfs diff=lfs merge=lfs -text
|
| 467 |
+
stt/ru_other/vosk-model-ru-0.22/graph/phones/align_lexicon.int filter=lfs diff=lfs merge=lfs -text
|
| 468 |
+
stt/ru_other/vosk-model-ru-0.22/graph/phones/align_lexicon.txt filter=lfs diff=lfs merge=lfs -text
|
| 469 |
+
stt/ru_other/vosk-model-ru-0.22/graph/words.txt filter=lfs diff=lfs merge=lfs -text
|
| 470 |
+
stt/ru_other/vosk-model-ru-0.22/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 471 |
+
stt/ru_other/vosk-model-ru-0.22/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 472 |
+
stt/ru_other/vosk-model-ru-0.22/rescore/G.carpa filter=lfs diff=lfs merge=lfs -text
|
| 473 |
+
stt/ru_other/vosk-model-ru-0.22/rescore/G.fst filter=lfs diff=lfs merge=lfs -text
|
| 474 |
+
stt/ru_other/vosk-model-ru-0.22/rnnlm/feat_embedding.final.mat filter=lfs diff=lfs merge=lfs -text
|
| 475 |
+
stt/ru_other/vosk-model-ru-0.22/rnnlm/final.raw filter=lfs diff=lfs merge=lfs -text
|
| 476 |
+
stt/ru_other/vosk-model-ru-0.22/rnnlm/word_feats.txt filter=lfs diff=lfs merge=lfs -text
|
| 477 |
+
stt/ru/vosk-model-ru-0.42/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 478 |
+
stt/ru/vosk-model-ru-0.42/am/tree filter=lfs diff=lfs merge=lfs -text
|
| 479 |
+
stt/ru/vosk-model-ru-0.42/decoder-test.wav filter=lfs diff=lfs merge=lfs -text
|
| 480 |
+
stt/ru/vosk-model-ru-0.42/graph/HCLG.fst filter=lfs diff=lfs merge=lfs -text
|
| 481 |
+
stt/ru/vosk-model-ru-0.42/graph/phones/align_lexicon.int filter=lfs diff=lfs merge=lfs -text
|
| 482 |
+
stt/ru/vosk-model-ru-0.42/graph/phones/align_lexicon.txt filter=lfs diff=lfs merge=lfs -text
|
| 483 |
+
stt/ru/vosk-model-ru-0.42/graph/words.txt filter=lfs diff=lfs merge=lfs -text
|
| 484 |
+
stt/ru/vosk-model-ru-0.42/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 485 |
+
stt/ru/vosk-model-ru-0.42/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 486 |
+
stt/ru/vosk-model-ru-0.42/rescore/G.carpa filter=lfs diff=lfs merge=lfs -text
|
| 487 |
+
stt/ru/vosk-model-ru-0.42/rescore/G.fst filter=lfs diff=lfs merge=lfs -text
|
| 488 |
+
stt/ru/vosk-model-ru-0.42/rnnlm/feat_embedding.final.mat filter=lfs diff=lfs merge=lfs -text
|
| 489 |
+
stt/ru/vosk-model-ru-0.42/rnnlm/final.raw filter=lfs diff=lfs merge=lfs -text
|
| 490 |
+
stt/ru/vosk-model-ru-0.42/rnnlm/unigram_probs.txt filter=lfs diff=lfs merge=lfs -text
|
| 491 |
+
stt/ru/vosk-model-ru-0.42/rnnlm/word_feats.txt filter=lfs diff=lfs merge=lfs -text
|
| 492 |
+
stt/ru/vosk-model-small-ru-0.22/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 493 |
+
stt/ru/vosk-model-small-ru-0.22/graph/Gr.fst filter=lfs diff=lfs merge=lfs -text
|
| 494 |
+
stt/ru/vosk-model-small-ru-0.22/graph/HCLr.fst filter=lfs diff=lfs merge=lfs -text
|
| 495 |
+
stt/ru/vosk-model-small-ru-0.22/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 496 |
+
stt/ru/vosk-model-small-ru-0.22/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 497 |
+
stt/sv/vosk-model-small-sv-rhasspy-0.15/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 498 |
+
stt/sv/vosk-model-small-sv-rhasspy-0.15/am/tree filter=lfs diff=lfs merge=lfs -text
|
| 499 |
+
stt/sv/vosk-model-small-sv-rhasspy-0.15/graph/HCLG.fst filter=lfs diff=lfs merge=lfs -text
|
| 500 |
+
stt/sv/vosk-model-small-sv-rhasspy-0.15/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 501 |
+
stt/sv/vosk-model-small-sv-rhasspy-0.15/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 502 |
+
stt/te/vosk-model-small-te-0.42/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 503 |
+
stt/te/vosk-model-small-te-0.42/graph/Gr.fst filter=lfs diff=lfs merge=lfs -text
|
| 504 |
+
stt/te/vosk-model-small-te-0.42/graph/HCLr.fst filter=lfs diff=lfs merge=lfs -text
|
| 505 |
+
stt/te/vosk-model-small-te-0.42/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 506 |
+
stt/te/vosk-model-small-te-0.42/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 507 |
+
stt/tg/vosk-model-small-tg-0.22/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 508 |
+
stt/tg/vosk-model-small-tg-0.22/am/tree filter=lfs diff=lfs merge=lfs -text
|
| 509 |
+
stt/tg/vosk-model-small-tg-0.22/graph/Gr.fst filter=lfs diff=lfs merge=lfs -text
|
| 510 |
+
stt/tg/vosk-model-small-tg-0.22/graph/HCLr.fst filter=lfs diff=lfs merge=lfs -text
|
| 511 |
+
stt/tg/vosk-model-small-tg-0.22/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 512 |
+
stt/tg/vosk-model-small-tg-0.22/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 513 |
+
stt/tg/vosk-model-small-tg-0.22/test/test.wav filter=lfs diff=lfs merge=lfs -text
|
| 514 |
+
stt/tg/vosk-model-tg-0.22/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 515 |
+
stt/tg/vosk-model-tg-0.22/am/tree filter=lfs diff=lfs merge=lfs -text
|
| 516 |
+
stt/tg/vosk-model-tg-0.22/graph/HCLG.fst filter=lfs diff=lfs merge=lfs -text
|
| 517 |
+
stt/tg/vosk-model-tg-0.22/graph/phones/align_lexicon.txt filter=lfs diff=lfs merge=lfs -text
|
| 518 |
+
stt/tg/vosk-model-tg-0.22/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 519 |
+
stt/tg/vosk-model-tg-0.22/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 520 |
+
stt/tg/vosk-model-tg-0.22/rescore/G.carpa filter=lfs diff=lfs merge=lfs -text
|
| 521 |
+
stt/tg/vosk-model-tg-0.22/rescore/G.fst filter=lfs diff=lfs merge=lfs -text
|
| 522 |
+
stt/tg/vosk-model-tg-0.22/test/test.wav filter=lfs diff=lfs merge=lfs -text
|
| 523 |
+
stt/tl/vosk-model-tl-ph-generic-0.6/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 524 |
+
stt/tl/vosk-model-tl-ph-generic-0.6/graph/HCLG.fst filter=lfs diff=lfs merge=lfs -text
|
| 525 |
+
stt/tl/vosk-model-tl-ph-generic-0.6/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 526 |
+
stt/tl/vosk-model-tl-ph-generic-0.6/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 527 |
+
stt/tr/vosk-model-small-tr-0.3/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 528 |
+
stt/tr/vosk-model-small-tr-0.3/Gr.fst filter=lfs diff=lfs merge=lfs -text
|
| 529 |
+
stt/tr/vosk-model-small-tr-0.3/HCLr.fst filter=lfs diff=lfs merge=lfs -text
|
| 530 |
+
stt/tr/vosk-model-small-tr-0.3/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 531 |
+
stt/tr/vosk-model-small-tr-0.3/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 532 |
+
stt/uk/vosk-model-small-uk-v3-nano/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 533 |
+
stt/uk/vosk-model-small-uk-v3-nano/graph/Gr.fst filter=lfs diff=lfs merge=lfs -text
|
| 534 |
+
stt/uk/vosk-model-small-uk-v3-nano/graph/HCLr.fst filter=lfs diff=lfs merge=lfs -text
|
| 535 |
+
stt/uk/vosk-model-small-uk-v3-nano/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 536 |
+
stt/uk/vosk-model-small-uk-v3-nano/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 537 |
+
stt/uk/vosk-model-small-uk-v3-small/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 538 |
+
stt/uk/vosk-model-small-uk-v3-small/graph/Gr.fst filter=lfs diff=lfs merge=lfs -text
|
| 539 |
+
stt/uk/vosk-model-small-uk-v3-small/graph/HCLr.fst filter=lfs diff=lfs merge=lfs -text
|
| 540 |
+
stt/uk/vosk-model-small-uk-v3-small/graph/words.txt filter=lfs diff=lfs merge=lfs -text
|
| 541 |
+
stt/uk/vosk-model-small-uk-v3-small/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 542 |
+
stt/uk/vosk-model-small-uk-v3-small/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 543 |
+
stt/uk/vosk-model-uk-v3-lgraph/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 544 |
+
stt/uk/vosk-model-uk-v3-lgraph/graph/Gr.fst filter=lfs diff=lfs merge=lfs -text
|
| 545 |
+
stt/uk/vosk-model-uk-v3-lgraph/graph/HCLr.fst filter=lfs diff=lfs merge=lfs -text
|
| 546 |
+
stt/uk/vosk-model-uk-v3-lgraph/graph/words.txt filter=lfs diff=lfs merge=lfs -text
|
| 547 |
+
stt/uk/vosk-model-uk-v3-lgraph/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 548 |
+
stt/uk/vosk-model-uk-v3-lgraph/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 549 |
+
stt/uk/vosk-model-uk-v3/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 550 |
+
stt/uk/vosk-model-uk-v3/graph/HCLG.fst filter=lfs diff=lfs merge=lfs -text
|
| 551 |
+
stt/uk/vosk-model-uk-v3/graph/words.txt filter=lfs diff=lfs merge=lfs -text
|
| 552 |
+
stt/uk/vosk-model-uk-v3/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 553 |
+
stt/uk/vosk-model-uk-v3/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 554 |
+
stt/uz/vosk-model-small-uz-0.22/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 555 |
+
stt/uz/vosk-model-small-uz-0.22/graph/Gr.fst filter=lfs diff=lfs merge=lfs -text
|
| 556 |
+
stt/uz/vosk-model-small-uz-0.22/graph/HCLr.fst filter=lfs diff=lfs merge=lfs -text
|
| 557 |
+
stt/uz/vosk-model-small-uz-0.22/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 558 |
+
stt/uz/vosk-model-small-uz-0.22/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 559 |
+
stt/vn/vosk-model-small-vn-0.4/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 560 |
+
stt/vn/vosk-model-small-vn-0.4/graph/Gr.fst filter=lfs diff=lfs merge=lfs -text
|
| 561 |
+
stt/vn/vosk-model-small-vn-0.4/graph/HCLr.fst filter=lfs diff=lfs merge=lfs -text
|
| 562 |
+
stt/vn/vosk-model-small-vn-0.4/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 563 |
+
stt/vn/vosk-model-small-vn-0.4/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
| 564 |
+
stt/vn/vosk-model-vn-0.4/am/final.mdl filter=lfs diff=lfs merge=lfs -text
|
| 565 |
+
stt/vn/vosk-model-vn-0.4/graph/HCLG.fst filter=lfs diff=lfs merge=lfs -text
|
| 566 |
+
stt/vn/vosk-model-vn-0.4/ivector/final.dubm filter=lfs diff=lfs merge=lfs -text
|
| 567 |
+
stt/vn/vosk-model-vn-0.4/ivector/final.ie filter=lfs diff=lfs merge=lfs -text
|
README.md
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
language:
|
| 3 |
+
- ar
|
| 4 |
+
- br
|
| 5 |
+
- cn
|
| 6 |
+
- zh
|
| 7 |
+
- de
|
| 8 |
+
- es
|
| 9 |
+
- en
|
| 10 |
+
- fa
|
| 11 |
+
- fil
|
| 12 |
+
- fr
|
| 13 |
+
- gr
|
| 14 |
+
- el
|
| 15 |
+
- gu
|
| 16 |
+
- hi
|
| 17 |
+
- it
|
| 18 |
+
- ja
|
| 19 |
+
- kz
|
| 20 |
+
- uk
|
| 21 |
+
- ru
|
| 22 |
+
- nl
|
| 23 |
+
- pt
|
| 24 |
+
- pl
|
| 25 |
+
- ca
|
| 26 |
+
- cs
|
| 27 |
+
- eo
|
| 28 |
+
- ko
|
| 29 |
+
- sv
|
| 30 |
+
- te
|
| 31 |
+
- tg
|
| 32 |
+
- tr
|
| 33 |
+
- uz
|
| 34 |
+
- vn
|
| 35 |
+
pipeline_tag: automatic-speech-recognition
|
| 36 |
+
tags:
|
| 37 |
+
- vosk
|
| 38 |
+
- stt
|
| 39 |
+
- tts
|
| 40 |
+
- speaker_indentification
|
| 41 |
+
- "speaker indentification"
|
| 42 |
+
- punctuation
|
| 43 |
+
---
|
| 44 |
+
# Vosk Models
|
| 45 |
+
Downloaded from: [**URL**](https://alphacephei.com/vosk/models)
|
| 46 |
+
|
| 47 |
+
|
| 48 |
+
Models
|
| 49 |
+
We have two types of models - big and small, small models are ideal for some limited task on mobile applications. They can run on smartphones, Raspberry Pi’s. They are also recommended for desktop applications. Small model typically is around 50Mb in size and requires about 300Mb of memory in runtime. Big models are for the high-accuracy transcription on the server. Big models require up to 16Gb in memory since they apply advanced AI algorithms. Ideally you run them on some high-end servers like i7 or latest AMD Ryzen. On AWS you can take a look on c5a machines and similar machines in other clouds.
|
| 50 |
+
Most small model allow dynamic vocabulary reconfiguration. Big models are static the vocabulary can not be modified in runtime.
|
| 51 |
+
|
| 52 |
+
Support me: [**Boosty**](https://boosty.to/dreammine) or [**Donationalerts**](https://www.donationalerts.com/r/derur_dreammine)
|
punctuation/vosk-recasepunc-de-0.21.7z
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:42e06dab56196498cde6e89c5e6d4b97cab72942827153b06180f6a156bebc0b
|
| 3 |
+
size 1153855092
|
punctuation/vosk-recasepunc-de-0.21/README
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
1. Install pytorch and transformers:
|
| 2 |
+
|
| 3 |
+
pip3 install transformers
|
| 4 |
+
|
| 5 |
+
2. Run python3 example.py de-test.txt
|
| 6 |
+
|
| 7 |
+
3. Compare with de-test.txt.orig
|
punctuation/vosk-recasepunc-de-0.21/checkpoint
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:90c70f58d865013bf1245d3c7fae229d6029ee0b16470c055f81a63e668de685
|
| 3 |
+
size 1315574525
|
punctuation/vosk-recasepunc-de-0.21/de-test.txt
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
nachdem sein vater schon 1707 starb als reinhart erst elf jahre alt war
|
| 2 |
+
wurde er von hauslehrern in seega erzogen hierauf kam er 1708 in die
|
| 3 |
+
stadtschule nach frankenhausen und war dort von der dritten bis zur
|
| 4 |
+
ersten klasse der bekannte schulmann magister hoffmann stand der schule
|
| 5 |
+
als rektor vor unter dem er publice prodiret hatte also öffentlich
|
| 6 |
+
aufgetreten war um eine rede zu halten
|
punctuation/vosk-recasepunc-de-0.21/de-test.txt.orig
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Nachdem sein Vater schon 1707 starb, als Reinhart erst elf Jahre alt war,
|
| 2 |
+
wurde er von Hauslehrern in Seega erzogen. Hierauf kam er 1708 in die
|
| 3 |
+
Stadtschule nach Frankenhausen und war dort von der dritten bis zur
|
| 4 |
+
ersten Klasse. Der bekannte Schulmann Magister Hoffmann stand der Schule
|
| 5 |
+
als Rektor vor, unter dem er publice prodiret hatte, also öffentlich
|
| 6 |
+
aufgetreten war, um eine Rede zu halten.
|
punctuation/vosk-recasepunc-de-0.21/example.py
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import sys
|
| 2 |
+
import time
|
| 3 |
+
from transformers import logging
|
| 4 |
+
from recasepunc import CasePuncPredictor
|
| 5 |
+
from recasepunc import WordpieceTokenizer
|
| 6 |
+
from recasepunc import Config
|
| 7 |
+
|
| 8 |
+
logging.set_verbosity_error()
|
| 9 |
+
|
| 10 |
+
predictor = CasePuncPredictor('checkpoint', lang="de")
|
| 11 |
+
|
| 12 |
+
text = " ".join(open(sys.argv[1]).readlines())
|
| 13 |
+
tokens = list(enumerate(predictor.tokenize(text)))
|
| 14 |
+
|
| 15 |
+
results = ""
|
| 16 |
+
for token, case_label, punc_label in predictor.predict(tokens, lambda x: x[1]):
|
| 17 |
+
prediction = predictor.map_punc_label(predictor.map_case_label(token[1], case_label), punc_label)
|
| 18 |
+
if token[1][0] != '#':
|
| 19 |
+
results = results + ' ' + prediction
|
| 20 |
+
else:
|
| 21 |
+
results = results + prediction
|
| 22 |
+
|
| 23 |
+
print (results.strip())
|
punctuation/vosk-recasepunc-de-0.21/recasepunc.py
ADDED
|
@@ -0,0 +1,742 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import sys
|
| 2 |
+
import collections
|
| 3 |
+
import os
|
| 4 |
+
import regex as re
|
| 5 |
+
#from mosestokenizer import *
|
| 6 |
+
from tqdm import tqdm
|
| 7 |
+
import torch
|
| 8 |
+
import torch.nn as nn
|
| 9 |
+
import torch.nn.functional as F
|
| 10 |
+
import torch.optim as optim
|
| 11 |
+
import random
|
| 12 |
+
import unicodedata
|
| 13 |
+
import numpy as np
|
| 14 |
+
import argparse
|
| 15 |
+
from torch.utils.data import TensorDataset, DataLoader
|
| 16 |
+
|
| 17 |
+
from transformers import AutoModel, AutoTokenizer, BertTokenizer
|
| 18 |
+
|
| 19 |
+
default_config = argparse.Namespace(
|
| 20 |
+
seed=871253,
|
| 21 |
+
lang='de',
|
| 22 |
+
#flavor='flaubert/flaubert_base_uncased',
|
| 23 |
+
flavor=None,
|
| 24 |
+
max_length=256,
|
| 25 |
+
batch_size=16,
|
| 26 |
+
updates=24000,
|
| 27 |
+
period=1000,
|
| 28 |
+
lr=1e-5,
|
| 29 |
+
dab_rate=0.1,
|
| 30 |
+
device='cuda',
|
| 31 |
+
debug=False
|
| 32 |
+
)
|
| 33 |
+
|
| 34 |
+
default_flavors = {
|
| 35 |
+
'fr': 'flaubert/flaubert_base_uncased',
|
| 36 |
+
'en': 'bert-base-uncased',
|
| 37 |
+
'zh': 'ckiplab/bert-base-chinese',
|
| 38 |
+
'tr': 'dbmdz/bert-base-turkish-uncased',
|
| 39 |
+
'de': 'dbmdz/bert-base-german-uncased',
|
| 40 |
+
'pt': 'neuralmind/bert-base-portuguese-cased'
|
| 41 |
+
}
|
| 42 |
+
|
| 43 |
+
class Config(argparse.Namespace):
|
| 44 |
+
def __init__(self, **kwargs):
|
| 45 |
+
for key, value in default_config.__dict__.items():
|
| 46 |
+
setattr(self, key, value)
|
| 47 |
+
for key, value in kwargs.items():
|
| 48 |
+
setattr(self, key, value)
|
| 49 |
+
|
| 50 |
+
assert self.lang in ['fr', 'en', 'zh', 'tr', 'pt', 'de']
|
| 51 |
+
|
| 52 |
+
if 'lang' in kwargs and ('flavor' not in kwargs or kwargs['flavor'] is None):
|
| 53 |
+
self.flavor = default_flavors[self.lang]
|
| 54 |
+
|
| 55 |
+
#print(self.lang, self.flavor)
|
| 56 |
+
|
| 57 |
+
|
| 58 |
+
def init_random(seed):
|
| 59 |
+
# make sure everything is deterministic
|
| 60 |
+
os.environ['CUBLAS_WORKSPACE_CONFIG'] = ':4096:8'
|
| 61 |
+
#torch.use_deterministic_algorithms(True)
|
| 62 |
+
torch.manual_seed(seed)
|
| 63 |
+
torch.cuda.manual_seed_all(seed)
|
| 64 |
+
random.seed(seed)
|
| 65 |
+
np.random.seed(seed)
|
| 66 |
+
|
| 67 |
+
# NOTE: it is assumed in the implementation that y[:,0] is the punctuation label, and y[:,1] is the case label!
|
| 68 |
+
|
| 69 |
+
punctuation = {
|
| 70 |
+
'O': 0,
|
| 71 |
+
'COMMA': 1,
|
| 72 |
+
'PERIOD': 2,
|
| 73 |
+
'QUESTION': 3,
|
| 74 |
+
'EXCLAMATION': 4,
|
| 75 |
+
}
|
| 76 |
+
|
| 77 |
+
punctuation_syms = ['', ',', '.', ' ?', ' !']
|
| 78 |
+
|
| 79 |
+
case = {
|
| 80 |
+
'LOWER': 0,
|
| 81 |
+
'UPPER': 1,
|
| 82 |
+
'CAPITALIZE': 2,
|
| 83 |
+
'OTHER': 3,
|
| 84 |
+
}
|
| 85 |
+
|
| 86 |
+
|
| 87 |
+
class Model(nn.Module):
|
| 88 |
+
def __init__(self, flavor, device):
|
| 89 |
+
super().__init__()
|
| 90 |
+
self.bert = AutoModel.from_pretrained(flavor)
|
| 91 |
+
# need a proper way of determining representation size
|
| 92 |
+
size = self.bert.dim if hasattr(self.bert, 'dim') else self.bert.config.pooler_fc_size if hasattr(self.bert.config, 'pooler_fc_size') else self.bert.config.emb_dim if hasattr(self.bert.config, 'emb_dim') else self.bert.config.hidden_size
|
| 93 |
+
self.punc = nn.Linear(size, 5)
|
| 94 |
+
self.case = nn.Linear(size, 4)
|
| 95 |
+
self.dropout = nn.Dropout(0.3)
|
| 96 |
+
self.to(device)
|
| 97 |
+
|
| 98 |
+
def forward(self, x):
|
| 99 |
+
output = self.bert(x)
|
| 100 |
+
representations = self.dropout(F.gelu(output['last_hidden_state']))
|
| 101 |
+
punc = self.punc(representations)
|
| 102 |
+
case = self.case(representations)
|
| 103 |
+
return punc, case
|
| 104 |
+
|
| 105 |
+
|
| 106 |
+
# randomly create sequences that align to punctuation boundaries
|
| 107 |
+
def drop_at_boundaries(rate, x, y, cls_token_id, sep_token_id, pad_token_id):
|
| 108 |
+
for i, dropped in enumerate(torch.rand((len(x),)) < rate):
|
| 109 |
+
if dropped:
|
| 110 |
+
# select all indices that are sentence endings
|
| 111 |
+
indices = (y[i,:,0] > 1).nonzero(as_tuple=True)[0]
|
| 112 |
+
if len(indices) < 2:
|
| 113 |
+
continue
|
| 114 |
+
start = indices[0] + 1
|
| 115 |
+
end = indices[random.randint(1, len(indices) - 1)] + 1
|
| 116 |
+
length = end - start
|
| 117 |
+
if length + 2 > len(x[i]):
|
| 118 |
+
continue
|
| 119 |
+
x[i, 0] = cls_token_id
|
| 120 |
+
x[i, 1: length + 1] = x[i, start: end].clone()
|
| 121 |
+
x[i, length + 1] = sep_token_id
|
| 122 |
+
x[i, length + 2:] = pad_token_id
|
| 123 |
+
y[i, 0] = 0
|
| 124 |
+
y[i, 1: length + 1] = y[i, start: end].clone()
|
| 125 |
+
y[i, length + 1:] = 0
|
| 126 |
+
|
| 127 |
+
|
| 128 |
+
def compute_performance(config, model, loader):
|
| 129 |
+
device = config.device
|
| 130 |
+
criterion = nn.CrossEntropyLoss()
|
| 131 |
+
model.eval()
|
| 132 |
+
total_loss = all_correct1 = all_correct2 = num_loss = num_perf = 0
|
| 133 |
+
num_ref = collections.defaultdict(float)
|
| 134 |
+
num_hyp = collections.defaultdict(float)
|
| 135 |
+
num_correct = collections.defaultdict(float)
|
| 136 |
+
for x, y in loader:
|
| 137 |
+
x = x.long().to(device)
|
| 138 |
+
y = y.long().to(device)
|
| 139 |
+
y1 = y[:,:,0]
|
| 140 |
+
y2 = y[:,:,1]
|
| 141 |
+
with torch.no_grad():
|
| 142 |
+
y_scores1, y_scores2 = model(x.to(device))
|
| 143 |
+
loss1 = criterion(y_scores1.view(y1.size(0) * y1.size(1), -1), y1.view(y1.size(0) * y1.size(1)))
|
| 144 |
+
loss2 = criterion(y_scores2.view(y2.size(0) * y2.size(1), -1), y2.view(y2.size(0) * y2.size(1)))
|
| 145 |
+
loss = loss1 + loss2
|
| 146 |
+
y_pred1 = torch.max(y_scores1, 2)[1]
|
| 147 |
+
y_pred2 = torch.max(y_scores2, 2)[1]
|
| 148 |
+
for label in range(1, 5):
|
| 149 |
+
ref = (y1 == label)
|
| 150 |
+
hyp = (y_pred1 == label)
|
| 151 |
+
correct = (ref * hyp == 1)
|
| 152 |
+
num_ref[label] += ref.sum()
|
| 153 |
+
num_hyp[label] += hyp.sum()
|
| 154 |
+
num_correct[label] += correct.sum()
|
| 155 |
+
num_ref[0] += ref.sum()
|
| 156 |
+
num_hyp[0] += hyp.sum()
|
| 157 |
+
num_correct[0] += correct.sum()
|
| 158 |
+
all_correct1 += (y_pred1 == y1).sum()
|
| 159 |
+
all_correct2 += (y_pred2 == y2).sum()
|
| 160 |
+
total_loss += loss.item()
|
| 161 |
+
num_loss += len(y)
|
| 162 |
+
num_perf += len(y) * config.max_length
|
| 163 |
+
recall = {}
|
| 164 |
+
precision = {}
|
| 165 |
+
fscore = {}
|
| 166 |
+
for label in range(0, 5):
|
| 167 |
+
recall[label] = num_correct[label] / num_ref[label] if num_ref[label] > 0 else 0
|
| 168 |
+
precision[label] = num_correct[label] / num_hyp[label] if num_hyp[label] > 0 else 0
|
| 169 |
+
fscore[label] = (2 * recall[label] * precision[label] / (recall[label] + precision[label])).item() if recall[label] + precision[label] > 0 else 0
|
| 170 |
+
return total_loss / num_loss, all_correct2.item() / num_perf, all_correct1.item() / num_perf, fscore
|
| 171 |
+
|
| 172 |
+
|
| 173 |
+
def fit(config, model, checkpoint_path, train_loader, valid_loader, iterations, valid_period=200, lr=1e-5):
|
| 174 |
+
device = config.device
|
| 175 |
+
criterion = nn.CrossEntropyLoss()
|
| 176 |
+
optimizer = optim.Adam(filter(lambda param: param.requires_grad, model.parameters()), lr=lr)
|
| 177 |
+
iteration = 0
|
| 178 |
+
while True:
|
| 179 |
+
model.train()
|
| 180 |
+
total_loss = num = 0
|
| 181 |
+
for x, y in tqdm(train_loader):
|
| 182 |
+
x = x.long().to(device)
|
| 183 |
+
y = y.long().to(device)
|
| 184 |
+
drop_at_boundaries(config.dab_rate, x, y, config.cls_token_id, config.sep_token_id, config.pad_token_id)
|
| 185 |
+
y1 = y[:,:,0]
|
| 186 |
+
y2 = y[:,:,1]
|
| 187 |
+
optimizer.zero_grad()
|
| 188 |
+
y_scores1, y_scores2 = model(x)
|
| 189 |
+
loss1 = criterion(y_scores1.view(y1.size(0) * y1.size(1), -1), y1.view(y1.size(0) * y1.size(1)))
|
| 190 |
+
loss2 = criterion(y_scores2.view(y2.size(0) * y2.size(1), -1), y2.view(y2.size(0) * y2.size(1)))
|
| 191 |
+
loss = loss1 + loss2
|
| 192 |
+
loss.backward()
|
| 193 |
+
optimizer.step()
|
| 194 |
+
total_loss += loss.item()
|
| 195 |
+
num += len(y)
|
| 196 |
+
if iteration % valid_period == valid_period - 1:
|
| 197 |
+
train_loss = total_loss / num
|
| 198 |
+
valid_loss, valid_accuracy_case, valid_accuracy_punc, valid_fscore = compute_performance(config, model, valid_loader)
|
| 199 |
+
torch.save({
|
| 200 |
+
'iteration': iteration + 1,
|
| 201 |
+
'model_state_dict': model.state_dict(),
|
| 202 |
+
'optimizer_state_dict': optimizer.state_dict(),
|
| 203 |
+
'train_loss': train_loss,
|
| 204 |
+
'valid_loss': valid_loss,
|
| 205 |
+
'valid_accuracy_case': valid_accuracy_case,
|
| 206 |
+
'valid_accuracy_punc': valid_accuracy_punc,
|
| 207 |
+
'valid_fscore': valid_fscore,
|
| 208 |
+
'config': config.__dict__,
|
| 209 |
+
}, '%s.%d' % (checkpoint_path, iteration + 1))
|
| 210 |
+
print(iteration + 1, train_loss, valid_loss, valid_accuracy_case, valid_accuracy_punc, valid_fscore)
|
| 211 |
+
total_loss = num = 0
|
| 212 |
+
|
| 213 |
+
iteration += 1
|
| 214 |
+
if iteration > iterations:
|
| 215 |
+
return
|
| 216 |
+
|
| 217 |
+
sys.stderr.flush()
|
| 218 |
+
sys.stdout.flush()
|
| 219 |
+
|
| 220 |
+
|
| 221 |
+
def batchify(max_length, x, y):
|
| 222 |
+
print (x.shape)
|
| 223 |
+
print (y.shape)
|
| 224 |
+
x = x[:(len(x) // max_length) * max_length].reshape(-1, max_length)
|
| 225 |
+
y = y[:(len(y) // max_length) * max_length, :].reshape(-1, max_length, 2)
|
| 226 |
+
return x, y
|
| 227 |
+
|
| 228 |
+
|
| 229 |
+
def train(config, train_x_fn, train_y_fn, valid_x_fn, valid_y_fn, checkpoint_path):
|
| 230 |
+
X_train, Y_train = batchify(config.max_length, torch.load(train_x_fn), torch.load(train_y_fn))
|
| 231 |
+
X_valid, Y_valid = batchify(config.max_length, torch.load(valid_x_fn), torch.load(valid_y_fn))
|
| 232 |
+
|
| 233 |
+
train_set = TensorDataset(X_train, Y_train)
|
| 234 |
+
valid_set = TensorDataset(X_valid, Y_valid)
|
| 235 |
+
|
| 236 |
+
train_loader = DataLoader(train_set, batch_size=config.batch_size, shuffle=True)
|
| 237 |
+
valid_loader = DataLoader(valid_set, batch_size=config.batch_size)
|
| 238 |
+
|
| 239 |
+
model = Model(config.flavor, config.device)
|
| 240 |
+
|
| 241 |
+
fit(config, model, checkpoint_path, train_loader, valid_loader, config.updates, config.period, config.lr)
|
| 242 |
+
|
| 243 |
+
|
| 244 |
+
def run_eval(config, test_x_fn, test_y_fn, checkpoint_path):
|
| 245 |
+
X_test, Y_test = batchify(config.max_length, torch.load(test_x_fn), torch.load(test_y_fn))
|
| 246 |
+
test_set = TensorDataset(X_test, Y_test)
|
| 247 |
+
test_loader = DataLoader(test_set, batch_size=config.batch_size)
|
| 248 |
+
|
| 249 |
+
loaded = torch.load(checkpoint_path, map_location=config.device)
|
| 250 |
+
if 'config' in loaded:
|
| 251 |
+
config = Config(**loaded['config'])
|
| 252 |
+
init(config)
|
| 253 |
+
|
| 254 |
+
model = Model(config.flavor, config.device)
|
| 255 |
+
model.load_state_dict(loaded['model_state_dict'])
|
| 256 |
+
|
| 257 |
+
print(*compute_performance(config, model, test_loader))
|
| 258 |
+
|
| 259 |
+
|
| 260 |
+
def recase(token, label):
|
| 261 |
+
if label == case['LOWER']:
|
| 262 |
+
return token.lower()
|
| 263 |
+
elif label == case['CAPITALIZE']:
|
| 264 |
+
return token.lower().capitalize()
|
| 265 |
+
elif label == case['UPPER']:
|
| 266 |
+
return token.upper()
|
| 267 |
+
else:
|
| 268 |
+
return token
|
| 269 |
+
|
| 270 |
+
|
| 271 |
+
class CasePuncPredictor:
|
| 272 |
+
def __init__(self, checkpoint_path, lang=default_config.lang, flavor=default_config.flavor, device=default_config.device):
|
| 273 |
+
loaded = torch.load(checkpoint_path, map_location=device if torch.cuda.is_available() else 'cpu')
|
| 274 |
+
if 'config' in loaded:
|
| 275 |
+
self.config = Config(**loaded['config'])
|
| 276 |
+
else:
|
| 277 |
+
self.config = Config(lang=lang, flavor=flavor, device=device)
|
| 278 |
+
init(self.config)
|
| 279 |
+
|
| 280 |
+
self.model = Model(self.config.flavor, self.config.device)
|
| 281 |
+
self.model.load_state_dict(loaded['model_state_dict'])
|
| 282 |
+
self.model.eval()
|
| 283 |
+
self.model.to(self.config.device)
|
| 284 |
+
|
| 285 |
+
self.rev_case = {b: a for a, b in case.items()}
|
| 286 |
+
self.rev_punc = {b: a for a, b in punctuation.items()}
|
| 287 |
+
|
| 288 |
+
def tokenize(self, text):
|
| 289 |
+
return [self.config.cls_token] + self.config.tokenizer.tokenize(text) + [self.config.sep_token]
|
| 290 |
+
|
| 291 |
+
def predict(self, tokens, getter=lambda x: x):
|
| 292 |
+
max_length = self.config.max_length
|
| 293 |
+
device = self.config.device
|
| 294 |
+
if type(tokens) == str:
|
| 295 |
+
tokens = self.tokenize(tokens)
|
| 296 |
+
previous_label = punctuation['PERIOD']
|
| 297 |
+
for start in range(0, len(tokens), max_length):
|
| 298 |
+
instance = tokens[start: start + max_length]
|
| 299 |
+
if type(getter(instance[0])) == str:
|
| 300 |
+
ids = self.config.tokenizer.convert_tokens_to_ids(getter(token) for token in instance)
|
| 301 |
+
else:
|
| 302 |
+
ids = [getter(token) for token in instance]
|
| 303 |
+
if len(ids) < max_length:
|
| 304 |
+
ids += [0] * (max_length - len(ids))
|
| 305 |
+
x = torch.tensor([ids]).long().to(device)
|
| 306 |
+
y_scores1, y_scores2 = self.model(x)
|
| 307 |
+
y_pred1 = torch.max(y_scores1, 2)[1]
|
| 308 |
+
y_pred2 = torch.max(y_scores2, 2)[1]
|
| 309 |
+
for i, id, token, punc_label, case_label in zip(range(len(instance)), ids, instance, y_pred1[0].tolist()[:len(instance)], y_pred2[0].tolist()[:len(instance)]):
|
| 310 |
+
if id == self.config.cls_token_id or id == self.config.sep_token_id:
|
| 311 |
+
continue
|
| 312 |
+
if previous_label != None and previous_label > 1:
|
| 313 |
+
if case_label in [case['LOWER'], case['OTHER']]: # LOWER, OTHER
|
| 314 |
+
case_label = case['CAPITALIZE']
|
| 315 |
+
if i + start == len(tokens) - 2 and punc_label == punctuation['O']:
|
| 316 |
+
punc_label = punctuation['PERIOD']
|
| 317 |
+
yield (token, self.rev_case[case_label], self.rev_punc[punc_label])
|
| 318 |
+
previous_label = punc_label
|
| 319 |
+
|
| 320 |
+
def map_case_label(self, token, case_label):
|
| 321 |
+
if token.endswith('</w>'):
|
| 322 |
+
token = token[:-4]
|
| 323 |
+
if token.startswith('##'):
|
| 324 |
+
token = token[2:]
|
| 325 |
+
return recase(token, case[case_label])
|
| 326 |
+
|
| 327 |
+
def map_punc_label(self, token, punc_label):
|
| 328 |
+
if token.endswith('</w>'):
|
| 329 |
+
token = token[:-4]
|
| 330 |
+
if token.startswith('##'):
|
| 331 |
+
token = token[2:]
|
| 332 |
+
return token + punctuation_syms[punctuation[punc_label]]
|
| 333 |
+
|
| 334 |
+
|
| 335 |
+
|
| 336 |
+
def generate_predictions(config, checkpoint_path):
|
| 337 |
+
loaded = torch.load(checkpoint_path, map_location=config.device if torch.cuda.is_available() else 'cpu')
|
| 338 |
+
if 'config' in loaded:
|
| 339 |
+
config = Config(**loaded['config'])
|
| 340 |
+
init(config)
|
| 341 |
+
|
| 342 |
+
model = Model(config.flavor, config.device)
|
| 343 |
+
model.load_state_dict(loaded['model_state_dict'])
|
| 344 |
+
|
| 345 |
+
rev_case = {b: a for a, b in case.items()}
|
| 346 |
+
rev_punc = {b: a for a, b in punctuation.items()}
|
| 347 |
+
|
| 348 |
+
for line in sys.stdin:
|
| 349 |
+
# also drop punctuation that we may generate
|
| 350 |
+
line = ''.join([c for c in line if c not in mapped_punctuation])
|
| 351 |
+
if config.debug:
|
| 352 |
+
print(line)
|
| 353 |
+
tokens = [config.cls_token] + config.tokenizer.tokenize(line) + [config.sep_token]
|
| 354 |
+
if config.debug:
|
| 355 |
+
print(tokens)
|
| 356 |
+
previous_label = punctuation['PERIOD']
|
| 357 |
+
first_time = True
|
| 358 |
+
was_word = False
|
| 359 |
+
for start in range(0, len(tokens), config.max_length):
|
| 360 |
+
instance = tokens[start: start + config.max_length]
|
| 361 |
+
ids = config.tokenizer.convert_tokens_to_ids(instance)
|
| 362 |
+
#print(len(ids), file=sys.stderr)
|
| 363 |
+
if len(ids) < config.max_length:
|
| 364 |
+
ids += [config.pad_token_id] * (config.max_length - len(ids))
|
| 365 |
+
x = torch.tensor([ids]).long().to(config.device)
|
| 366 |
+
y_scores1, y_scores2 = model(x)
|
| 367 |
+
y_pred1 = torch.max(y_scores1, 2)[1]
|
| 368 |
+
y_pred2 = torch.max(y_scores2, 2)[1]
|
| 369 |
+
for id, token, punc_label, case_label in zip(ids, instance, y_pred1[0].tolist()[:len(instance)], y_pred2[0].tolist()[:len(instance)]):
|
| 370 |
+
if config.debug:
|
| 371 |
+
print(id, token, punc_label, case_label, file=sys.stderr)
|
| 372 |
+
if id == config.cls_token_id or id == config.sep_token_id:
|
| 373 |
+
continue
|
| 374 |
+
if previous_label != None and previous_label > 1:
|
| 375 |
+
if case_label in [case['LOWER'], case['OTHER']]:
|
| 376 |
+
case_label = case['CAPITALIZE']
|
| 377 |
+
previous_label = punc_label
|
| 378 |
+
# different strategy due to sub-lexical token encoding in Flaubert
|
| 379 |
+
if config.lang == 'fr':
|
| 380 |
+
if token.endswith('</w>'):
|
| 381 |
+
cased_token = recase(token[:-4], case_label)
|
| 382 |
+
if was_word:
|
| 383 |
+
print(' ', end='')
|
| 384 |
+
print(cased_token + punctuation_syms[punc_label], end='')
|
| 385 |
+
was_word = True
|
| 386 |
+
else:
|
| 387 |
+
cased_token = recase(token, case_label)
|
| 388 |
+
if was_word:
|
| 389 |
+
print(' ', end='')
|
| 390 |
+
print(cased_token, end='')
|
| 391 |
+
was_word = False
|
| 392 |
+
else:
|
| 393 |
+
if token.startswith('##'):
|
| 394 |
+
cased_token = recase(token[2:], case_label)
|
| 395 |
+
print(cased_token, end='')
|
| 396 |
+
else:
|
| 397 |
+
cased_token = recase(token, case_label)
|
| 398 |
+
if not first_time:
|
| 399 |
+
print(' ', end='')
|
| 400 |
+
first_time = False
|
| 401 |
+
print(cased_token + punctuation_syms[punc_label], end='')
|
| 402 |
+
if previous_label == 0:
|
| 403 |
+
print('.', end='')
|
| 404 |
+
print()
|
| 405 |
+
|
| 406 |
+
|
| 407 |
+
def label_for_case(token):
|
| 408 |
+
token = re.sub('[^\p{Han}\p{Ll}\p{Lu}]', '', token)
|
| 409 |
+
if token == token.lower():
|
| 410 |
+
return 'LOWER'
|
| 411 |
+
elif token == token.lower().capitalize():
|
| 412 |
+
return 'CAPITALIZE'
|
| 413 |
+
elif token == token.upper():
|
| 414 |
+
return 'UPPER'
|
| 415 |
+
else:
|
| 416 |
+
return 'OTHER'
|
| 417 |
+
|
| 418 |
+
|
| 419 |
+
def make_tensors(config, input_fn, output_x_fn, output_y_fn):
|
| 420 |
+
# count file lines without loading them
|
| 421 |
+
size = 0
|
| 422 |
+
with open(input_fn) as fp:
|
| 423 |
+
for line in fp:
|
| 424 |
+
size += 1
|
| 425 |
+
|
| 426 |
+
with open(input_fn) as fp:
|
| 427 |
+
X = torch.IntTensor(size)
|
| 428 |
+
Y = torch.ByteTensor(size, 2)
|
| 429 |
+
|
| 430 |
+
offset = 0
|
| 431 |
+
for n, line in enumerate(fp):
|
| 432 |
+
word, case_label, punc_label = line.strip().split('\t')
|
| 433 |
+
id = config.tokenizer.convert_tokens_to_ids(word)
|
| 434 |
+
if config.debug:
|
| 435 |
+
assert word.lower() == tokenizer.convert_ids_to_tokens(id)
|
| 436 |
+
X[offset] = id
|
| 437 |
+
Y[offset, 0] = punctuation[punc_label]
|
| 438 |
+
Y[offset, 1] = case[case_label]
|
| 439 |
+
offset += 1
|
| 440 |
+
|
| 441 |
+
torch.save(X, output_x_fn)
|
| 442 |
+
torch.save(Y, output_y_fn)
|
| 443 |
+
|
| 444 |
+
|
| 445 |
+
mapped_punctuation = {
|
| 446 |
+
'.': 'PERIOD',
|
| 447 |
+
'...': 'PERIOD',
|
| 448 |
+
',': 'COMMA',
|
| 449 |
+
';': 'COMMA',
|
| 450 |
+
':': 'COMMA',
|
| 451 |
+
'(': 'COMMA',
|
| 452 |
+
')': 'COMMA',
|
| 453 |
+
'?': 'QUESTION',
|
| 454 |
+
'!': 'EXCLAMATION',
|
| 455 |
+
',': 'COMMA',
|
| 456 |
+
'!': 'EXCLAMATION',
|
| 457 |
+
'?': 'QUESTION',
|
| 458 |
+
';': 'COMMA',
|
| 459 |
+
':': 'COMMA',
|
| 460 |
+
'(': 'COMMA',
|
| 461 |
+
'(': 'COMMA',
|
| 462 |
+
')': 'COMMA',
|
| 463 |
+
'[': 'COMMA',
|
| 464 |
+
']': 'COMMA',
|
| 465 |
+
'【': 'COMMA',
|
| 466 |
+
'】': 'COMMA',
|
| 467 |
+
'└': 'COMMA',
|
| 468 |
+
'└ ': 'COMMA',
|
| 469 |
+
'_': 'O',
|
| 470 |
+
'。': 'PERIOD',
|
| 471 |
+
'、': 'COMMA', # enumeration comma
|
| 472 |
+
'、': 'COMMA',
|
| 473 |
+
'…': 'PERIOD',
|
| 474 |
+
'—': 'COMMA',
|
| 475 |
+
'「': 'COMMA',
|
| 476 |
+
'」': 'COMMA',
|
| 477 |
+
'.': 'PERIOD',
|
| 478 |
+
'《': 'O',
|
| 479 |
+
'》': 'O',
|
| 480 |
+
',': 'COMMA',
|
| 481 |
+
'“': 'O',
|
| 482 |
+
'”': 'O',
|
| 483 |
+
'"': 'O',
|
| 484 |
+
'-': 'O',
|
| 485 |
+
'-': 'O',
|
| 486 |
+
'〉': 'COMMA',
|
| 487 |
+
'〈': 'COMMA',
|
| 488 |
+
'↑': 'O',
|
| 489 |
+
'〔': 'COMMA',
|
| 490 |
+
'〕': 'COMMA',
|
| 491 |
+
}
|
| 492 |
+
|
| 493 |
+
def preprocess_text(config, max_token_count=-1):
|
| 494 |
+
global num_tokens_output
|
| 495 |
+
max_token_count = int(max_token_count)
|
| 496 |
+
num_tokens_output = 0
|
| 497 |
+
def process_segment(text, punctuation):
|
| 498 |
+
global num_tokens_output
|
| 499 |
+
text = text.replace('\t', ' ')
|
| 500 |
+
tokens = config.tokenizer.tokenize(text)
|
| 501 |
+
for i, token in enumerate(tokens):
|
| 502 |
+
case_label = label_for_case(token)
|
| 503 |
+
if i == len(tokens) - 1:
|
| 504 |
+
print(token.lower(), case_label, punctuation, sep='\t')
|
| 505 |
+
else:
|
| 506 |
+
print(token.lower(), case_label, 'O', sep='\t')
|
| 507 |
+
num_tokens_output += 1
|
| 508 |
+
# a bit too ugly, but alternative is to throw an exception
|
| 509 |
+
if max_token_count > 0 and num_tokens_output >= max_token_count:
|
| 510 |
+
sys.exit(0)
|
| 511 |
+
|
| 512 |
+
for line in sys.stdin:
|
| 513 |
+
line = line.strip()
|
| 514 |
+
if line != '':
|
| 515 |
+
line = unicodedata.normalize("NFC", line)
|
| 516 |
+
if config.debug:
|
| 517 |
+
print(line)
|
| 518 |
+
start = 0
|
| 519 |
+
for i, char in enumerate(line):
|
| 520 |
+
if char in mapped_punctuation:
|
| 521 |
+
if i > start and line[start: i].strip() != '':
|
| 522 |
+
process_segment(line[start: i], mapped_punctuation[char])
|
| 523 |
+
start = i + 1
|
| 524 |
+
if start < len(line):
|
| 525 |
+
process_segment(line[start:], 'PERIOD')
|
| 526 |
+
|
| 527 |
+
|
| 528 |
+
def preprocess_text_old_fr(config):
|
| 529 |
+
assert config.lang == 'fr'
|
| 530 |
+
splitsents = MosesSentenceSplitter(lang)
|
| 531 |
+
tokenize = MosesTokenizer(lang, extra=['-no-escape'])
|
| 532 |
+
normalize = MosesPunctuationNormalizer(lang)
|
| 533 |
+
|
| 534 |
+
for line in sys.stdin:
|
| 535 |
+
if line.strip() != '':
|
| 536 |
+
for sentence in splitsents([normalize(line)]):
|
| 537 |
+
tokens = tokenize(sentence)
|
| 538 |
+
previous_token = None
|
| 539 |
+
for token in tokens:
|
| 540 |
+
if token in mapped_punctuation:
|
| 541 |
+
if previous_token != None:
|
| 542 |
+
print(previous_token, mapped_punctuation[token], sep='\t')
|
| 543 |
+
previous_token = None
|
| 544 |
+
elif not re.search('[\p{Han}\p{Ll}\p{Lu}\d]', token): # remove non-alphanumeric tokens
|
| 545 |
+
continue
|
| 546 |
+
else:
|
| 547 |
+
if previous_token != None:
|
| 548 |
+
print(previous_token, 'O', sep='\t')
|
| 549 |
+
previous_token = token
|
| 550 |
+
if previous_token != None:
|
| 551 |
+
print(previous_token, 'PERIOD', sep='\t')
|
| 552 |
+
|
| 553 |
+
|
| 554 |
+
# modification of the wordpiece tokenizer to keep case information even if vocab is lower cased
|
| 555 |
+
# forked from https://github.com/huggingface/transformers/blob/master/src/transformers/models/bert/tokenization_bert.py
|
| 556 |
+
|
| 557 |
+
class WordpieceTokenizer(object):
|
| 558 |
+
"""Runs WordPiece tokenization."""
|
| 559 |
+
|
| 560 |
+
def __init__(self, vocab, unk_token, max_input_chars_per_word=100, keep_case=True):
|
| 561 |
+
self.vocab = vocab
|
| 562 |
+
self.unk_token = unk_token
|
| 563 |
+
self.max_input_chars_per_word = max_input_chars_per_word
|
| 564 |
+
self.keep_case = keep_case
|
| 565 |
+
|
| 566 |
+
def tokenize(self, text):
|
| 567 |
+
"""
|
| 568 |
+
Tokenizes a piece of text into its word pieces. This uses a greedy longest-match-first algorithm to perform
|
| 569 |
+
tokenization using the given vocabulary.
|
| 570 |
+
For example, :obj:`input = "unaffable"` wil return as output :obj:`["un", "##aff", "##able"]`.
|
| 571 |
+
Args:
|
| 572 |
+
text: A single token or whitespace separated tokens. This should have
|
| 573 |
+
already been passed through `BasicTokenizer`.
|
| 574 |
+
Returns:
|
| 575 |
+
A list of wordpiece tokens.
|
| 576 |
+
"""
|
| 577 |
+
|
| 578 |
+
output_tokens = []
|
| 579 |
+
for token in text.strip().split():
|
| 580 |
+
chars = list(token)
|
| 581 |
+
if len(chars) > self.max_input_chars_per_word:
|
| 582 |
+
output_tokens.append(self.unk_token)
|
| 583 |
+
continue
|
| 584 |
+
|
| 585 |
+
is_bad = False
|
| 586 |
+
start = 0
|
| 587 |
+
sub_tokens = []
|
| 588 |
+
while start < len(chars):
|
| 589 |
+
end = len(chars)
|
| 590 |
+
cur_substr = None
|
| 591 |
+
while start < end:
|
| 592 |
+
substr = "".join(chars[start:end])
|
| 593 |
+
if start > 0:
|
| 594 |
+
substr = "##" + substr
|
| 595 |
+
# optionaly lowercase substring before checking for inclusion in vocab
|
| 596 |
+
if (self.keep_case and substr.lower() in self.vocab) or (substr in self.vocab):
|
| 597 |
+
cur_substr = substr
|
| 598 |
+
break
|
| 599 |
+
end -= 1
|
| 600 |
+
if cur_substr is None:
|
| 601 |
+
is_bad = True
|
| 602 |
+
break
|
| 603 |
+
sub_tokens.append(cur_substr)
|
| 604 |
+
start = end
|
| 605 |
+
|
| 606 |
+
if is_bad:
|
| 607 |
+
output_tokens.append(self.unk_token)
|
| 608 |
+
else:
|
| 609 |
+
output_tokens.extend(sub_tokens)
|
| 610 |
+
return output_tokens
|
| 611 |
+
|
| 612 |
+
|
| 613 |
+
# modification of XLM bpe tokenizer for keeping case information when vocab is lowercase
|
| 614 |
+
# forked from https://github.com/huggingface/transformers/blob/cd56f3fe7eae4a53a9880e3f5e8f91877a78271c/src/transformers/models/xlm/tokenization_xlm.py
|
| 615 |
+
def bpe(self, token):
|
| 616 |
+
def to_lower(pair):
|
| 617 |
+
#print(' ',pair)
|
| 618 |
+
return (pair[0].lower(), pair[1].lower())
|
| 619 |
+
|
| 620 |
+
from transformers.models.xlm.tokenization_xlm import get_pairs
|
| 621 |
+
|
| 622 |
+
word = tuple(token[:-1]) + (token[-1] + "</w>",)
|
| 623 |
+
if token in self.cache:
|
| 624 |
+
return self.cache[token]
|
| 625 |
+
pairs = get_pairs(word)
|
| 626 |
+
|
| 627 |
+
if not pairs:
|
| 628 |
+
return token + "</w>"
|
| 629 |
+
|
| 630 |
+
while True:
|
| 631 |
+
bigram = min(pairs, key=lambda pair: self.bpe_ranks.get(to_lower(pair), float("inf")))
|
| 632 |
+
#print(bigram)
|
| 633 |
+
if to_lower(bigram) not in self.bpe_ranks:
|
| 634 |
+
break
|
| 635 |
+
first, second = bigram
|
| 636 |
+
new_word = []
|
| 637 |
+
i = 0
|
| 638 |
+
while i < len(word):
|
| 639 |
+
try:
|
| 640 |
+
j = word.index(first, i)
|
| 641 |
+
except ValueError:
|
| 642 |
+
new_word.extend(word[i:])
|
| 643 |
+
break
|
| 644 |
+
else:
|
| 645 |
+
new_word.extend(word[i:j])
|
| 646 |
+
i = j
|
| 647 |
+
|
| 648 |
+
if word[i] == first and i < len(word) - 1 and word[i + 1] == second:
|
| 649 |
+
new_word.append(first + second)
|
| 650 |
+
i += 2
|
| 651 |
+
else:
|
| 652 |
+
new_word.append(word[i])
|
| 653 |
+
i += 1
|
| 654 |
+
new_word = tuple(new_word)
|
| 655 |
+
word = new_word
|
| 656 |
+
if len(word) == 1:
|
| 657 |
+
break
|
| 658 |
+
else:
|
| 659 |
+
pairs = get_pairs(word)
|
| 660 |
+
word = " ".join(word)
|
| 661 |
+
if word == "\n </w>":
|
| 662 |
+
word = "\n</w>"
|
| 663 |
+
self.cache[token] = word
|
| 664 |
+
return word
|
| 665 |
+
|
| 666 |
+
|
| 667 |
+
|
| 668 |
+
def init(config):
|
| 669 |
+
init_random(config.seed)
|
| 670 |
+
|
| 671 |
+
if config.lang == 'fr':
|
| 672 |
+
config.tokenizer = tokenizer = AutoTokenizer.from_pretrained(config.flavor, do_lower_case=False)
|
| 673 |
+
|
| 674 |
+
from transformers.models.xlm.tokenization_xlm import XLMTokenizer
|
| 675 |
+
assert isinstance(tokenizer, XLMTokenizer)
|
| 676 |
+
|
| 677 |
+
# monkey patch XLM tokenizer
|
| 678 |
+
import types
|
| 679 |
+
tokenizer.bpe = types.MethodType(bpe, tokenizer)
|
| 680 |
+
else:
|
| 681 |
+
# warning: needs to be BertTokenizer for monkey patching to work
|
| 682 |
+
config.tokenizer = tokenizer = BertTokenizer.from_pretrained(config.flavor, do_lower_case=False)
|
| 683 |
+
|
| 684 |
+
# warning: monkey patch tokenizer to keep case information
|
| 685 |
+
#from recasing_tokenizer import WordpieceTokenizer
|
| 686 |
+
config.tokenizer.wordpiece_tokenizer = WordpieceTokenizer(vocab=tokenizer.vocab, unk_token=tokenizer.unk_token)
|
| 687 |
+
|
| 688 |
+
if config.lang == 'fr':
|
| 689 |
+
config.pad_token_id = tokenizer.pad_token_id
|
| 690 |
+
config.cls_token_id = tokenizer.bos_token_id
|
| 691 |
+
config.cls_token = tokenizer.bos_token
|
| 692 |
+
config.sep_token_id = tokenizer.sep_token_id
|
| 693 |
+
config.sep_token = tokenizer.sep_token
|
| 694 |
+
else:
|
| 695 |
+
config.pad_token_id = tokenizer.pad_token_id
|
| 696 |
+
config.cls_token_id = tokenizer.cls_token_id
|
| 697 |
+
config.cls_token = tokenizer.cls_token
|
| 698 |
+
config.sep_token_id = tokenizer.sep_token_id
|
| 699 |
+
config.sep_token = tokenizer.sep_token
|
| 700 |
+
|
| 701 |
+
if not torch.cuda.is_available() and config.device == 'cuda':
|
| 702 |
+
print('WARNING: reverting to cpu as cuda is not available', file=sys.stderr)
|
| 703 |
+
config.device = torch.device(config.device if torch.cuda.is_available() else 'cpu')
|
| 704 |
+
|
| 705 |
+
|
| 706 |
+
def main(config, action, args):
|
| 707 |
+
init(config)
|
| 708 |
+
|
| 709 |
+
if action == 'train':
|
| 710 |
+
train(config, *args)
|
| 711 |
+
elif action == 'eval':
|
| 712 |
+
run_eval(config, *args)
|
| 713 |
+
elif action == 'predict':
|
| 714 |
+
generate_predictions(config, *args)
|
| 715 |
+
elif action == 'tensorize':
|
| 716 |
+
make_tensors(config, *args)
|
| 717 |
+
elif action == 'preprocess':
|
| 718 |
+
preprocess_text(config, *args)
|
| 719 |
+
else:
|
| 720 |
+
print('invalid action "%s"' % action)
|
| 721 |
+
sys.exit(1)
|
| 722 |
+
|
| 723 |
+
if __name__ == '__main__':
|
| 724 |
+
parser = argparse.ArgumentParser()
|
| 725 |
+
parser.add_argument("action", help="train|eval|predict|tensorize|preprocess", type=str)
|
| 726 |
+
parser.add_argument("action_args", help="arguments for selected action", type=str, nargs='*')
|
| 727 |
+
parser.add_argument("--seed", help="random seed", default=default_config.seed, type=int)
|
| 728 |
+
parser.add_argument("--lang", help="language (fr, en, zh)", default=default_config.lang, type=str)
|
| 729 |
+
parser.add_argument("--flavor", help="bert flavor in transformers model zoo", default=default_config.flavor, type=str)
|
| 730 |
+
parser.add_argument("--max-length", help="maximum input length", default=default_config.max_length, type=int)
|
| 731 |
+
parser.add_argument("--batch-size", help="size of batches", default=default_config.batch_size, type=int)
|
| 732 |
+
parser.add_argument("--device", help="computation device (cuda, cpu)", default=default_config.device, type=str)
|
| 733 |
+
parser.add_argument("--debug", help="whether to output more debug info", default=default_config.debug, type=bool)
|
| 734 |
+
parser.add_argument("--updates", help="number of training updates to perform", default=default_config.updates, type=bool)
|
| 735 |
+
parser.add_argument("--period", help="validation period in updates", default=default_config.period, type=bool)
|
| 736 |
+
parser.add_argument("--lr", help="learning rate", default=default_config.lr, type=bool)
|
| 737 |
+
parser.add_argument("--dab-rate", help="drop at boundaries rate", default=default_config.dab_rate, type=bool)
|
| 738 |
+
config = Config(**parser.parse_args().__dict__)
|
| 739 |
+
|
| 740 |
+
main(config, config.action, config.action_args)
|
| 741 |
+
|
| 742 |
+
|
punctuation/vosk-recasepunc-en-0.22.7z
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:d754b827d2b3f85fe56cfb7a5262dc5658a9257ff7f9404e57595328882b8777
|
| 3 |
+
size 1148483511
|
punctuation/vosk-recasepunc-en-0.22/README
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
1. Install pytorch and transformers:
|
| 2 |
+
|
| 3 |
+
pip3 install transformers
|
| 4 |
+
|
| 5 |
+
2. Run python3 example.py de-test.txt
|
| 6 |
+
|
| 7 |
+
3. Compare with de-test.txt.orig
|
punctuation/vosk-recasepunc-en-0.22/checkpoint
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:9782ccd13a130feffb13609834778421ebd39e26910d25ddcf2185a0eea75935
|
| 3 |
+
size 1310193349
|
punctuation/vosk-recasepunc-en-0.22/example.py
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import sys
|
| 2 |
+
import time
|
| 3 |
+
from transformers import logging
|
| 4 |
+
from recasepunc import CasePuncPredictor
|
| 5 |
+
from recasepunc import WordpieceTokenizer
|
| 6 |
+
from recasepunc import Config
|
| 7 |
+
|
| 8 |
+
logging.set_verbosity_error()
|
| 9 |
+
|
| 10 |
+
predictor = CasePuncPredictor('checkpoint', lang="en")
|
| 11 |
+
|
| 12 |
+
text = " ".join(open(sys.argv[1]).readlines())
|
| 13 |
+
tokens = list(enumerate(predictor.tokenize(text)))
|
| 14 |
+
|
| 15 |
+
results = ""
|
| 16 |
+
for token, case_label, punc_label in predictor.predict(tokens, lambda x: x[1]):
|
| 17 |
+
prediction = predictor.map_punc_label(predictor.map_case_label(token[1], case_label), punc_label)
|
| 18 |
+
|
| 19 |
+
if token[1][0] == '\'' or (len(results) > 0 and results[-1] == '\''):
|
| 20 |
+
results = results + prediction
|
| 21 |
+
elif token[1][0] != '#':
|
| 22 |
+
results = results + ' ' + prediction
|
| 23 |
+
else:
|
| 24 |
+
results = results + prediction
|
| 25 |
+
|
| 26 |
+
print (results.strip())
|
punctuation/vosk-recasepunc-en-0.22/recasepunc.py
ADDED
|
@@ -0,0 +1,742 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import sys
|
| 2 |
+
import collections
|
| 3 |
+
import os
|
| 4 |
+
import regex as re
|
| 5 |
+
#from mosestokenizer import *
|
| 6 |
+
from tqdm import tqdm
|
| 7 |
+
import torch
|
| 8 |
+
import torch.nn as nn
|
| 9 |
+
import torch.nn.functional as F
|
| 10 |
+
import torch.optim as optim
|
| 11 |
+
import random
|
| 12 |
+
import unicodedata
|
| 13 |
+
import numpy as np
|
| 14 |
+
import argparse
|
| 15 |
+
from torch.utils.data import TensorDataset, DataLoader
|
| 16 |
+
|
| 17 |
+
from transformers import AutoModel, AutoTokenizer, BertTokenizer
|
| 18 |
+
|
| 19 |
+
default_config = argparse.Namespace(
|
| 20 |
+
seed=871253,
|
| 21 |
+
lang='en',
|
| 22 |
+
#flavor='flaubert/flaubert_base_uncased',
|
| 23 |
+
flavor=None,
|
| 24 |
+
max_length=256,
|
| 25 |
+
batch_size=16,
|
| 26 |
+
updates=24000,
|
| 27 |
+
period=1000,
|
| 28 |
+
lr=1e-5,
|
| 29 |
+
dab_rate=0.1,
|
| 30 |
+
device='cuda',
|
| 31 |
+
debug=False
|
| 32 |
+
)
|
| 33 |
+
|
| 34 |
+
default_flavors = {
|
| 35 |
+
'fr': 'flaubert/flaubert_base_uncased',
|
| 36 |
+
'en': 'bert-base-uncased',
|
| 37 |
+
'zh': 'ckiplab/bert-base-chinese',
|
| 38 |
+
'tr': 'dbmdz/bert-base-turkish-uncased',
|
| 39 |
+
'de': 'dbmdz/bert-base-german-uncased',
|
| 40 |
+
'pt': 'neuralmind/bert-base-portuguese-cased'
|
| 41 |
+
}
|
| 42 |
+
|
| 43 |
+
class Config(argparse.Namespace):
|
| 44 |
+
def __init__(self, **kwargs):
|
| 45 |
+
for key, value in default_config.__dict__.items():
|
| 46 |
+
setattr(self, key, value)
|
| 47 |
+
for key, value in kwargs.items():
|
| 48 |
+
setattr(self, key, value)
|
| 49 |
+
|
| 50 |
+
assert self.lang in ['fr', 'en', 'zh', 'tr', 'pt', 'de']
|
| 51 |
+
|
| 52 |
+
if 'lang' in kwargs and ('flavor' not in kwargs or kwargs['flavor'] is None):
|
| 53 |
+
self.flavor = default_flavors[self.lang]
|
| 54 |
+
|
| 55 |
+
#print(self.lang, self.flavor)
|
| 56 |
+
|
| 57 |
+
|
| 58 |
+
def init_random(seed):
|
| 59 |
+
# make sure everything is deterministic
|
| 60 |
+
os.environ['CUBLAS_WORKSPACE_CONFIG'] = ':4096:8'
|
| 61 |
+
#torch.use_deterministic_algorithms(True)
|
| 62 |
+
torch.manual_seed(seed)
|
| 63 |
+
torch.cuda.manual_seed_all(seed)
|
| 64 |
+
random.seed(seed)
|
| 65 |
+
np.random.seed(seed)
|
| 66 |
+
|
| 67 |
+
# NOTE: it is assumed in the implementation that y[:,0] is the punctuation label, and y[:,1] is the case label!
|
| 68 |
+
|
| 69 |
+
punctuation = {
|
| 70 |
+
'O': 0,
|
| 71 |
+
'COMMA': 1,
|
| 72 |
+
'PERIOD': 2,
|
| 73 |
+
'QUESTION': 3,
|
| 74 |
+
'EXCLAMATION': 4,
|
| 75 |
+
}
|
| 76 |
+
|
| 77 |
+
punctuation_syms = ['', ',', '.', ' ?', ' !']
|
| 78 |
+
|
| 79 |
+
case = {
|
| 80 |
+
'LOWER': 0,
|
| 81 |
+
'UPPER': 1,
|
| 82 |
+
'CAPITALIZE': 2,
|
| 83 |
+
'OTHER': 3,
|
| 84 |
+
}
|
| 85 |
+
|
| 86 |
+
|
| 87 |
+
class Model(nn.Module):
|
| 88 |
+
def __init__(self, flavor, device):
|
| 89 |
+
super().__init__()
|
| 90 |
+
self.bert = AutoModel.from_pretrained(flavor)
|
| 91 |
+
# need a proper way of determining representation size
|
| 92 |
+
size = self.bert.dim if hasattr(self.bert, 'dim') else self.bert.config.pooler_fc_size if hasattr(self.bert.config, 'pooler_fc_size') else self.bert.config.emb_dim if hasattr(self.bert.config, 'emb_dim') else self.bert.config.hidden_size
|
| 93 |
+
self.punc = nn.Linear(size, 5)
|
| 94 |
+
self.case = nn.Linear(size, 4)
|
| 95 |
+
self.dropout = nn.Dropout(0.3)
|
| 96 |
+
self.to(device)
|
| 97 |
+
|
| 98 |
+
def forward(self, x):
|
| 99 |
+
output = self.bert(x)
|
| 100 |
+
representations = self.dropout(F.gelu(output['last_hidden_state']))
|
| 101 |
+
punc = self.punc(representations)
|
| 102 |
+
case = self.case(representations)
|
| 103 |
+
return punc, case
|
| 104 |
+
|
| 105 |
+
|
| 106 |
+
# randomly create sequences that align to punctuation boundaries
|
| 107 |
+
def drop_at_boundaries(rate, x, y, cls_token_id, sep_token_id, pad_token_id):
|
| 108 |
+
for i, dropped in enumerate(torch.rand((len(x),)) < rate):
|
| 109 |
+
if dropped:
|
| 110 |
+
# select all indices that are sentence endings
|
| 111 |
+
indices = (y[i,:,0] > 1).nonzero(as_tuple=True)[0]
|
| 112 |
+
if len(indices) < 2:
|
| 113 |
+
continue
|
| 114 |
+
start = indices[0] + 1
|
| 115 |
+
end = indices[random.randint(1, len(indices) - 1)] + 1
|
| 116 |
+
length = end - start
|
| 117 |
+
if length + 2 > len(x[i]):
|
| 118 |
+
continue
|
| 119 |
+
x[i, 0] = cls_token_id
|
| 120 |
+
x[i, 1: length + 1] = x[i, start: end].clone()
|
| 121 |
+
x[i, length + 1] = sep_token_id
|
| 122 |
+
x[i, length + 2:] = pad_token_id
|
| 123 |
+
y[i, 0] = 0
|
| 124 |
+
y[i, 1: length + 1] = y[i, start: end].clone()
|
| 125 |
+
y[i, length + 1:] = 0
|
| 126 |
+
|
| 127 |
+
|
| 128 |
+
def compute_performance(config, model, loader):
|
| 129 |
+
device = config.device
|
| 130 |
+
criterion = nn.CrossEntropyLoss()
|
| 131 |
+
model.eval()
|
| 132 |
+
total_loss = all_correct1 = all_correct2 = num_loss = num_perf = 0
|
| 133 |
+
num_ref = collections.defaultdict(float)
|
| 134 |
+
num_hyp = collections.defaultdict(float)
|
| 135 |
+
num_correct = collections.defaultdict(float)
|
| 136 |
+
for x, y in loader:
|
| 137 |
+
x = x.long().to(device)
|
| 138 |
+
y = y.long().to(device)
|
| 139 |
+
y1 = y[:,:,0]
|
| 140 |
+
y2 = y[:,:,1]
|
| 141 |
+
with torch.no_grad():
|
| 142 |
+
y_scores1, y_scores2 = model(x.to(device))
|
| 143 |
+
loss1 = criterion(y_scores1.view(y1.size(0) * y1.size(1), -1), y1.view(y1.size(0) * y1.size(1)))
|
| 144 |
+
loss2 = criterion(y_scores2.view(y2.size(0) * y2.size(1), -1), y2.view(y2.size(0) * y2.size(1)))
|
| 145 |
+
loss = loss1 + loss2
|
| 146 |
+
y_pred1 = torch.max(y_scores1, 2)[1]
|
| 147 |
+
y_pred2 = torch.max(y_scores2, 2)[1]
|
| 148 |
+
for label in range(1, 5):
|
| 149 |
+
ref = (y1 == label)
|
| 150 |
+
hyp = (y_pred1 == label)
|
| 151 |
+
correct = (ref * hyp == 1)
|
| 152 |
+
num_ref[label] += ref.sum()
|
| 153 |
+
num_hyp[label] += hyp.sum()
|
| 154 |
+
num_correct[label] += correct.sum()
|
| 155 |
+
num_ref[0] += ref.sum()
|
| 156 |
+
num_hyp[0] += hyp.sum()
|
| 157 |
+
num_correct[0] += correct.sum()
|
| 158 |
+
all_correct1 += (y_pred1 == y1).sum()
|
| 159 |
+
all_correct2 += (y_pred2 == y2).sum()
|
| 160 |
+
total_loss += loss.item()
|
| 161 |
+
num_loss += len(y)
|
| 162 |
+
num_perf += len(y) * config.max_length
|
| 163 |
+
recall = {}
|
| 164 |
+
precision = {}
|
| 165 |
+
fscore = {}
|
| 166 |
+
for label in range(0, 5):
|
| 167 |
+
recall[label] = num_correct[label] / num_ref[label] if num_ref[label] > 0 else 0
|
| 168 |
+
precision[label] = num_correct[label] / num_hyp[label] if num_hyp[label] > 0 else 0
|
| 169 |
+
fscore[label] = (2 * recall[label] * precision[label] / (recall[label] + precision[label])).item() if recall[label] + precision[label] > 0 else 0
|
| 170 |
+
return total_loss / num_loss, all_correct2.item() / num_perf, all_correct1.item() / num_perf, fscore
|
| 171 |
+
|
| 172 |
+
|
| 173 |
+
def fit(config, model, checkpoint_path, train_loader, valid_loader, iterations, valid_period=200, lr=1e-5):
|
| 174 |
+
device = config.device
|
| 175 |
+
criterion = nn.CrossEntropyLoss()
|
| 176 |
+
optimizer = optim.Adam(filter(lambda param: param.requires_grad, model.parameters()), lr=lr)
|
| 177 |
+
iteration = 0
|
| 178 |
+
while True:
|
| 179 |
+
model.train()
|
| 180 |
+
total_loss = num = 0
|
| 181 |
+
for x, y in tqdm(train_loader):
|
| 182 |
+
x = x.long().to(device)
|
| 183 |
+
y = y.long().to(device)
|
| 184 |
+
drop_at_boundaries(config.dab_rate, x, y, config.cls_token_id, config.sep_token_id, config.pad_token_id)
|
| 185 |
+
y1 = y[:,:,0]
|
| 186 |
+
y2 = y[:,:,1]
|
| 187 |
+
optimizer.zero_grad()
|
| 188 |
+
y_scores1, y_scores2 = model(x)
|
| 189 |
+
loss1 = criterion(y_scores1.view(y1.size(0) * y1.size(1), -1), y1.view(y1.size(0) * y1.size(1)))
|
| 190 |
+
loss2 = criterion(y_scores2.view(y2.size(0) * y2.size(1), -1), y2.view(y2.size(0) * y2.size(1)))
|
| 191 |
+
loss = loss1 + loss2
|
| 192 |
+
loss.backward()
|
| 193 |
+
optimizer.step()
|
| 194 |
+
total_loss += loss.item()
|
| 195 |
+
num += len(y)
|
| 196 |
+
if iteration % valid_period == valid_period - 1:
|
| 197 |
+
train_loss = total_loss / num
|
| 198 |
+
valid_loss, valid_accuracy_case, valid_accuracy_punc, valid_fscore = compute_performance(config, model, valid_loader)
|
| 199 |
+
torch.save({
|
| 200 |
+
'iteration': iteration + 1,
|
| 201 |
+
'model_state_dict': model.state_dict(),
|
| 202 |
+
'optimizer_state_dict': optimizer.state_dict(),
|
| 203 |
+
'train_loss': train_loss,
|
| 204 |
+
'valid_loss': valid_loss,
|
| 205 |
+
'valid_accuracy_case': valid_accuracy_case,
|
| 206 |
+
'valid_accuracy_punc': valid_accuracy_punc,
|
| 207 |
+
'valid_fscore': valid_fscore,
|
| 208 |
+
'config': config.__dict__,
|
| 209 |
+
}, '%s.%d' % (checkpoint_path, iteration + 1))
|
| 210 |
+
print(iteration + 1, train_loss, valid_loss, valid_accuracy_case, valid_accuracy_punc, valid_fscore)
|
| 211 |
+
total_loss = num = 0
|
| 212 |
+
|
| 213 |
+
iteration += 1
|
| 214 |
+
if iteration > iterations:
|
| 215 |
+
return
|
| 216 |
+
|
| 217 |
+
sys.stderr.flush()
|
| 218 |
+
sys.stdout.flush()
|
| 219 |
+
|
| 220 |
+
|
| 221 |
+
def batchify(max_length, x, y):
|
| 222 |
+
print (x.shape)
|
| 223 |
+
print (y.shape)
|
| 224 |
+
x = x[:(len(x) // max_length) * max_length].reshape(-1, max_length)
|
| 225 |
+
y = y[:(len(y) // max_length) * max_length, :].reshape(-1, max_length, 2)
|
| 226 |
+
return x, y
|
| 227 |
+
|
| 228 |
+
|
| 229 |
+
def train(config, train_x_fn, train_y_fn, valid_x_fn, valid_y_fn, checkpoint_path):
|
| 230 |
+
X_train, Y_train = batchify(config.max_length, torch.load(train_x_fn), torch.load(train_y_fn))
|
| 231 |
+
X_valid, Y_valid = batchify(config.max_length, torch.load(valid_x_fn), torch.load(valid_y_fn))
|
| 232 |
+
|
| 233 |
+
train_set = TensorDataset(X_train, Y_train)
|
| 234 |
+
valid_set = TensorDataset(X_valid, Y_valid)
|
| 235 |
+
|
| 236 |
+
train_loader = DataLoader(train_set, batch_size=config.batch_size, shuffle=True)
|
| 237 |
+
valid_loader = DataLoader(valid_set, batch_size=config.batch_size)
|
| 238 |
+
|
| 239 |
+
model = Model(config.flavor, config.device)
|
| 240 |
+
|
| 241 |
+
fit(config, model, checkpoint_path, train_loader, valid_loader, config.updates, config.period, config.lr)
|
| 242 |
+
|
| 243 |
+
|
| 244 |
+
def run_eval(config, test_x_fn, test_y_fn, checkpoint_path):
|
| 245 |
+
X_test, Y_test = batchify(config.max_length, torch.load(test_x_fn), torch.load(test_y_fn))
|
| 246 |
+
test_set = TensorDataset(X_test, Y_test)
|
| 247 |
+
test_loader = DataLoader(test_set, batch_size=config.batch_size)
|
| 248 |
+
|
| 249 |
+
loaded = torch.load(checkpoint_path, map_location=config.device)
|
| 250 |
+
if 'config' in loaded:
|
| 251 |
+
config = Config(**loaded['config'])
|
| 252 |
+
init(config)
|
| 253 |
+
|
| 254 |
+
model = Model(config.flavor, config.device)
|
| 255 |
+
model.load_state_dict(loaded['model_state_dict'])
|
| 256 |
+
|
| 257 |
+
print(*compute_performance(config, model, test_loader))
|
| 258 |
+
|
| 259 |
+
|
| 260 |
+
def recase(token, label):
|
| 261 |
+
if label == case['LOWER']:
|
| 262 |
+
return token.lower()
|
| 263 |
+
elif label == case['CAPITALIZE']:
|
| 264 |
+
return token.lower().capitalize()
|
| 265 |
+
elif label == case['UPPER']:
|
| 266 |
+
return token.upper()
|
| 267 |
+
else:
|
| 268 |
+
return token
|
| 269 |
+
|
| 270 |
+
|
| 271 |
+
class CasePuncPredictor:
|
| 272 |
+
def __init__(self, checkpoint_path, lang=default_config.lang, flavor=default_config.flavor, device=default_config.device):
|
| 273 |
+
loaded = torch.load(checkpoint_path, map_location=device if torch.cuda.is_available() else 'cpu')
|
| 274 |
+
if 'config' in loaded:
|
| 275 |
+
self.config = Config(**loaded['config'])
|
| 276 |
+
else:
|
| 277 |
+
self.config = Config(lang=lang, flavor=flavor, device=device)
|
| 278 |
+
init(self.config)
|
| 279 |
+
|
| 280 |
+
self.model = Model(self.config.flavor, self.config.device)
|
| 281 |
+
self.model.load_state_dict(loaded['model_state_dict'])
|
| 282 |
+
self.model.eval()
|
| 283 |
+
self.model.to(self.config.device)
|
| 284 |
+
|
| 285 |
+
self.rev_case = {b: a for a, b in case.items()}
|
| 286 |
+
self.rev_punc = {b: a for a, b in punctuation.items()}
|
| 287 |
+
|
| 288 |
+
def tokenize(self, text):
|
| 289 |
+
return [self.config.cls_token] + self.config.tokenizer.tokenize(text) + [self.config.sep_token]
|
| 290 |
+
|
| 291 |
+
def predict(self, tokens, getter=lambda x: x):
|
| 292 |
+
max_length = self.config.max_length
|
| 293 |
+
device = self.config.device
|
| 294 |
+
if type(tokens) == str:
|
| 295 |
+
tokens = self.tokenize(tokens)
|
| 296 |
+
previous_label = punctuation['PERIOD']
|
| 297 |
+
for start in range(0, len(tokens), max_length):
|
| 298 |
+
instance = tokens[start: start + max_length]
|
| 299 |
+
if type(getter(instance[0])) == str:
|
| 300 |
+
ids = self.config.tokenizer.convert_tokens_to_ids(getter(token) for token in instance)
|
| 301 |
+
else:
|
| 302 |
+
ids = [getter(token) for token in instance]
|
| 303 |
+
if len(ids) < max_length:
|
| 304 |
+
ids += [0] * (max_length - len(ids))
|
| 305 |
+
x = torch.tensor([ids]).long().to(device)
|
| 306 |
+
y_scores1, y_scores2 = self.model(x)
|
| 307 |
+
y_pred1 = torch.max(y_scores1, 2)[1]
|
| 308 |
+
y_pred2 = torch.max(y_scores2, 2)[1]
|
| 309 |
+
for i, id, token, punc_label, case_label in zip(range(len(instance)), ids, instance, y_pred1[0].tolist()[:len(instance)], y_pred2[0].tolist()[:len(instance)]):
|
| 310 |
+
if id == self.config.cls_token_id or id == self.config.sep_token_id:
|
| 311 |
+
continue
|
| 312 |
+
if previous_label != None and previous_label > 1:
|
| 313 |
+
if case_label in [case['LOWER'], case['OTHER']]: # LOWER, OTHER
|
| 314 |
+
case_label = case['CAPITALIZE']
|
| 315 |
+
if i + start == len(tokens) - 2 and punc_label == punctuation['O']:
|
| 316 |
+
punc_label = punctuation['PERIOD']
|
| 317 |
+
yield (token, self.rev_case[case_label], self.rev_punc[punc_label])
|
| 318 |
+
previous_label = punc_label
|
| 319 |
+
|
| 320 |
+
def map_case_label(self, token, case_label):
|
| 321 |
+
if token.endswith('</w>'):
|
| 322 |
+
token = token[:-4]
|
| 323 |
+
if token.startswith('##'):
|
| 324 |
+
token = token[2:]
|
| 325 |
+
return recase(token, case[case_label])
|
| 326 |
+
|
| 327 |
+
def map_punc_label(self, token, punc_label):
|
| 328 |
+
if token.endswith('</w>'):
|
| 329 |
+
token = token[:-4]
|
| 330 |
+
if token.startswith('##'):
|
| 331 |
+
token = token[2:]
|
| 332 |
+
return token + punctuation_syms[punctuation[punc_label]]
|
| 333 |
+
|
| 334 |
+
|
| 335 |
+
|
| 336 |
+
def generate_predictions(config, checkpoint_path):
|
| 337 |
+
loaded = torch.load(checkpoint_path, map_location=config.device if torch.cuda.is_available() else 'cpu')
|
| 338 |
+
if 'config' in loaded:
|
| 339 |
+
config = Config(**loaded['config'])
|
| 340 |
+
init(config)
|
| 341 |
+
|
| 342 |
+
model = Model(config.flavor, config.device)
|
| 343 |
+
model.load_state_dict(loaded['model_state_dict'])
|
| 344 |
+
|
| 345 |
+
rev_case = {b: a for a, b in case.items()}
|
| 346 |
+
rev_punc = {b: a for a, b in punctuation.items()}
|
| 347 |
+
|
| 348 |
+
for line in sys.stdin:
|
| 349 |
+
# also drop punctuation that we may generate
|
| 350 |
+
line = ''.join([c for c in line if c not in mapped_punctuation])
|
| 351 |
+
if config.debug:
|
| 352 |
+
print(line)
|
| 353 |
+
tokens = [config.cls_token] + config.tokenizer.tokenize(line) + [config.sep_token]
|
| 354 |
+
if config.debug:
|
| 355 |
+
print(tokens)
|
| 356 |
+
previous_label = punctuation['PERIOD']
|
| 357 |
+
first_time = True
|
| 358 |
+
was_word = False
|
| 359 |
+
for start in range(0, len(tokens), config.max_length):
|
| 360 |
+
instance = tokens[start: start + config.max_length]
|
| 361 |
+
ids = config.tokenizer.convert_tokens_to_ids(instance)
|
| 362 |
+
#print(len(ids), file=sys.stderr)
|
| 363 |
+
if len(ids) < config.max_length:
|
| 364 |
+
ids += [config.pad_token_id] * (config.max_length - len(ids))
|
| 365 |
+
x = torch.tensor([ids]).long().to(config.device)
|
| 366 |
+
y_scores1, y_scores2 = model(x)
|
| 367 |
+
y_pred1 = torch.max(y_scores1, 2)[1]
|
| 368 |
+
y_pred2 = torch.max(y_scores2, 2)[1]
|
| 369 |
+
for id, token, punc_label, case_label in zip(ids, instance, y_pred1[0].tolist()[:len(instance)], y_pred2[0].tolist()[:len(instance)]):
|
| 370 |
+
if config.debug:
|
| 371 |
+
print(id, token, punc_label, case_label, file=sys.stderr)
|
| 372 |
+
if id == config.cls_token_id or id == config.sep_token_id:
|
| 373 |
+
continue
|
| 374 |
+
if previous_label != None and previous_label > 1:
|
| 375 |
+
if case_label in [case['LOWER'], case['OTHER']]:
|
| 376 |
+
case_label = case['CAPITALIZE']
|
| 377 |
+
previous_label = punc_label
|
| 378 |
+
# different strategy due to sub-lexical token encoding in Flaubert
|
| 379 |
+
if config.lang == 'fr':
|
| 380 |
+
if token.endswith('</w>'):
|
| 381 |
+
cased_token = recase(token[:-4], case_label)
|
| 382 |
+
if was_word:
|
| 383 |
+
print(' ', end='')
|
| 384 |
+
print(cased_token + punctuation_syms[punc_label], end='')
|
| 385 |
+
was_word = True
|
| 386 |
+
else:
|
| 387 |
+
cased_token = recase(token, case_label)
|
| 388 |
+
if was_word:
|
| 389 |
+
print(' ', end='')
|
| 390 |
+
print(cased_token, end='')
|
| 391 |
+
was_word = False
|
| 392 |
+
else:
|
| 393 |
+
if token.startswith('##'):
|
| 394 |
+
cased_token = recase(token[2:], case_label)
|
| 395 |
+
print(cased_token, end='')
|
| 396 |
+
else:
|
| 397 |
+
cased_token = recase(token, case_label)
|
| 398 |
+
if not first_time:
|
| 399 |
+
print(' ', end='')
|
| 400 |
+
first_time = False
|
| 401 |
+
print(cased_token + punctuation_syms[punc_label], end='')
|
| 402 |
+
if previous_label == 0:
|
| 403 |
+
print('.', end='')
|
| 404 |
+
print()
|
| 405 |
+
|
| 406 |
+
|
| 407 |
+
def label_for_case(token):
|
| 408 |
+
token = re.sub('[^\p{Han}\p{Ll}\p{Lu}]', '', token)
|
| 409 |
+
if token == token.lower():
|
| 410 |
+
return 'LOWER'
|
| 411 |
+
elif token == token.lower().capitalize():
|
| 412 |
+
return 'CAPITALIZE'
|
| 413 |
+
elif token == token.upper():
|
| 414 |
+
return 'UPPER'
|
| 415 |
+
else:
|
| 416 |
+
return 'OTHER'
|
| 417 |
+
|
| 418 |
+
|
| 419 |
+
def make_tensors(config, input_fn, output_x_fn, output_y_fn):
|
| 420 |
+
# count file lines without loading them
|
| 421 |
+
size = 0
|
| 422 |
+
with open(input_fn) as fp:
|
| 423 |
+
for line in fp:
|
| 424 |
+
size += 1
|
| 425 |
+
|
| 426 |
+
with open(input_fn) as fp:
|
| 427 |
+
X = torch.IntTensor(size)
|
| 428 |
+
Y = torch.ByteTensor(size, 2)
|
| 429 |
+
|
| 430 |
+
offset = 0
|
| 431 |
+
for n, line in enumerate(fp):
|
| 432 |
+
word, case_label, punc_label = line.strip().split('\t')
|
| 433 |
+
id = config.tokenizer.convert_tokens_to_ids(word)
|
| 434 |
+
if config.debug:
|
| 435 |
+
assert word.lower() == tokenizer.convert_ids_to_tokens(id)
|
| 436 |
+
X[offset] = id
|
| 437 |
+
Y[offset, 0] = punctuation[punc_label]
|
| 438 |
+
Y[offset, 1] = case[case_label]
|
| 439 |
+
offset += 1
|
| 440 |
+
|
| 441 |
+
torch.save(X, output_x_fn)
|
| 442 |
+
torch.save(Y, output_y_fn)
|
| 443 |
+
|
| 444 |
+
|
| 445 |
+
mapped_punctuation = {
|
| 446 |
+
'.': 'PERIOD',
|
| 447 |
+
'...': 'PERIOD',
|
| 448 |
+
',': 'COMMA',
|
| 449 |
+
';': 'COMMA',
|
| 450 |
+
':': 'COMMA',
|
| 451 |
+
'(': 'COMMA',
|
| 452 |
+
')': 'COMMA',
|
| 453 |
+
'?': 'QUESTION',
|
| 454 |
+
'!': 'EXCLAMATION',
|
| 455 |
+
',': 'COMMA',
|
| 456 |
+
'!': 'EXCLAMATION',
|
| 457 |
+
'?': 'QUESTION',
|
| 458 |
+
';': 'COMMA',
|
| 459 |
+
':': 'COMMA',
|
| 460 |
+
'(': 'COMMA',
|
| 461 |
+
'(': 'COMMA',
|
| 462 |
+
')': 'COMMA',
|
| 463 |
+
'[': 'COMMA',
|
| 464 |
+
']': 'COMMA',
|
| 465 |
+
'【': 'COMMA',
|
| 466 |
+
'】': 'COMMA',
|
| 467 |
+
'└': 'COMMA',
|
| 468 |
+
'└ ': 'COMMA',
|
| 469 |
+
'_': 'O',
|
| 470 |
+
'。': 'PERIOD',
|
| 471 |
+
'、': 'COMMA', # enumeration comma
|
| 472 |
+
'、': 'COMMA',
|
| 473 |
+
'…': 'PERIOD',
|
| 474 |
+
'—': 'COMMA',
|
| 475 |
+
'「': 'COMMA',
|
| 476 |
+
'」': 'COMMA',
|
| 477 |
+
'.': 'PERIOD',
|
| 478 |
+
'《': 'O',
|
| 479 |
+
'》': 'O',
|
| 480 |
+
',': 'COMMA',
|
| 481 |
+
'“': 'O',
|
| 482 |
+
'”': 'O',
|
| 483 |
+
'"': 'O',
|
| 484 |
+
'-': 'O',
|
| 485 |
+
'-': 'O',
|
| 486 |
+
'〉': 'COMMA',
|
| 487 |
+
'〈': 'COMMA',
|
| 488 |
+
'↑': 'O',
|
| 489 |
+
'〔': 'COMMA',
|
| 490 |
+
'〕': 'COMMA',
|
| 491 |
+
}
|
| 492 |
+
|
| 493 |
+
def preprocess_text(config, max_token_count=-1):
|
| 494 |
+
global num_tokens_output
|
| 495 |
+
max_token_count = int(max_token_count)
|
| 496 |
+
num_tokens_output = 0
|
| 497 |
+
def process_segment(text, punctuation):
|
| 498 |
+
global num_tokens_output
|
| 499 |
+
text = text.replace('\t', ' ')
|
| 500 |
+
tokens = config.tokenizer.tokenize(text)
|
| 501 |
+
for i, token in enumerate(tokens):
|
| 502 |
+
case_label = label_for_case(token)
|
| 503 |
+
if i == len(tokens) - 1:
|
| 504 |
+
print(token.lower(), case_label, punctuation, sep='\t')
|
| 505 |
+
else:
|
| 506 |
+
print(token.lower(), case_label, 'O', sep='\t')
|
| 507 |
+
num_tokens_output += 1
|
| 508 |
+
# a bit too ugly, but alternative is to throw an exception
|
| 509 |
+
if max_token_count > 0 and num_tokens_output >= max_token_count:
|
| 510 |
+
sys.exit(0)
|
| 511 |
+
|
| 512 |
+
for line in sys.stdin:
|
| 513 |
+
line = line.strip()
|
| 514 |
+
if line != '':
|
| 515 |
+
line = unicodedata.normalize("NFC", line)
|
| 516 |
+
if config.debug:
|
| 517 |
+
print(line)
|
| 518 |
+
start = 0
|
| 519 |
+
for i, char in enumerate(line):
|
| 520 |
+
if char in mapped_punctuation:
|
| 521 |
+
if i > start and line[start: i].strip() != '':
|
| 522 |
+
process_segment(line[start: i], mapped_punctuation[char])
|
| 523 |
+
start = i + 1
|
| 524 |
+
if start < len(line):
|
| 525 |
+
process_segment(line[start:], 'PERIOD')
|
| 526 |
+
|
| 527 |
+
|
| 528 |
+
def preprocess_text_old_fr(config):
|
| 529 |
+
assert config.lang == 'fr'
|
| 530 |
+
splitsents = MosesSentenceSplitter(lang)
|
| 531 |
+
tokenize = MosesTokenizer(lang, extra=['-no-escape'])
|
| 532 |
+
normalize = MosesPunctuationNormalizer(lang)
|
| 533 |
+
|
| 534 |
+
for line in sys.stdin:
|
| 535 |
+
if line.strip() != '':
|
| 536 |
+
for sentence in splitsents([normalize(line)]):
|
| 537 |
+
tokens = tokenize(sentence)
|
| 538 |
+
previous_token = None
|
| 539 |
+
for token in tokens:
|
| 540 |
+
if token in mapped_punctuation:
|
| 541 |
+
if previous_token != None:
|
| 542 |
+
print(previous_token, mapped_punctuation[token], sep='\t')
|
| 543 |
+
previous_token = None
|
| 544 |
+
elif not re.search('[\p{Han}\p{Ll}\p{Lu}\d]', token): # remove non-alphanumeric tokens
|
| 545 |
+
continue
|
| 546 |
+
else:
|
| 547 |
+
if previous_token != None:
|
| 548 |
+
print(previous_token, 'O', sep='\t')
|
| 549 |
+
previous_token = token
|
| 550 |
+
if previous_token != None:
|
| 551 |
+
print(previous_token, 'PERIOD', sep='\t')
|
| 552 |
+
|
| 553 |
+
|
| 554 |
+
# modification of the wordpiece tokenizer to keep case information even if vocab is lower cased
|
| 555 |
+
# forked from https://github.com/huggingface/transformers/blob/master/src/transformers/models/bert/tokenization_bert.py
|
| 556 |
+
|
| 557 |
+
class WordpieceTokenizer(object):
|
| 558 |
+
"""Runs WordPiece tokenization."""
|
| 559 |
+
|
| 560 |
+
def __init__(self, vocab, unk_token, max_input_chars_per_word=100, keep_case=True):
|
| 561 |
+
self.vocab = vocab
|
| 562 |
+
self.unk_token = unk_token
|
| 563 |
+
self.max_input_chars_per_word = max_input_chars_per_word
|
| 564 |
+
self.keep_case = keep_case
|
| 565 |
+
|
| 566 |
+
def tokenize(self, text):
|
| 567 |
+
"""
|
| 568 |
+
Tokenizes a piece of text into its word pieces. This uses a greedy longest-match-first algorithm to perform
|
| 569 |
+
tokenization using the given vocabulary.
|
| 570 |
+
For example, :obj:`input = "unaffable"` wil return as output :obj:`["un", "##aff", "##able"]`.
|
| 571 |
+
Args:
|
| 572 |
+
text: A single token or whitespace separated tokens. This should have
|
| 573 |
+
already been passed through `BasicTokenizer`.
|
| 574 |
+
Returns:
|
| 575 |
+
A list of wordpiece tokens.
|
| 576 |
+
"""
|
| 577 |
+
|
| 578 |
+
output_tokens = []
|
| 579 |
+
for token in text.strip().split():
|
| 580 |
+
chars = list(token)
|
| 581 |
+
if len(chars) > self.max_input_chars_per_word:
|
| 582 |
+
output_tokens.append(self.unk_token)
|
| 583 |
+
continue
|
| 584 |
+
|
| 585 |
+
is_bad = False
|
| 586 |
+
start = 0
|
| 587 |
+
sub_tokens = []
|
| 588 |
+
while start < len(chars):
|
| 589 |
+
end = len(chars)
|
| 590 |
+
cur_substr = None
|
| 591 |
+
while start < end:
|
| 592 |
+
substr = "".join(chars[start:end])
|
| 593 |
+
if start > 0:
|
| 594 |
+
substr = "##" + substr
|
| 595 |
+
# optionaly lowercase substring before checking for inclusion in vocab
|
| 596 |
+
if (self.keep_case and substr.lower() in self.vocab) or (substr in self.vocab):
|
| 597 |
+
cur_substr = substr
|
| 598 |
+
break
|
| 599 |
+
end -= 1
|
| 600 |
+
if cur_substr is None:
|
| 601 |
+
is_bad = True
|
| 602 |
+
break
|
| 603 |
+
sub_tokens.append(cur_substr)
|
| 604 |
+
start = end
|
| 605 |
+
|
| 606 |
+
if is_bad:
|
| 607 |
+
output_tokens.append(self.unk_token)
|
| 608 |
+
else:
|
| 609 |
+
output_tokens.extend(sub_tokens)
|
| 610 |
+
return output_tokens
|
| 611 |
+
|
| 612 |
+
|
| 613 |
+
# modification of XLM bpe tokenizer for keeping case information when vocab is lowercase
|
| 614 |
+
# forked from https://github.com/huggingface/transformers/blob/cd56f3fe7eae4a53a9880e3f5e8f91877a78271c/src/transformers/models/xlm/tokenization_xlm.py
|
| 615 |
+
def bpe(self, token):
|
| 616 |
+
def to_lower(pair):
|
| 617 |
+
#print(' ',pair)
|
| 618 |
+
return (pair[0].lower(), pair[1].lower())
|
| 619 |
+
|
| 620 |
+
from transformers.models.xlm.tokenization_xlm import get_pairs
|
| 621 |
+
|
| 622 |
+
word = tuple(token[:-1]) + (token[-1] + "</w>",)
|
| 623 |
+
if token in self.cache:
|
| 624 |
+
return self.cache[token]
|
| 625 |
+
pairs = get_pairs(word)
|
| 626 |
+
|
| 627 |
+
if not pairs:
|
| 628 |
+
return token + "</w>"
|
| 629 |
+
|
| 630 |
+
while True:
|
| 631 |
+
bigram = min(pairs, key=lambda pair: self.bpe_ranks.get(to_lower(pair), float("inf")))
|
| 632 |
+
#print(bigram)
|
| 633 |
+
if to_lower(bigram) not in self.bpe_ranks:
|
| 634 |
+
break
|
| 635 |
+
first, second = bigram
|
| 636 |
+
new_word = []
|
| 637 |
+
i = 0
|
| 638 |
+
while i < len(word):
|
| 639 |
+
try:
|
| 640 |
+
j = word.index(first, i)
|
| 641 |
+
except ValueError:
|
| 642 |
+
new_word.extend(word[i:])
|
| 643 |
+
break
|
| 644 |
+
else:
|
| 645 |
+
new_word.extend(word[i:j])
|
| 646 |
+
i = j
|
| 647 |
+
|
| 648 |
+
if word[i] == first and i < len(word) - 1 and word[i + 1] == second:
|
| 649 |
+
new_word.append(first + second)
|
| 650 |
+
i += 2
|
| 651 |
+
else:
|
| 652 |
+
new_word.append(word[i])
|
| 653 |
+
i += 1
|
| 654 |
+
new_word = tuple(new_word)
|
| 655 |
+
word = new_word
|
| 656 |
+
if len(word) == 1:
|
| 657 |
+
break
|
| 658 |
+
else:
|
| 659 |
+
pairs = get_pairs(word)
|
| 660 |
+
word = " ".join(word)
|
| 661 |
+
if word == "\n </w>":
|
| 662 |
+
word = "\n</w>"
|
| 663 |
+
self.cache[token] = word
|
| 664 |
+
return word
|
| 665 |
+
|
| 666 |
+
|
| 667 |
+
|
| 668 |
+
def init(config):
|
| 669 |
+
init_random(config.seed)
|
| 670 |
+
|
| 671 |
+
if config.lang == 'fr':
|
| 672 |
+
config.tokenizer = tokenizer = AutoTokenizer.from_pretrained(config.flavor, do_lower_case=False)
|
| 673 |
+
|
| 674 |
+
from transformers.models.xlm.tokenization_xlm import XLMTokenizer
|
| 675 |
+
assert isinstance(tokenizer, XLMTokenizer)
|
| 676 |
+
|
| 677 |
+
# monkey patch XLM tokenizer
|
| 678 |
+
import types
|
| 679 |
+
tokenizer.bpe = types.MethodType(bpe, tokenizer)
|
| 680 |
+
else:
|
| 681 |
+
# warning: needs to be BertTokenizer for monkey patching to work
|
| 682 |
+
config.tokenizer = tokenizer = BertTokenizer.from_pretrained(config.flavor, do_lower_case=False)
|
| 683 |
+
|
| 684 |
+
# warning: monkey patch tokenizer to keep case information
|
| 685 |
+
#from recasing_tokenizer import WordpieceTokenizer
|
| 686 |
+
config.tokenizer.wordpiece_tokenizer = WordpieceTokenizer(vocab=tokenizer.vocab, unk_token=tokenizer.unk_token)
|
| 687 |
+
|
| 688 |
+
if config.lang == 'fr':
|
| 689 |
+
config.pad_token_id = tokenizer.pad_token_id
|
| 690 |
+
config.cls_token_id = tokenizer.bos_token_id
|
| 691 |
+
config.cls_token = tokenizer.bos_token
|
| 692 |
+
config.sep_token_id = tokenizer.sep_token_id
|
| 693 |
+
config.sep_token = tokenizer.sep_token
|
| 694 |
+
else:
|
| 695 |
+
config.pad_token_id = tokenizer.pad_token_id
|
| 696 |
+
config.cls_token_id = tokenizer.cls_token_id
|
| 697 |
+
config.cls_token = tokenizer.cls_token
|
| 698 |
+
config.sep_token_id = tokenizer.sep_token_id
|
| 699 |
+
config.sep_token = tokenizer.sep_token
|
| 700 |
+
|
| 701 |
+
if not torch.cuda.is_available() and config.device == 'cuda':
|
| 702 |
+
print('WARNING: reverting to cpu as cuda is not available', file=sys.stderr)
|
| 703 |
+
config.device = torch.device(config.device if torch.cuda.is_available() else 'cpu')
|
| 704 |
+
|
| 705 |
+
|
| 706 |
+
def main(config, action, args):
|
| 707 |
+
init(config)
|
| 708 |
+
|
| 709 |
+
if action == 'train':
|
| 710 |
+
train(config, *args)
|
| 711 |
+
elif action == 'eval':
|
| 712 |
+
run_eval(config, *args)
|
| 713 |
+
elif action == 'predict':
|
| 714 |
+
generate_predictions(config, *args)
|
| 715 |
+
elif action == 'tensorize':
|
| 716 |
+
make_tensors(config, *args)
|
| 717 |
+
elif action == 'preprocess':
|
| 718 |
+
preprocess_text(config, *args)
|
| 719 |
+
else:
|
| 720 |
+
print('invalid action "%s"' % action)
|
| 721 |
+
sys.exit(1)
|
| 722 |
+
|
| 723 |
+
if __name__ == '__main__':
|
| 724 |
+
parser = argparse.ArgumentParser()
|
| 725 |
+
parser.add_argument("action", help="train|eval|predict|tensorize|preprocess", type=str)
|
| 726 |
+
parser.add_argument("action_args", help="arguments for selected action", type=str, nargs='*')
|
| 727 |
+
parser.add_argument("--seed", help="random seed", default=default_config.seed, type=int)
|
| 728 |
+
parser.add_argument("--lang", help="language (fr, en, zh)", default=default_config.lang, type=str)
|
| 729 |
+
parser.add_argument("--flavor", help="bert flavor in transformers model zoo", default=default_config.flavor, type=str)
|
| 730 |
+
parser.add_argument("--max-length", help="maximum input length", default=default_config.max_length, type=int)
|
| 731 |
+
parser.add_argument("--batch-size", help="size of batches", default=default_config.batch_size, type=int)
|
| 732 |
+
parser.add_argument("--device", help="computation device (cuda, cpu)", default=default_config.device, type=str)
|
| 733 |
+
parser.add_argument("--debug", help="whether to output more debug info", default=default_config.debug, type=bool)
|
| 734 |
+
parser.add_argument("--updates", help="number of training updates to perform", default=default_config.updates, type=bool)
|
| 735 |
+
parser.add_argument("--period", help="validation period in updates", default=default_config.period, type=bool)
|
| 736 |
+
parser.add_argument("--lr", help="learning rate", default=default_config.lr, type=bool)
|
| 737 |
+
parser.add_argument("--dab-rate", help="drop at boundaries rate", default=default_config.dab_rate, type=bool)
|
| 738 |
+
config = Config(**parser.parse_args().__dict__)
|
| 739 |
+
|
| 740 |
+
main(config, config.action, config.action_args)
|
| 741 |
+
|
| 742 |
+
|
punctuation/vosk-recasepunc-en-0.22/vosk-adapted.txt
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
the
|
| 2 |
+
the
|
| 3 |
+
the beijing and shanghai welcome to the market strata open i'm yvonne good morning and i'm david ingles counting down of course the diablo trade on the chinese
|
| 4 |
+
mainland here in hong kong let's get your top stories today taper and a timetable dominating the latest fed minutes as official debates the exit path meanwhile i got beijing heading the other way hinting at the first triple r cut in more than a year and after the didi debacle here china may move to close a loophole long used
|
| 5 |
+
by companies to take their listings abroad all to enhance that was a horrible mistake council yesterday from china as a maybe it's time to cut the triple r to help them with small businesses they are struggling from the rise of raw material costs the key question is how likely is this yeah what they say it chances are likely it's probably going to be up yet
|
| 6 |
+
the fact that they're saying it might actually already mean we're getting some sentiment coming through in terms of an improved material tracker ten year yield we'll get to that in just a moment in china we're now flirting with the three percent level equity markets futures are pointing up as you can see here in china though broadly speaking though we're down for a seven day across asia seventh day in the last excuse me
|
| 7 |
+
in the last eight sessions here have little commodity markets we're stabilising across your oil or oil prices we're still down five six per cent from highs though as far as that is concerned fx markets your story is guys can we change the police are we're looking at generally speaking the dollar that's very much in focus here so you look at that against the euro you look at that
|
| 8 |
+
against the chinese currency twenty four hours ago who would have thought we were talking about this sort of more divergence and starker labour discord between where you are in a pboc to easily in the fed and very quickly we alluded to this of course if one three percent on your chinese ten year yield and we're not one point three percent lower and lower
|
| 9 |
+
yields there is a charge for you china's top us ten year yield is at the bottom yeah the chinatown area lowest since we saw last year of september yup
|
| 10 |
+
yeah it is a really big major shift in china's central bank policy that's the key question could it be coming of course let's flash out that into what we heard from the cabinet there raising the possibility of a cut to the reserve requirement ratio to both the economy at the same time we also from a former pboc official sheng songcheng said the central bank should actually
|
| 11 |
+
cut rates he's not just talking about a triple r and either the second half is an important window when china's monetary policy can tilt towards loosening while remaining stable and the interest rates can be lowered in a reasonable and moderate manner let's get the take from also be as well whether daisy i'm david chiu here the short of it is
|
| 12 |
+
so i guess one point if we still haven't gotten that if in the event that we do their take is they it might be a little bit too aggressive to address some of the softness in the economy in other words what they're saying is it needs some help the economy maybe not this much yeah there preferring perhaps perhaps liquidity injections here and there but this might signal a bit too much
|
| 13 |
+
for when it comes to reflating the economy joining us out of the dice all this let's bring in wang tao ubi as head of asia economics and the chief china economists as well wang tao thanks much for joining us first off do you think this is actually a real possibility now
|
| 14 |
+
or well will shrink or fade contro as a frequently called using triple r cut as a tool so i think yes indeed it is a real possibility that they could do this however in the past whenever the state council called for this a few days to a couple of weeks later we were
|
| 15 |
+
would have we would see a triple r cut if they called for it and but it's worth noting that last year in june shoot at the chicago auto quote for it and by the pbc did not hold onto with any market so i i would say at this moment it's probably a relatively high likelihood but anything
|
| 16 |
+
the wording is really you know about mitigating the higher cost of commodity prices they impact on at an ease and make their effective conquered funding a bit lower so it's possible that it's going to be a targeted not a overall triple cut and i i don't think this really reflects a
|
| 17 |
+
wholesale shift in monetary policy i think very very much in the same state concrete statement also talked about
|
punctuation/vosk-recasepunc-en-0.22/vosk-adapted.txt.punc
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
The. The. The Beijing and Shanghai. Welcome to the market strata open. I'm Yvonne, good morning, and I'm David Ingles, counting down, of course, the Diablo trade on the Chinese mainland here in Hong Kong. Let's get your top stories today, taper and a timetable dominating the latest Fed minutes as official debates. The exit path. Meanwhile, I got Beijing heading the other way, hinting at the first triple R cut in more than a year. And after the Didi debacle here, China may move to close a loophole. Long used by companies to take their listings abroad, all to enhance. That was a horrible mistake. Council yesterday from China as a. Maybe it's time to cut the triple R to help them with small businesses they are struggling from the rise of raw material costs. The key question is, how likely is this ? Yeah, what they say it. Chances are likely it's probably going to be up yet. The fact that they're saying it might actually already mean we're getting some sentiment coming through in terms of an improved material tracker. Ten year yield. We'll get to that in just a moment. In China. We're now flirting with the three percent level equity markets futures are pointing up. As you can see here in China, though. Broadly speaking, though, we're down for a seven day across Asia. Seventh day in the last. Excuse me, in the last eight sessions here have little commodity markets. We're stabilising across your oil or oil prices. We're still down five, six per cent from highs, though as far as that is concerned FX markets. Your story is, guys, can we change the police are we're looking at, generally speaking, the dollar. That's very much in focus here. So you look at that against the euro. You look at that against the Chinese currency Twenty four hours ago. Who would have thought we were talking about this sort of more divergence and starker labour discord between where you are in a PBOC to easily in the Fed and very quickly. We alluded to this, Of course, if one three percent on your Chinese ten year yield and we're not one point three percent lower and lower yields, there is a charge for you. China's top US ten year yield is at the bottom. Yeah, the Chinatown area lowest since we saw last year of September. Yup. Yeah, it is a really big major shift in China's central bank policy. That's the key question. Could it be coming ? Of course. Let's flash out that into what we heard from the cabinet there, raising the possibility of a cut to the reserve requirement ratio to both the economy at the same time. We also from a former PBOC official, Sheng Songcheng said the central bank should actually cut rates. He's not just talking about a triple R. And either the second half is an important window when China's monetary policy can tilt towards loosening while remaining stable and the interest rates can be lowered in a reasonable and moderate manner. Let's get the take from also be as well, whether Daisy, I'm David Chiu here, the short of it is so I guess one point, if we still haven't gotten that if in the event that we do their take is they, it might be a little bit too aggressive to address some of the softness in the economy. In other words, what they're saying is it needs some help. The economy, maybe not this much. Yeah, there, preferring perhaps perhaps liquidity injections here and there. But this might signal a bit too much for when it comes to reflating the economy. Joining us out of the dice. All this, Let's bring in Wang Tao Ubi as head of Asia Economics, and the chief China economists as well. Wang Tao, thanks much for joining us. First off, do you think this is actually a real possibility now or well will shrink or fade ? Contro as a frequently called using triple R cut as a tool. So I think yes, indeed, it is a real possibility. That they could do this. However, in the past, whenever the State Council called for this a few days to a couple of weeks later, we were. Would have we would see a triple R cut if they called for it. And. But it's worth noting that last year in June, shoot at the Chicago auto quote for it and by the PBC did not hold onto with any market so I. I would say at this moment it's probably a relatively high likelihood, but anything. The wording is really, you know about mitigating the higher cost of commodity prices they impact on at an ease and make their effective conquered funding a bit lower. So it's possible that it's going to be a targeted, not a overall triple cut and I. I don't think this really reflects a wholesale shift in monetary policy. I think very, very much in the same state. Concrete statement also talked about.
|
punctuation/vosk-recasepunc-ru-0.22.7z
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:f23cc633c06d910e056234d6b83a11a3683e582abc56c30771dbec98a91034de
|
| 3 |
+
size 1639885297
|
punctuation/vosk-recasepunc-ru-0.22/README
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
1. Install pytorch and transformers:
|
| 2 |
+
|
| 3 |
+
pip3 install transformers
|
| 4 |
+
|
| 5 |
+
2. Run python3 example.py de-test.txt
|
| 6 |
+
|
| 7 |
+
3. Compare with de-test.txt.orig
|
punctuation/vosk-recasepunc-ru-0.22/checkpoint
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:61fd424795c046963f88534071abde0813a4a6c66c07f0335b013825e536c1ae
|
| 3 |
+
size 2134070889
|
punctuation/vosk-recasepunc-ru-0.22/example.py
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import sys
|
| 2 |
+
import time
|
| 3 |
+
from transformers import logging
|
| 4 |
+
from recasepunc import CasePuncPredictor
|
| 5 |
+
from recasepunc import WordpieceTokenizer
|
| 6 |
+
from recasepunc import Config
|
| 7 |
+
|
| 8 |
+
logging.set_verbosity_error()
|
| 9 |
+
|
| 10 |
+
predictor = CasePuncPredictor('checkpoint', lang="ru")
|
| 11 |
+
|
| 12 |
+
text = " ".join(open(sys.argv[1]).readlines())
|
| 13 |
+
tokens = list(enumerate(predictor.tokenize(text)))
|
| 14 |
+
|
| 15 |
+
results = ""
|
| 16 |
+
for token, case_label, punc_label in predictor.predict(tokens, lambda x: x[1]):
|
| 17 |
+
prediction = predictor.map_punc_label(predictor.map_case_label(token[1], case_label), punc_label)
|
| 18 |
+
if token[1][0] != '#':
|
| 19 |
+
results = results + ' ' + prediction
|
| 20 |
+
else:
|
| 21 |
+
results = results + prediction
|
| 22 |
+
|
| 23 |
+
print (results.strip())
|
punctuation/vosk-recasepunc-ru-0.22/recasepunc.py
ADDED
|
@@ -0,0 +1,743 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import sys
|
| 2 |
+
import collections
|
| 3 |
+
import os
|
| 4 |
+
import regex as re
|
| 5 |
+
#from mosestokenizer import *
|
| 6 |
+
from tqdm import tqdm
|
| 7 |
+
import torch
|
| 8 |
+
import torch.nn as nn
|
| 9 |
+
import torch.nn.functional as F
|
| 10 |
+
import torch.optim as optim
|
| 11 |
+
import random
|
| 12 |
+
import unicodedata
|
| 13 |
+
import numpy as np
|
| 14 |
+
import argparse
|
| 15 |
+
from torch.utils.data import TensorDataset, DataLoader
|
| 16 |
+
|
| 17 |
+
from transformers import AutoModel, AutoTokenizer, BertTokenizer
|
| 18 |
+
|
| 19 |
+
default_config = argparse.Namespace(
|
| 20 |
+
seed=871253,
|
| 21 |
+
lang='ru',
|
| 22 |
+
#flavor='flaubert/flaubert_base_uncased',
|
| 23 |
+
flavor=None,
|
| 24 |
+
max_length=256,
|
| 25 |
+
batch_size=16,
|
| 26 |
+
updates=50000,
|
| 27 |
+
period=1000,
|
| 28 |
+
lr=1e-5,
|
| 29 |
+
dab_rate=0.1,
|
| 30 |
+
device='cuda',
|
| 31 |
+
debug=False
|
| 32 |
+
)
|
| 33 |
+
|
| 34 |
+
default_flavors = {
|
| 35 |
+
'fr': 'flaubert/flaubert_base_uncased',
|
| 36 |
+
'en': 'bert-base-uncased',
|
| 37 |
+
'zh': 'ckiplab/bert-base-chinese',
|
| 38 |
+
'tr': 'dbmdz/bert-base-turkish-uncased',
|
| 39 |
+
'de': 'dbmdz/bert-base-german-uncased',
|
| 40 |
+
'pt': 'neuralmind/bert-base-portuguese-cased',
|
| 41 |
+
'ru': 'DeepPavlov/rubert-base-cased'
|
| 42 |
+
}
|
| 43 |
+
|
| 44 |
+
class Config(argparse.Namespace):
|
| 45 |
+
def __init__(self, **kwargs):
|
| 46 |
+
for key, value in default_config.__dict__.items():
|
| 47 |
+
setattr(self, key, value)
|
| 48 |
+
for key, value in kwargs.items():
|
| 49 |
+
setattr(self, key, value)
|
| 50 |
+
|
| 51 |
+
assert self.lang in ['fr', 'en', 'zh', 'tr', 'pt', 'de', 'ru']
|
| 52 |
+
|
| 53 |
+
if 'lang' in kwargs and ('flavor' not in kwargs or kwargs['flavor'] is None):
|
| 54 |
+
self.flavor = default_flavors[self.lang]
|
| 55 |
+
|
| 56 |
+
#print(self.lang, self.flavor)
|
| 57 |
+
|
| 58 |
+
|
| 59 |
+
def init_random(seed):
|
| 60 |
+
# make sure everything is deterministic
|
| 61 |
+
os.environ['CUBLAS_WORKSPACE_CONFIG'] = ':4096:8'
|
| 62 |
+
#torch.use_deterministic_algorithms(True)
|
| 63 |
+
torch.manual_seed(seed)
|
| 64 |
+
torch.cuda.manual_seed_all(seed)
|
| 65 |
+
random.seed(seed)
|
| 66 |
+
np.random.seed(seed)
|
| 67 |
+
|
| 68 |
+
# NOTE: it is assumed in the implementation that y[:,0] is the punctuation label, and y[:,1] is the case label!
|
| 69 |
+
|
| 70 |
+
punctuation = {
|
| 71 |
+
'O': 0,
|
| 72 |
+
'COMMA': 1,
|
| 73 |
+
'PERIOD': 2,
|
| 74 |
+
'QUESTION': 3,
|
| 75 |
+
'EXCLAMATION': 4,
|
| 76 |
+
}
|
| 77 |
+
|
| 78 |
+
punctuation_syms = ['', ',', '.', ' ?', ' !']
|
| 79 |
+
|
| 80 |
+
case = {
|
| 81 |
+
'LOWER': 0,
|
| 82 |
+
'UPPER': 1,
|
| 83 |
+
'CAPITALIZE': 2,
|
| 84 |
+
'OTHER': 3,
|
| 85 |
+
}
|
| 86 |
+
|
| 87 |
+
|
| 88 |
+
class Model(nn.Module):
|
| 89 |
+
def __init__(self, flavor, device):
|
| 90 |
+
super().__init__()
|
| 91 |
+
self.bert = AutoModel.from_pretrained(flavor)
|
| 92 |
+
# need a proper way of determining representation size
|
| 93 |
+
size = self.bert.dim if hasattr(self.bert, 'dim') else self.bert.config.pooler_fc_size if hasattr(self.bert.config, 'pooler_fc_size') else self.bert.config.emb_dim if hasattr(self.bert.config, 'emb_dim') else self.bert.config.hidden_size
|
| 94 |
+
self.punc = nn.Linear(size, 5)
|
| 95 |
+
self.case = nn.Linear(size, 4)
|
| 96 |
+
self.dropout = nn.Dropout(0.3)
|
| 97 |
+
self.to(device)
|
| 98 |
+
|
| 99 |
+
def forward(self, x):
|
| 100 |
+
output = self.bert(x)
|
| 101 |
+
representations = self.dropout(F.gelu(output['last_hidden_state']))
|
| 102 |
+
punc = self.punc(representations)
|
| 103 |
+
case = self.case(representations)
|
| 104 |
+
return punc, case
|
| 105 |
+
|
| 106 |
+
|
| 107 |
+
# randomly create sequences that align to punctuation boundaries
|
| 108 |
+
def drop_at_boundaries(rate, x, y, cls_token_id, sep_token_id, pad_token_id):
|
| 109 |
+
for i, dropped in enumerate(torch.rand((len(x),)) < rate):
|
| 110 |
+
if dropped:
|
| 111 |
+
# select all indices that are sentence endings
|
| 112 |
+
indices = (y[i,:,0] > 1).nonzero(as_tuple=True)[0]
|
| 113 |
+
if len(indices) < 2:
|
| 114 |
+
continue
|
| 115 |
+
start = indices[0] + 1
|
| 116 |
+
end = indices[random.randint(1, len(indices) - 1)] + 1
|
| 117 |
+
length = end - start
|
| 118 |
+
if length + 2 > len(x[i]):
|
| 119 |
+
continue
|
| 120 |
+
x[i, 0] = cls_token_id
|
| 121 |
+
x[i, 1: length + 1] = x[i, start: end].clone()
|
| 122 |
+
x[i, length + 1] = sep_token_id
|
| 123 |
+
x[i, length + 2:] = pad_token_id
|
| 124 |
+
y[i, 0] = 0
|
| 125 |
+
y[i, 1: length + 1] = y[i, start: end].clone()
|
| 126 |
+
y[i, length + 1:] = 0
|
| 127 |
+
|
| 128 |
+
|
| 129 |
+
def compute_performance(config, model, loader):
|
| 130 |
+
device = config.device
|
| 131 |
+
criterion = nn.CrossEntropyLoss()
|
| 132 |
+
model.eval()
|
| 133 |
+
total_loss = all_correct1 = all_correct2 = num_loss = num_perf = 0
|
| 134 |
+
num_ref = collections.defaultdict(float)
|
| 135 |
+
num_hyp = collections.defaultdict(float)
|
| 136 |
+
num_correct = collections.defaultdict(float)
|
| 137 |
+
for x, y in loader:
|
| 138 |
+
x = x.long().to(device)
|
| 139 |
+
y = y.long().to(device)
|
| 140 |
+
y1 = y[:,:,0]
|
| 141 |
+
y2 = y[:,:,1]
|
| 142 |
+
with torch.no_grad():
|
| 143 |
+
y_scores1, y_scores2 = model(x.to(device))
|
| 144 |
+
loss1 = criterion(y_scores1.view(y1.size(0) * y1.size(1), -1), y1.view(y1.size(0) * y1.size(1)))
|
| 145 |
+
loss2 = criterion(y_scores2.view(y2.size(0) * y2.size(1), -1), y2.view(y2.size(0) * y2.size(1)))
|
| 146 |
+
loss = loss1 + loss2
|
| 147 |
+
y_pred1 = torch.max(y_scores1, 2)[1]
|
| 148 |
+
y_pred2 = torch.max(y_scores2, 2)[1]
|
| 149 |
+
for label in range(1, 5):
|
| 150 |
+
ref = (y1 == label)
|
| 151 |
+
hyp = (y_pred1 == label)
|
| 152 |
+
correct = (ref * hyp == 1)
|
| 153 |
+
num_ref[label] += ref.sum()
|
| 154 |
+
num_hyp[label] += hyp.sum()
|
| 155 |
+
num_correct[label] += correct.sum()
|
| 156 |
+
num_ref[0] += ref.sum()
|
| 157 |
+
num_hyp[0] += hyp.sum()
|
| 158 |
+
num_correct[0] += correct.sum()
|
| 159 |
+
all_correct1 += (y_pred1 == y1).sum()
|
| 160 |
+
all_correct2 += (y_pred2 == y2).sum()
|
| 161 |
+
total_loss += loss.item()
|
| 162 |
+
num_loss += len(y)
|
| 163 |
+
num_perf += len(y) * config.max_length
|
| 164 |
+
recall = {}
|
| 165 |
+
precision = {}
|
| 166 |
+
fscore = {}
|
| 167 |
+
for label in range(0, 5):
|
| 168 |
+
recall[label] = num_correct[label] / num_ref[label] if num_ref[label] > 0 else 0
|
| 169 |
+
precision[label] = num_correct[label] / num_hyp[label] if num_hyp[label] > 0 else 0
|
| 170 |
+
fscore[label] = (2 * recall[label] * precision[label] / (recall[label] + precision[label])).item() if recall[label] + precision[label] > 0 else 0
|
| 171 |
+
return total_loss / num_loss, all_correct2.item() / num_perf, all_correct1.item() / num_perf, fscore
|
| 172 |
+
|
| 173 |
+
|
| 174 |
+
def fit(config, model, checkpoint_path, train_loader, valid_loader, iterations, valid_period=200, lr=1e-5):
|
| 175 |
+
device = config.device
|
| 176 |
+
criterion = nn.CrossEntropyLoss()
|
| 177 |
+
optimizer = optim.Adam(filter(lambda param: param.requires_grad, model.parameters()), lr=lr)
|
| 178 |
+
iteration = 0
|
| 179 |
+
while True:
|
| 180 |
+
model.train()
|
| 181 |
+
total_loss = num = 0
|
| 182 |
+
for x, y in tqdm(train_loader):
|
| 183 |
+
x = x.long().to(device)
|
| 184 |
+
y = y.long().to(device)
|
| 185 |
+
drop_at_boundaries(config.dab_rate, x, y, config.cls_token_id, config.sep_token_id, config.pad_token_id)
|
| 186 |
+
y1 = y[:,:,0]
|
| 187 |
+
y2 = y[:,:,1]
|
| 188 |
+
optimizer.zero_grad()
|
| 189 |
+
y_scores1, y_scores2 = model(x)
|
| 190 |
+
loss1 = criterion(y_scores1.view(y1.size(0) * y1.size(1), -1), y1.view(y1.size(0) * y1.size(1)))
|
| 191 |
+
loss2 = criterion(y_scores2.view(y2.size(0) * y2.size(1), -1), y2.view(y2.size(0) * y2.size(1)))
|
| 192 |
+
loss = loss1 + loss2
|
| 193 |
+
loss.backward()
|
| 194 |
+
optimizer.step()
|
| 195 |
+
total_loss += loss.item()
|
| 196 |
+
num += len(y)
|
| 197 |
+
if iteration % valid_period == valid_period - 1:
|
| 198 |
+
train_loss = total_loss / num
|
| 199 |
+
valid_loss, valid_accuracy_case, valid_accuracy_punc, valid_fscore = compute_performance(config, model, valid_loader)
|
| 200 |
+
torch.save({
|
| 201 |
+
'iteration': iteration + 1,
|
| 202 |
+
'model_state_dict': model.state_dict(),
|
| 203 |
+
'optimizer_state_dict': optimizer.state_dict(),
|
| 204 |
+
'train_loss': train_loss,
|
| 205 |
+
'valid_loss': valid_loss,
|
| 206 |
+
'valid_accuracy_case': valid_accuracy_case,
|
| 207 |
+
'valid_accuracy_punc': valid_accuracy_punc,
|
| 208 |
+
'valid_fscore': valid_fscore,
|
| 209 |
+
'config': config.__dict__,
|
| 210 |
+
}, '%s.%d' % (checkpoint_path, iteration + 1))
|
| 211 |
+
print(iteration + 1, train_loss, valid_loss, valid_accuracy_case, valid_accuracy_punc, valid_fscore)
|
| 212 |
+
total_loss = num = 0
|
| 213 |
+
|
| 214 |
+
iteration += 1
|
| 215 |
+
if iteration > iterations:
|
| 216 |
+
return
|
| 217 |
+
|
| 218 |
+
sys.stderr.flush()
|
| 219 |
+
sys.stdout.flush()
|
| 220 |
+
|
| 221 |
+
|
| 222 |
+
def batchify(max_length, x, y):
|
| 223 |
+
print (x.shape)
|
| 224 |
+
print (y.shape)
|
| 225 |
+
x = x[:(len(x) // max_length) * max_length].reshape(-1, max_length)
|
| 226 |
+
y = y[:(len(y) // max_length) * max_length, :].reshape(-1, max_length, 2)
|
| 227 |
+
return x, y
|
| 228 |
+
|
| 229 |
+
|
| 230 |
+
def train(config, train_x_fn, train_y_fn, valid_x_fn, valid_y_fn, checkpoint_path):
|
| 231 |
+
X_train, Y_train = batchify(config.max_length, torch.load(train_x_fn), torch.load(train_y_fn))
|
| 232 |
+
X_valid, Y_valid = batchify(config.max_length, torch.load(valid_x_fn), torch.load(valid_y_fn))
|
| 233 |
+
|
| 234 |
+
train_set = TensorDataset(X_train, Y_train)
|
| 235 |
+
valid_set = TensorDataset(X_valid, Y_valid)
|
| 236 |
+
|
| 237 |
+
train_loader = DataLoader(train_set, batch_size=config.batch_size, shuffle=True)
|
| 238 |
+
valid_loader = DataLoader(valid_set, batch_size=config.batch_size)
|
| 239 |
+
|
| 240 |
+
model = Model(config.flavor, config.device)
|
| 241 |
+
|
| 242 |
+
fit(config, model, checkpoint_path, train_loader, valid_loader, config.updates, config.period, config.lr)
|
| 243 |
+
|
| 244 |
+
|
| 245 |
+
def run_eval(config, test_x_fn, test_y_fn, checkpoint_path):
|
| 246 |
+
X_test, Y_test = batchify(config.max_length, torch.load(test_x_fn), torch.load(test_y_fn))
|
| 247 |
+
test_set = TensorDataset(X_test, Y_test)
|
| 248 |
+
test_loader = DataLoader(test_set, batch_size=config.batch_size)
|
| 249 |
+
|
| 250 |
+
loaded = torch.load(checkpoint_path, map_location=config.device)
|
| 251 |
+
if 'config' in loaded:
|
| 252 |
+
config = Config(**loaded['config'])
|
| 253 |
+
init(config)
|
| 254 |
+
|
| 255 |
+
model = Model(config.flavor, config.device)
|
| 256 |
+
model.load_state_dict(loaded['model_state_dict'])
|
| 257 |
+
|
| 258 |
+
print(*compute_performance(config, model, test_loader))
|
| 259 |
+
|
| 260 |
+
|
| 261 |
+
def recase(token, label):
|
| 262 |
+
if label == case['LOWER']:
|
| 263 |
+
return token.lower()
|
| 264 |
+
elif label == case['CAPITALIZE']:
|
| 265 |
+
return token.lower().capitalize()
|
| 266 |
+
elif label == case['UPPER']:
|
| 267 |
+
return token.upper()
|
| 268 |
+
else:
|
| 269 |
+
return token
|
| 270 |
+
|
| 271 |
+
|
| 272 |
+
class CasePuncPredictor:
|
| 273 |
+
def __init__(self, checkpoint_path, lang=default_config.lang, flavor=default_config.flavor, device=default_config.device):
|
| 274 |
+
loaded = torch.load(checkpoint_path, map_location=device if torch.cuda.is_available() else 'cpu')
|
| 275 |
+
if 'config' in loaded:
|
| 276 |
+
self.config = Config(**loaded['config'])
|
| 277 |
+
else:
|
| 278 |
+
self.config = Config(lang=lang, flavor=flavor, device=device)
|
| 279 |
+
init(self.config)
|
| 280 |
+
|
| 281 |
+
self.model = Model(self.config.flavor, self.config.device)
|
| 282 |
+
self.model.load_state_dict(loaded['model_state_dict'])
|
| 283 |
+
self.model.eval()
|
| 284 |
+
self.model.to(self.config.device)
|
| 285 |
+
|
| 286 |
+
self.rev_case = {b: a for a, b in case.items()}
|
| 287 |
+
self.rev_punc = {b: a for a, b in punctuation.items()}
|
| 288 |
+
|
| 289 |
+
def tokenize(self, text):
|
| 290 |
+
return [self.config.cls_token] + self.config.tokenizer.tokenize(text) + [self.config.sep_token]
|
| 291 |
+
|
| 292 |
+
def predict(self, tokens, getter=lambda x: x):
|
| 293 |
+
max_length = self.config.max_length
|
| 294 |
+
device = self.config.device
|
| 295 |
+
if type(tokens) == str:
|
| 296 |
+
tokens = self.tokenize(tokens)
|
| 297 |
+
previous_label = punctuation['PERIOD']
|
| 298 |
+
for start in range(0, len(tokens), max_length):
|
| 299 |
+
instance = tokens[start: start + max_length]
|
| 300 |
+
if type(getter(instance[0])) == str:
|
| 301 |
+
ids = self.config.tokenizer.convert_tokens_to_ids(getter(token) for token in instance)
|
| 302 |
+
else:
|
| 303 |
+
ids = [getter(token) for token in instance]
|
| 304 |
+
if len(ids) < max_length:
|
| 305 |
+
ids += [0] * (max_length - len(ids))
|
| 306 |
+
x = torch.tensor([ids]).long().to(device)
|
| 307 |
+
y_scores1, y_scores2 = self.model(x)
|
| 308 |
+
y_pred1 = torch.max(y_scores1, 2)[1]
|
| 309 |
+
y_pred2 = torch.max(y_scores2, 2)[1]
|
| 310 |
+
for i, id, token, punc_label, case_label in zip(range(len(instance)), ids, instance, y_pred1[0].tolist()[:len(instance)], y_pred2[0].tolist()[:len(instance)]):
|
| 311 |
+
if id == self.config.cls_token_id or id == self.config.sep_token_id:
|
| 312 |
+
continue
|
| 313 |
+
if previous_label != None and previous_label > 1:
|
| 314 |
+
if case_label in [case['LOWER'], case['OTHER']]: # LOWER, OTHER
|
| 315 |
+
case_label = case['CAPITALIZE']
|
| 316 |
+
if i + start == len(tokens) - 2 and punc_label == punctuation['O']:
|
| 317 |
+
punc_label = punctuation['PERIOD']
|
| 318 |
+
yield (token, self.rev_case[case_label], self.rev_punc[punc_label])
|
| 319 |
+
previous_label = punc_label
|
| 320 |
+
|
| 321 |
+
def map_case_label(self, token, case_label):
|
| 322 |
+
if token.endswith('</w>'):
|
| 323 |
+
token = token[:-4]
|
| 324 |
+
if token.startswith('##'):
|
| 325 |
+
token = token[2:]
|
| 326 |
+
return recase(token, case[case_label])
|
| 327 |
+
|
| 328 |
+
def map_punc_label(self, token, punc_label):
|
| 329 |
+
if token.endswith('</w>'):
|
| 330 |
+
token = token[:-4]
|
| 331 |
+
if token.startswith('##'):
|
| 332 |
+
token = token[2:]
|
| 333 |
+
return token + punctuation_syms[punctuation[punc_label]]
|
| 334 |
+
|
| 335 |
+
|
| 336 |
+
|
| 337 |
+
def generate_predictions(config, checkpoint_path):
|
| 338 |
+
loaded = torch.load(checkpoint_path, map_location=config.device if torch.cuda.is_available() else 'cpu')
|
| 339 |
+
if 'config' in loaded:
|
| 340 |
+
config = Config(**loaded['config'])
|
| 341 |
+
init(config)
|
| 342 |
+
|
| 343 |
+
model = Model(config.flavor, config.device)
|
| 344 |
+
model.load_state_dict(loaded['model_state_dict'])
|
| 345 |
+
|
| 346 |
+
rev_case = {b: a for a, b in case.items()}
|
| 347 |
+
rev_punc = {b: a for a, b in punctuation.items()}
|
| 348 |
+
|
| 349 |
+
for line in sys.stdin:
|
| 350 |
+
# also drop punctuation that we may generate
|
| 351 |
+
line = ''.join([c for c in line if c not in mapped_punctuation])
|
| 352 |
+
if config.debug:
|
| 353 |
+
print(line)
|
| 354 |
+
tokens = [config.cls_token] + config.tokenizer.tokenize(line) + [config.sep_token]
|
| 355 |
+
if config.debug:
|
| 356 |
+
print(tokens)
|
| 357 |
+
previous_label = punctuation['PERIOD']
|
| 358 |
+
first_time = True
|
| 359 |
+
was_word = False
|
| 360 |
+
for start in range(0, len(tokens), config.max_length):
|
| 361 |
+
instance = tokens[start: start + config.max_length]
|
| 362 |
+
ids = config.tokenizer.convert_tokens_to_ids(instance)
|
| 363 |
+
#print(len(ids), file=sys.stderr)
|
| 364 |
+
if len(ids) < config.max_length:
|
| 365 |
+
ids += [config.pad_token_id] * (config.max_length - len(ids))
|
| 366 |
+
x = torch.tensor([ids]).long().to(config.device)
|
| 367 |
+
y_scores1, y_scores2 = model(x)
|
| 368 |
+
y_pred1 = torch.max(y_scores1, 2)[1]
|
| 369 |
+
y_pred2 = torch.max(y_scores2, 2)[1]
|
| 370 |
+
for id, token, punc_label, case_label in zip(ids, instance, y_pred1[0].tolist()[:len(instance)], y_pred2[0].tolist()[:len(instance)]):
|
| 371 |
+
if config.debug:
|
| 372 |
+
print(id, token, punc_label, case_label, file=sys.stderr)
|
| 373 |
+
if id == config.cls_token_id or id == config.sep_token_id:
|
| 374 |
+
continue
|
| 375 |
+
if previous_label != None and previous_label > 1:
|
| 376 |
+
if case_label in [case['LOWER'], case['OTHER']]:
|
| 377 |
+
case_label = case['CAPITALIZE']
|
| 378 |
+
previous_label = punc_label
|
| 379 |
+
# different strategy due to sub-lexical token encoding in Flaubert
|
| 380 |
+
if config.lang == 'fr':
|
| 381 |
+
if token.endswith('</w>'):
|
| 382 |
+
cased_token = recase(token[:-4], case_label)
|
| 383 |
+
if was_word:
|
| 384 |
+
print(' ', end='')
|
| 385 |
+
print(cased_token + punctuation_syms[punc_label], end='')
|
| 386 |
+
was_word = True
|
| 387 |
+
else:
|
| 388 |
+
cased_token = recase(token, case_label)
|
| 389 |
+
if was_word:
|
| 390 |
+
print(' ', end='')
|
| 391 |
+
print(cased_token, end='')
|
| 392 |
+
was_word = False
|
| 393 |
+
else:
|
| 394 |
+
if token.startswith('##'):
|
| 395 |
+
cased_token = recase(token[2:], case_label)
|
| 396 |
+
print(cased_token, end='')
|
| 397 |
+
else:
|
| 398 |
+
cased_token = recase(token, case_label)
|
| 399 |
+
if not first_time:
|
| 400 |
+
print(' ', end='')
|
| 401 |
+
first_time = False
|
| 402 |
+
print(cased_token + punctuation_syms[punc_label], end='')
|
| 403 |
+
if previous_label == 0:
|
| 404 |
+
print('.', end='')
|
| 405 |
+
print()
|
| 406 |
+
|
| 407 |
+
|
| 408 |
+
def label_for_case(token):
|
| 409 |
+
token = re.sub('[^\p{Han}\p{Ll}\p{Lu}]', '', token)
|
| 410 |
+
if token == token.lower():
|
| 411 |
+
return 'LOWER'
|
| 412 |
+
elif token == token.lower().capitalize():
|
| 413 |
+
return 'CAPITALIZE'
|
| 414 |
+
elif token == token.upper():
|
| 415 |
+
return 'UPPER'
|
| 416 |
+
else:
|
| 417 |
+
return 'OTHER'
|
| 418 |
+
|
| 419 |
+
|
| 420 |
+
def make_tensors(config, input_fn, output_x_fn, output_y_fn):
|
| 421 |
+
# count file lines without loading them
|
| 422 |
+
size = 0
|
| 423 |
+
with open(input_fn) as fp:
|
| 424 |
+
for line in fp:
|
| 425 |
+
size += 1
|
| 426 |
+
|
| 427 |
+
with open(input_fn) as fp:
|
| 428 |
+
X = torch.IntTensor(size)
|
| 429 |
+
Y = torch.ByteTensor(size, 2)
|
| 430 |
+
|
| 431 |
+
offset = 0
|
| 432 |
+
for n, line in enumerate(fp):
|
| 433 |
+
word, case_label, punc_label = line.strip().split('\t')
|
| 434 |
+
id = config.tokenizer.convert_tokens_to_ids(word)
|
| 435 |
+
if config.debug:
|
| 436 |
+
assert word.lower() == tokenizer.convert_ids_to_tokens(id)
|
| 437 |
+
X[offset] = id
|
| 438 |
+
Y[offset, 0] = punctuation[punc_label]
|
| 439 |
+
Y[offset, 1] = case[case_label]
|
| 440 |
+
offset += 1
|
| 441 |
+
|
| 442 |
+
torch.save(X, output_x_fn)
|
| 443 |
+
torch.save(Y, output_y_fn)
|
| 444 |
+
|
| 445 |
+
|
| 446 |
+
mapped_punctuation = {
|
| 447 |
+
'.': 'PERIOD',
|
| 448 |
+
'...': 'PERIOD',
|
| 449 |
+
',': 'COMMA',
|
| 450 |
+
';': 'COMMA',
|
| 451 |
+
':': 'COMMA',
|
| 452 |
+
'(': 'COMMA',
|
| 453 |
+
')': 'COMMA',
|
| 454 |
+
'?': 'QUESTION',
|
| 455 |
+
'!': 'EXCLAMATION',
|
| 456 |
+
',': 'COMMA',
|
| 457 |
+
'!': 'EXCLAMATION',
|
| 458 |
+
'?': 'QUESTION',
|
| 459 |
+
';': 'COMMA',
|
| 460 |
+
':': 'COMMA',
|
| 461 |
+
'(': 'COMMA',
|
| 462 |
+
'(': 'COMMA',
|
| 463 |
+
')': 'COMMA',
|
| 464 |
+
'[': 'COMMA',
|
| 465 |
+
']': 'COMMA',
|
| 466 |
+
'【': 'COMMA',
|
| 467 |
+
'】': 'COMMA',
|
| 468 |
+
'└': 'COMMA',
|
| 469 |
+
'└ ': 'COMMA',
|
| 470 |
+
'_': 'O',
|
| 471 |
+
'。': 'PERIOD',
|
| 472 |
+
'、': 'COMMA', # enumeration comma
|
| 473 |
+
'、': 'COMMA',
|
| 474 |
+
'…': 'PERIOD',
|
| 475 |
+
'—': 'COMMA',
|
| 476 |
+
'「': 'COMMA',
|
| 477 |
+
'」': 'COMMA',
|
| 478 |
+
'.': 'PERIOD',
|
| 479 |
+
'《': 'O',
|
| 480 |
+
'》': 'O',
|
| 481 |
+
',': 'COMMA',
|
| 482 |
+
'“': 'O',
|
| 483 |
+
'”': 'O',
|
| 484 |
+
'"': 'O',
|
| 485 |
+
'-': 'O',
|
| 486 |
+
'-': 'O',
|
| 487 |
+
'〉': 'COMMA',
|
| 488 |
+
'〈': 'COMMA',
|
| 489 |
+
'↑': 'O',
|
| 490 |
+
'〔': 'COMMA',
|
| 491 |
+
'〕': 'COMMA',
|
| 492 |
+
}
|
| 493 |
+
|
| 494 |
+
def preprocess_text(config, max_token_count=-1):
|
| 495 |
+
global num_tokens_output
|
| 496 |
+
max_token_count = int(max_token_count)
|
| 497 |
+
num_tokens_output = 0
|
| 498 |
+
def process_segment(text, punctuation):
|
| 499 |
+
global num_tokens_output
|
| 500 |
+
text = text.replace('\t', ' ')
|
| 501 |
+
tokens = config.tokenizer.tokenize(text)
|
| 502 |
+
for i, token in enumerate(tokens):
|
| 503 |
+
case_label = label_for_case(token)
|
| 504 |
+
if i == len(tokens) - 1:
|
| 505 |
+
print(token.lower(), case_label, punctuation, sep='\t')
|
| 506 |
+
else:
|
| 507 |
+
print(token.lower(), case_label, 'O', sep='\t')
|
| 508 |
+
num_tokens_output += 1
|
| 509 |
+
# a bit too ugly, but alternative is to throw an exception
|
| 510 |
+
if max_token_count > 0 and num_tokens_output >= max_token_count:
|
| 511 |
+
sys.exit(0)
|
| 512 |
+
|
| 513 |
+
for line in sys.stdin:
|
| 514 |
+
line = line.strip()
|
| 515 |
+
if line != '':
|
| 516 |
+
line = unicodedata.normalize("NFC", line)
|
| 517 |
+
if config.debug:
|
| 518 |
+
print(line)
|
| 519 |
+
start = 0
|
| 520 |
+
for i, char in enumerate(line):
|
| 521 |
+
if char in mapped_punctuation:
|
| 522 |
+
if i > start and line[start: i].strip() != '':
|
| 523 |
+
process_segment(line[start: i], mapped_punctuation[char])
|
| 524 |
+
start = i + 1
|
| 525 |
+
if start < len(line):
|
| 526 |
+
process_segment(line[start:], 'PERIOD')
|
| 527 |
+
|
| 528 |
+
|
| 529 |
+
def preprocess_text_old_fr(config):
|
| 530 |
+
assert config.lang == 'fr'
|
| 531 |
+
splitsents = MosesSentenceSplitter(lang)
|
| 532 |
+
tokenize = MosesTokenizer(lang, extra=['-no-escape'])
|
| 533 |
+
normalize = MosesPunctuationNormalizer(lang)
|
| 534 |
+
|
| 535 |
+
for line in sys.stdin:
|
| 536 |
+
if line.strip() != '':
|
| 537 |
+
for sentence in splitsents([normalize(line)]):
|
| 538 |
+
tokens = tokenize(sentence)
|
| 539 |
+
previous_token = None
|
| 540 |
+
for token in tokens:
|
| 541 |
+
if token in mapped_punctuation:
|
| 542 |
+
if previous_token != None:
|
| 543 |
+
print(previous_token, mapped_punctuation[token], sep='\t')
|
| 544 |
+
previous_token = None
|
| 545 |
+
elif not re.search('[\p{Han}\p{Ll}\p{Lu}\d]', token): # remove non-alphanumeric tokens
|
| 546 |
+
continue
|
| 547 |
+
else:
|
| 548 |
+
if previous_token != None:
|
| 549 |
+
print(previous_token, 'O', sep='\t')
|
| 550 |
+
previous_token = token
|
| 551 |
+
if previous_token != None:
|
| 552 |
+
print(previous_token, 'PERIOD', sep='\t')
|
| 553 |
+
|
| 554 |
+
|
| 555 |
+
# modification of the wordpiece tokenizer to keep case information even if vocab is lower cased
|
| 556 |
+
# forked from https://github.com/huggingface/transformers/blob/master/src/transformers/models/bert/tokenization_bert.py
|
| 557 |
+
|
| 558 |
+
class WordpieceTokenizer(object):
|
| 559 |
+
"""Runs WordPiece tokenization."""
|
| 560 |
+
|
| 561 |
+
def __init__(self, vocab, unk_token, max_input_chars_per_word=100, keep_case=True):
|
| 562 |
+
self.vocab = vocab
|
| 563 |
+
self.unk_token = unk_token
|
| 564 |
+
self.max_input_chars_per_word = max_input_chars_per_word
|
| 565 |
+
self.keep_case = keep_case
|
| 566 |
+
|
| 567 |
+
def tokenize(self, text):
|
| 568 |
+
"""
|
| 569 |
+
Tokenizes a piece of text into its word pieces. This uses a greedy longest-match-first algorithm to perform
|
| 570 |
+
tokenization using the given vocabulary.
|
| 571 |
+
For example, :obj:`input = "unaffable"` wil return as output :obj:`["un", "##aff", "##able"]`.
|
| 572 |
+
Args:
|
| 573 |
+
text: A single token or whitespace separated tokens. This should have
|
| 574 |
+
already been passed through `BasicTokenizer`.
|
| 575 |
+
Returns:
|
| 576 |
+
A list of wordpiece tokens.
|
| 577 |
+
"""
|
| 578 |
+
|
| 579 |
+
output_tokens = []
|
| 580 |
+
for token in text.strip().split():
|
| 581 |
+
chars = list(token)
|
| 582 |
+
if len(chars) > self.max_input_chars_per_word:
|
| 583 |
+
output_tokens.append(self.unk_token)
|
| 584 |
+
continue
|
| 585 |
+
|
| 586 |
+
is_bad = False
|
| 587 |
+
start = 0
|
| 588 |
+
sub_tokens = []
|
| 589 |
+
while start < len(chars):
|
| 590 |
+
end = len(chars)
|
| 591 |
+
cur_substr = None
|
| 592 |
+
while start < end:
|
| 593 |
+
substr = "".join(chars[start:end])
|
| 594 |
+
if start > 0:
|
| 595 |
+
substr = "##" + substr
|
| 596 |
+
# optionaly lowercase substring before checking for inclusion in vocab
|
| 597 |
+
if (self.keep_case and substr.lower() in self.vocab) or (substr in self.vocab):
|
| 598 |
+
cur_substr = substr
|
| 599 |
+
break
|
| 600 |
+
end -= 1
|
| 601 |
+
if cur_substr is None:
|
| 602 |
+
is_bad = True
|
| 603 |
+
break
|
| 604 |
+
sub_tokens.append(cur_substr)
|
| 605 |
+
start = end
|
| 606 |
+
|
| 607 |
+
if is_bad:
|
| 608 |
+
output_tokens.append(self.unk_token)
|
| 609 |
+
else:
|
| 610 |
+
output_tokens.extend(sub_tokens)
|
| 611 |
+
return output_tokens
|
| 612 |
+
|
| 613 |
+
|
| 614 |
+
# modification of XLM bpe tokenizer for keeping case information when vocab is lowercase
|
| 615 |
+
# forked from https://github.com/huggingface/transformers/blob/cd56f3fe7eae4a53a9880e3f5e8f91877a78271c/src/transformers/models/xlm/tokenization_xlm.py
|
| 616 |
+
def bpe(self, token):
|
| 617 |
+
def to_lower(pair):
|
| 618 |
+
#print(' ',pair)
|
| 619 |
+
return (pair[0].lower(), pair[1].lower())
|
| 620 |
+
|
| 621 |
+
from transformers.models.xlm.tokenization_xlm import get_pairs
|
| 622 |
+
|
| 623 |
+
word = tuple(token[:-1]) + (token[-1] + "</w>",)
|
| 624 |
+
if token in self.cache:
|
| 625 |
+
return self.cache[token]
|
| 626 |
+
pairs = get_pairs(word)
|
| 627 |
+
|
| 628 |
+
if not pairs:
|
| 629 |
+
return token + "</w>"
|
| 630 |
+
|
| 631 |
+
while True:
|
| 632 |
+
bigram = min(pairs, key=lambda pair: self.bpe_ranks.get(to_lower(pair), float("inf")))
|
| 633 |
+
#print(bigram)
|
| 634 |
+
if to_lower(bigram) not in self.bpe_ranks:
|
| 635 |
+
break
|
| 636 |
+
first, second = bigram
|
| 637 |
+
new_word = []
|
| 638 |
+
i = 0
|
| 639 |
+
while i < len(word):
|
| 640 |
+
try:
|
| 641 |
+
j = word.index(first, i)
|
| 642 |
+
except ValueError:
|
| 643 |
+
new_word.extend(word[i:])
|
| 644 |
+
break
|
| 645 |
+
else:
|
| 646 |
+
new_word.extend(word[i:j])
|
| 647 |
+
i = j
|
| 648 |
+
|
| 649 |
+
if word[i] == first and i < len(word) - 1 and word[i + 1] == second:
|
| 650 |
+
new_word.append(first + second)
|
| 651 |
+
i += 2
|
| 652 |
+
else:
|
| 653 |
+
new_word.append(word[i])
|
| 654 |
+
i += 1
|
| 655 |
+
new_word = tuple(new_word)
|
| 656 |
+
word = new_word
|
| 657 |
+
if len(word) == 1:
|
| 658 |
+
break
|
| 659 |
+
else:
|
| 660 |
+
pairs = get_pairs(word)
|
| 661 |
+
word = " ".join(word)
|
| 662 |
+
if word == "\n </w>":
|
| 663 |
+
word = "\n</w>"
|
| 664 |
+
self.cache[token] = word
|
| 665 |
+
return word
|
| 666 |
+
|
| 667 |
+
|
| 668 |
+
|
| 669 |
+
def init(config):
|
| 670 |
+
init_random(config.seed)
|
| 671 |
+
|
| 672 |
+
if config.lang == 'fr':
|
| 673 |
+
config.tokenizer = tokenizer = AutoTokenizer.from_pretrained(config.flavor, do_lower_case=False)
|
| 674 |
+
|
| 675 |
+
from transformers.models.xlm.tokenization_xlm import XLMTokenizer
|
| 676 |
+
assert isinstance(tokenizer, XLMTokenizer)
|
| 677 |
+
|
| 678 |
+
# monkey patch XLM tokenizer
|
| 679 |
+
import types
|
| 680 |
+
tokenizer.bpe = types.MethodType(bpe, tokenizer)
|
| 681 |
+
else:
|
| 682 |
+
# warning: needs to be BertTokenizer for monkey patching to work
|
| 683 |
+
config.tokenizer = tokenizer = BertTokenizer.from_pretrained(config.flavor, do_lower_case=False)
|
| 684 |
+
|
| 685 |
+
# warning: monkey patch tokenizer to keep case information
|
| 686 |
+
#from recasing_tokenizer import WordpieceTokenizer
|
| 687 |
+
config.tokenizer.wordpiece_tokenizer = WordpieceTokenizer(vocab=tokenizer.vocab, unk_token=tokenizer.unk_token)
|
| 688 |
+
|
| 689 |
+
if config.lang == 'fr':
|
| 690 |
+
config.pad_token_id = tokenizer.pad_token_id
|
| 691 |
+
config.cls_token_id = tokenizer.bos_token_id
|
| 692 |
+
config.cls_token = tokenizer.bos_token
|
| 693 |
+
config.sep_token_id = tokenizer.sep_token_id
|
| 694 |
+
config.sep_token = tokenizer.sep_token
|
| 695 |
+
else:
|
| 696 |
+
config.pad_token_id = tokenizer.pad_token_id
|
| 697 |
+
config.cls_token_id = tokenizer.cls_token_id
|
| 698 |
+
config.cls_token = tokenizer.cls_token
|
| 699 |
+
config.sep_token_id = tokenizer.sep_token_id
|
| 700 |
+
config.sep_token = tokenizer.sep_token
|
| 701 |
+
|
| 702 |
+
if not torch.cuda.is_available() and config.device == 'cuda':
|
| 703 |
+
print('WARNING: reverting to cpu as cuda is not available', file=sys.stderr)
|
| 704 |
+
config.device = torch.device(config.device if torch.cuda.is_available() else 'cpu')
|
| 705 |
+
|
| 706 |
+
|
| 707 |
+
def main(config, action, args):
|
| 708 |
+
init(config)
|
| 709 |
+
|
| 710 |
+
if action == 'train':
|
| 711 |
+
train(config, *args)
|
| 712 |
+
elif action == 'eval':
|
| 713 |
+
run_eval(config, *args)
|
| 714 |
+
elif action == 'predict':
|
| 715 |
+
generate_predictions(config, *args)
|
| 716 |
+
elif action == 'tensorize':
|
| 717 |
+
make_tensors(config, *args)
|
| 718 |
+
elif action == 'preprocess':
|
| 719 |
+
preprocess_text(config, *args)
|
| 720 |
+
else:
|
| 721 |
+
print('invalid action "%s"' % action)
|
| 722 |
+
sys.exit(1)
|
| 723 |
+
|
| 724 |
+
if __name__ == '__main__':
|
| 725 |
+
parser = argparse.ArgumentParser()
|
| 726 |
+
parser.add_argument("action", help="train|eval|predict|tensorize|preprocess", type=str)
|
| 727 |
+
parser.add_argument("action_args", help="arguments for selected action", type=str, nargs='*')
|
| 728 |
+
parser.add_argument("--seed", help="random seed", default=default_config.seed, type=int)
|
| 729 |
+
parser.add_argument("--lang", help="language (fr, en, zh)", default=default_config.lang, type=str)
|
| 730 |
+
parser.add_argument("--flavor", help="bert flavor in transformers model zoo", default=default_config.flavor, type=str)
|
| 731 |
+
parser.add_argument("--max-length", help="maximum input length", default=default_config.max_length, type=int)
|
| 732 |
+
parser.add_argument("--batch-size", help="size of batches", default=default_config.batch_size, type=int)
|
| 733 |
+
parser.add_argument("--device", help="computation device (cuda, cpu)", default=default_config.device, type=str)
|
| 734 |
+
parser.add_argument("--debug", help="whether to output more debug info", default=default_config.debug, type=bool)
|
| 735 |
+
parser.add_argument("--updates", help="number of training updates to perform", default=default_config.updates, type=bool)
|
| 736 |
+
parser.add_argument("--period", help="validation period in updates", default=default_config.period, type=bool)
|
| 737 |
+
parser.add_argument("--lr", help="learning rate", default=default_config.lr, type=bool)
|
| 738 |
+
parser.add_argument("--dab-rate", help="drop at boundaries rate", default=default_config.dab_rate, type=bool)
|
| 739 |
+
config = Config(**parser.parse_args().__dict__)
|
| 740 |
+
|
| 741 |
+
main(config, config.action, config.action_args)
|
| 742 |
+
|
| 743 |
+
|
punctuation/vosk-recasepunc-ru-0.22/ru-test.txt
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
все смешалось в доме облонских жена узнала что муж был в связи с бывшею
|
| 2 |
+
в их доме француженкою-гувернанткой и объявила мужу что не может жить с
|
| 3 |
+
ним в одном доме положение это продолжалось уже третий день и мучительно
|
| 4 |
+
чувствовалось и самими супругами и всеми членами семьи и домочадцами
|
| 5 |
+
все члены семьи и домочадцы чувствовали что нет смысла в их сожительстве
|
| 6 |
+
и что на каждом постоялом дворе случайно сошедшиеся люди более связаны
|
| 7 |
+
между собой чем они члены семьи и домочадцы облонских жена не выходила
|
| 8 |
+
из своих комнат мужа третий день не было дома дети бегали по всему
|
| 9 |
+
дому как потерянные англичанка поссорилась с экономкой и написала
|
| 10 |
+
записку приятельнице прося приискать ей новое место повар ушел еще
|
| 11 |
+
вчера со двора во время обеда черная кухарка и кучер просили расчета
|
| 12 |
+
На третий день после ссоры князь степан аркадьич облонский стива как
|
| 13 |
+
его звали в свете в обычный час то есть в восемь часов утра
|
| 14 |
+
проснулся не в спальне жены а в своем кабинете на сафьянном диване
|
| 15 |
+
он повернул свое полное выхоленное тело на пружинах дивана как бы желая
|
| 16 |
+
опять заснуть надолго с другой стороны крепко обнял подушку и прижался к
|
| 17 |
+
ней щекой но вдруг вскочил сел на диван и открыл глаза
|
punctuation/vosk-recasepunc-ru-0.22/ru-test.txt.orig
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Все смешалось в доме Облонских. Жена узнала, что муж был в связи с бывшею
|
| 2 |
+
в их доме француженкою-гувернанткой, и объявила мужу, что не может жить с
|
| 3 |
+
ним в одном доме. Положение это продолжалось уже третий день и мучительно
|
| 4 |
+
чувствовалось и самими супругами, и всеми членами семьи, и домочадцами.
|
| 5 |
+
Все члены семьи и домочадцы чувствовали, что нет смысла в их сожительстве
|
| 6 |
+
и что на каждом постоялом дворе случайно сошедшиеся люди более связаны
|
| 7 |
+
между собой, чем они, члены семьи и домочадцы Облонских. Жена не выходила
|
| 8 |
+
из своих комнат, мужа третий день не было дома. Дети бегали по всему
|
| 9 |
+
дому, как потерянные; англичанка поссорилась с экономкой и написала
|
| 10 |
+
записку приятельнице, прося приискать ей новое место; повар ушел еще
|
| 11 |
+
вчера со двора, во время обеда; черная кухарка и кучер просили расчета.
|
| 12 |
+
На третий день после ссоры князь Степан Аркадьич Облонский -- Стива, как
|
| 13 |
+
его звали в свете, -- в обычный час, то есть в восемь часов утра,
|
| 14 |
+
проснулся не в спальне жены, а в своем кабинете, на сафьянном диване...
|
| 15 |
+
Он повернул свое полное, выхоленное тело на пружинах дивана, как бы желая
|
| 16 |
+
опять заснуть надолго, с другой стороны крепко обнял подушку и прижался к
|
| 17 |
+
ней щекой; но вдруг вскочил, сел на диван и открыл глаза.
|
speaker_indentification/vosk-model-spk-0.4.7z
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:e4c7ccb7760ffc2ccb780beac3ba40907728c075fbb1cbb66b4dacc0afda4598
|
| 3 |
+
size 13785421
|
speaker_indentification/vosk-model-spk-0.4/README.txt
ADDED
|
@@ -0,0 +1,119 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
UPLOADER David Snyder
|
| 3 |
+
DATE 2018-05-30
|
| 4 |
+
KALDI VERSION 108832d
|
| 5 |
+
|
| 6 |
+
This directory contains files generated from the recipe in
|
| 7 |
+
egs/callhome_diarization/v2/. It's contents should be placed in a similar
|
| 8 |
+
directory, with symbolic links to diarization/, sid/, steps/, etc. This was
|
| 9 |
+
created when Kaldi's master branch was at git log
|
| 10 |
+
2ad8d7821867a199e435aa36bbd13af6ed937c94.
|
| 11 |
+
|
| 12 |
+
|
| 13 |
+
I. Files list
|
| 14 |
+
------------------------------------------------------------------------------
|
| 15 |
+
|
| 16 |
+
./
|
| 17 |
+
README.txt This file
|
| 18 |
+
run.sh A copy of the egs/callhome_diarization/v2/run.sh
|
| 19 |
+
at the time of uploading this file. Use this to
|
| 20 |
+
figure out how to compute features, extract
|
| 21 |
+
embeddings, etc.
|
| 22 |
+
|
| 23 |
+
local/nnet3/xvector/tuning/
|
| 24 |
+
run_xvector_1a.sh This is the default recipe, at the time of
|
| 25 |
+
uploading this resource. The script generates
|
| 26 |
+
the configs, egs, and trains the model.
|
| 27 |
+
|
| 28 |
+
conf/
|
| 29 |
+
vad.conf The energy-based VAD configuration
|
| 30 |
+
mfcc.conf MFCC configuration
|
| 31 |
+
|
| 32 |
+
exp/xvector_nnet_1a/
|
| 33 |
+
final.raw The pretrained DNN model
|
| 34 |
+
nnet.config The nnet3 config file that was used when the
|
| 35 |
+
DNN model was first instantiated.
|
| 36 |
+
extract.config Another nnet3 config file that modifies the DNN
|
| 37 |
+
final.raw to extract x-vectors. It should be
|
| 38 |
+
automatically handled by the script
|
| 39 |
+
extract_xvectors.sh.
|
| 40 |
+
min_chunk_size Min chunk size used (see extract_xvectors.sh)
|
| 41 |
+
max_chunk_size Max chunk size used (see extract_xvectors.sh)
|
| 42 |
+
srand The RNG seed used when creating the DNN
|
| 43 |
+
|
| 44 |
+
exp/xvectors_callhome1/
|
| 45 |
+
mean.vec Vector for centering, from callhome1
|
| 46 |
+
transform.mat Whitening matrix, trained on callhome1
|
| 47 |
+
plda PLDA model for callhome1, trained on SRE data
|
| 48 |
+
|
| 49 |
+
exp/xvectors_callhome2/
|
| 50 |
+
mean.vec Vector for centering, from callhome2
|
| 51 |
+
transform.mat Whitening matrix, trained on callhome2
|
| 52 |
+
plda PLDA model for callhome1, trained on SRE data
|
| 53 |
+
|
| 54 |
+
|
| 55 |
+
II. Citation
|
| 56 |
+
------------------------------------------------------------------------------
|
| 57 |
+
|
| 58 |
+
If you wish to use this architecture in a publication, please cite one of the
|
| 59 |
+
following papers.
|
| 60 |
+
|
| 61 |
+
The x-vector architecture:
|
| 62 |
+
|
| 63 |
+
@inproceedings{snyder2018xvector,
|
| 64 |
+
title={X-vectors: Robust DNN Embeddings for Speaker Recognition},
|
| 65 |
+
author={Snyder, D. and Garcia-Romero, D. and Sell, G. and Povey, D. and Khudanpur, S.},
|
| 66 |
+
booktitle={2018 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP)},
|
| 67 |
+
year={2018},
|
| 68 |
+
organization={IEEE},
|
| 69 |
+
url={http://www.danielpovey.com/files/2018_icassp_xvectors.pdf}
|
| 70 |
+
}
|
| 71 |
+
|
| 72 |
+
Diarization with x-vectors:
|
| 73 |
+
|
| 74 |
+
@article{sell2018dihard,
|
| 75 |
+
title={Diarization is Hard: Some Experiences and Lessons Learned for the JHU Team in the Inaugural DIHARD Challenge},
|
| 76 |
+
author={Sell, G. and Snyder, D. and McCree, A. and Garcia-Romero, D. and Villalba, J. and Maciejewski, M. and Manohar, V. and Dehak, N. and Povey, D. and Watanabe, S. and Khudanpur, J.},
|
| 77 |
+
journal={Interspeech},
|
| 78 |
+
year={2018}
|
| 79 |
+
}
|
| 80 |
+
|
| 81 |
+
|
| 82 |
+
III. Recipe README.txt
|
| 83 |
+
------------------------------------------------------------------------------
|
| 84 |
+
The following text is the README.txt from egs/callhome_diarization/v2 at the
|
| 85 |
+
time this archive was created.
|
| 86 |
+
|
| 87 |
+
This recipe replaces i-vectors used in the v1 recipe with embeddings extracted
|
| 88 |
+
from a deep neural network. In the scripts, we refer to these embeddings as
|
| 89 |
+
"x-vectors." The x-vector recipe in
|
| 90 |
+
local/nnet3/xvector/tuning/run_xvector_1a.sh is closesly based on the
|
| 91 |
+
following paper:
|
| 92 |
+
|
| 93 |
+
However, in this example, the x-vectors are used for diarization, rather
|
| 94 |
+
than speaker recognition. Diarization is performed by splitting speech
|
| 95 |
+
segments into very short segments (e.g., 1.5 seconds), extracting embeddings
|
| 96 |
+
from the segments, and clustering them to obtain speaker labels.
|
| 97 |
+
|
| 98 |
+
The recipe uses the following data for system development. This is in
|
| 99 |
+
addition to the NIST SRE 2000 dataset (Callhome) which is used for
|
| 100 |
+
evaluation (see ../README.txt).
|
| 101 |
+
|
| 102 |
+
Corpus LDC Catalog No.
|
| 103 |
+
SRE2004 LDC2006S44
|
| 104 |
+
SRE2005 Train LDC2011S01
|
| 105 |
+
SRE2005 Test LDC2011S04
|
| 106 |
+
SRE2006 Train LDC2011S09
|
| 107 |
+
SRE2006 Test 1 LDC2011S10
|
| 108 |
+
SRE2006 Test 2 LDC2012S01
|
| 109 |
+
SRE2008 Train LDC2011S05
|
| 110 |
+
SRE2008 Test LDC2011S08
|
| 111 |
+
SWBD2 Phase 2 LDC99S79
|
| 112 |
+
SWBD2 Phase 3 LDC2002S06
|
| 113 |
+
SWBD Cellular 1 LDC2001S13
|
| 114 |
+
SWBD Cellular 2 LDC2004S07
|
| 115 |
+
|
| 116 |
+
The following datasets are used in data augmentation.
|
| 117 |
+
|
| 118 |
+
MUSAN http://www.openslr.org/17
|
| 119 |
+
RIR_NOISES http://www.openslr.org/28
|
speaker_indentification/vosk-model-spk-0.4/final.ext.raw
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:d30354474ac719b3cfce58186463302b988cf22ce3afee7237a2da862c4a91d1
|
| 3 |
+
size 14929171
|
speaker_indentification/vosk-model-spk-0.4/mean.vec
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
[ 4.450152 4.672029 4.148891 -1.711527 3.509846 2.931994 2.850384 3.178227 0.2563171 -0.9261234 3.37196 0.1472566 5.635284 -0.01870821 1.972103 -0.9502754 4.401544 2.795261 2.67637 3.917823 0.6549923 -0.02103148 4.064806 4.100016 3.700118 1.252804 5.399523 4.084152 4.106742 3.5622 4.165306 -0.2494654 -0.9603948 4.272289 -2.332889 -0.7292819 3.646834 0.3090337 4.624666 5.089351 -5.635771 1.634198 1.089098 4.363739 3.618721 0.2134228 -0.3965465 5.353687 4.034757 4.032773 3.749556 3.166129 3.868708 4.381798 -0.02561651 0.3426051 4.402168 0.1237091 0.8197291 3.809948 -2.995811 -1.648535 3.202967 3.239381 3.250949 -0.9064079 4.452719 0.2775586 0.80832 3.036884 5.163679 0.4273587 3.537773 2.539269 3.151272 4.064805 3.56104 4.244997 3.660802 4.949434 4.013721 1.418729 1.845101 4.74059 3.280786 -1.731479 1.492544 -2.88268 5.013491 5.327713 -2.668042 1.02902 -0.9622369 3.954224 3.2533 3.348548 2.906777 -0.3059559 4.595854 0.3410174 2.116138 4.830284 3.402886 3.014466 4.481457 5.14358 2.05649 3.883894 -0.9075359 4.574888 4.064843 -1.416883 3.493051 -0.06792944 4.978102 4.930044 4.138368 2.826191 4.031521 2.575887 0.7125556 4.15551 2.601444 1.190357 -1.060124 0.9739355 4.671662 -1.613742 ]
|
speaker_indentification/vosk-model-spk-0.4/mfcc.conf
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
--sample-frequency=8000
|
| 2 |
+
--high-freq=3700
|
| 3 |
+
--low-freq=20
|
| 4 |
+
--num-ceps=23
|
| 5 |
+
--allow-downsample=true
|
speaker_indentification/vosk-model-spk-0.4/transform.mat
ADDED
|
Binary file (65.6 kB). View file
|
|
|
stt/ar-tn/vosk-model-ar-tn-0.1-linto.7z
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:fbc732138daa652b316f3b7093493f611406c7970ecfc63388ff805c6fd9ea15
|
| 3 |
+
size 363236555
|
stt/ar-tn/vosk-model-ar-tn-0.1-linto/am/cmvn_opts
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
--norm-means=false --norm-vars=false
|
stt/ar-tn/vosk-model-ar-tn-0.1-linto/am/final.ie.id
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
0084a8987dd3b241beabb01efcc32e17
|
stt/ar-tn/vosk-model-ar-tn-0.1-linto/am/final.mdl
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:9462fea3133f2b3ef672df2cabffb749f5eedf49427bff7bedd3457a9dfd7da3
|
| 3 |
+
size 77422160
|
stt/ar-tn/vosk-model-ar-tn-0.1-linto/am/frame_subsampling_factor
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
3
|
stt/ar-tn/vosk-model-ar-tn-0.1-linto/am/num_jobs
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
4
|
stt/ar-tn/vosk-model-ar-tn-0.1-linto/am/phones.txt
ADDED
|
@@ -0,0 +1,302 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<eps> 0
|
| 2 |
+
SIL 1
|
| 3 |
+
SIL_B 2
|
| 4 |
+
SIL_E 3
|
| 5 |
+
SIL_I 4
|
| 6 |
+
SIL_S 5
|
| 7 |
+
A$_B 6
|
| 8 |
+
A$_E 7
|
| 9 |
+
A$_I 8
|
| 10 |
+
A$_S 9
|
| 11 |
+
A&_B 10
|
| 12 |
+
A&_E 11
|
| 13 |
+
A&_I 12
|
| 14 |
+
A&_S 13
|
| 15 |
+
A'_B 14
|
| 16 |
+
A'_E 15
|
| 17 |
+
A'_I 16
|
| 18 |
+
A'_S 17
|
| 19 |
+
A<_B 18
|
| 20 |
+
A<_E 19
|
| 21 |
+
A<_I 20
|
| 22 |
+
A<_S 21
|
| 23 |
+
A>_B 22
|
| 24 |
+
A>_E 23
|
| 25 |
+
A>_I 24
|
| 26 |
+
A>_S 25
|
| 27 |
+
AA_B 26
|
| 28 |
+
AA_E 27
|
| 29 |
+
AA_I 28
|
| 30 |
+
AA_S 29
|
| 31 |
+
AD_B 30
|
| 32 |
+
AD_E 31
|
| 33 |
+
AD_I 32
|
| 34 |
+
AD_S 33
|
| 35 |
+
AE_B 34
|
| 36 |
+
AE_E 35
|
| 37 |
+
AE_I 36
|
| 38 |
+
AE_S 37
|
| 39 |
+
AH_B 38
|
| 40 |
+
AH_E 39
|
| 41 |
+
AH_I 40
|
| 42 |
+
AH_S 41
|
| 43 |
+
AS_B 42
|
| 44 |
+
AS_E 43
|
| 45 |
+
AS_I 44
|
| 46 |
+
AS_S 45
|
| 47 |
+
AT_B 46
|
| 48 |
+
AT_E 47
|
| 49 |
+
AT_I 48
|
| 50 |
+
AT_S 49
|
| 51 |
+
AV_B 50
|
| 52 |
+
AV_E 51
|
| 53 |
+
AV_I 52
|
| 54 |
+
AV_S 53
|
| 55 |
+
AY_B 54
|
| 56 |
+
AY_E 55
|
| 57 |
+
AY_I 56
|
| 58 |
+
AY_S 57
|
| 59 |
+
AZ_B 58
|
| 60 |
+
AZ_E 59
|
| 61 |
+
AZ_I 60
|
| 62 |
+
AZ_S 61
|
| 63 |
+
Ab_B 62
|
| 64 |
+
Ab_E 63
|
| 65 |
+
Ab_I 64
|
| 66 |
+
Ab_S 65
|
| 67 |
+
Ad_B 66
|
| 68 |
+
Ad_E 67
|
| 69 |
+
Ad_I 68
|
| 70 |
+
Ad_S 69
|
| 71 |
+
Af_B 70
|
| 72 |
+
Af_E 71
|
| 73 |
+
Af_I 72
|
| 74 |
+
Af_S 73
|
| 75 |
+
Ag_B 74
|
| 76 |
+
Ag_E 75
|
| 77 |
+
Ag_I 76
|
| 78 |
+
Ag_S 77
|
| 79 |
+
Ah_B 78
|
| 80 |
+
Ah_E 79
|
| 81 |
+
Ah_I 80
|
| 82 |
+
Ah_S 81
|
| 83 |
+
Aj_B 82
|
| 84 |
+
Aj_E 83
|
| 85 |
+
Aj_I 84
|
| 86 |
+
Aj_S 85
|
| 87 |
+
Ak_B 86
|
| 88 |
+
Ak_E 87
|
| 89 |
+
Ak_I 88
|
| 90 |
+
Ak_S 89
|
| 91 |
+
Al_B 90
|
| 92 |
+
Al_E 91
|
| 93 |
+
Al_I 92
|
| 94 |
+
Al_S 93
|
| 95 |
+
Am_B 94
|
| 96 |
+
Am_E 95
|
| 97 |
+
Am_I 96
|
| 98 |
+
Am_S 97
|
| 99 |
+
An_B 98
|
| 100 |
+
An_E 99
|
| 101 |
+
An_I 100
|
| 102 |
+
An_S 101
|
| 103 |
+
Ap_B 102
|
| 104 |
+
Ap_E 103
|
| 105 |
+
Ap_I 104
|
| 106 |
+
Ap_S 105
|
| 107 |
+
Aq_B 106
|
| 108 |
+
Aq_E 107
|
| 109 |
+
Aq_I 108
|
| 110 |
+
Aq_S 109
|
| 111 |
+
Ar_B 110
|
| 112 |
+
Ar_E 111
|
| 113 |
+
Ar_I 112
|
| 114 |
+
Ar_S 113
|
| 115 |
+
As_B 114
|
| 116 |
+
As_E 115
|
| 117 |
+
As_I 116
|
| 118 |
+
As_S 117
|
| 119 |
+
At_B 118
|
| 120 |
+
At_E 119
|
| 121 |
+
At_I 120
|
| 122 |
+
At_S 121
|
| 123 |
+
Av_B 122
|
| 124 |
+
Av_E 123
|
| 125 |
+
Av_I 124
|
| 126 |
+
Av_S 125
|
| 127 |
+
Aw_B 126
|
| 128 |
+
Aw_E 127
|
| 129 |
+
Aw_I 128
|
| 130 |
+
Aw_S 129
|
| 131 |
+
Ax_B 130
|
| 132 |
+
Ax_E 131
|
| 133 |
+
Ax_I 132
|
| 134 |
+
Ax_S 133
|
| 135 |
+
Ay_B 134
|
| 136 |
+
Ay_E 135
|
| 137 |
+
Ay_I 136
|
| 138 |
+
Ay_S 137
|
| 139 |
+
Az_B 138
|
| 140 |
+
Az_E 139
|
| 141 |
+
Az_I 140
|
| 142 |
+
Az_S 141
|
| 143 |
+
A|_B 142
|
| 144 |
+
A|_E 143
|
| 145 |
+
A|_I 144
|
| 146 |
+
A|_S 145
|
| 147 |
+
A}_B 146
|
| 148 |
+
A}_E 147
|
| 149 |
+
A}_I 148
|
| 150 |
+
A}_S 149
|
| 151 |
+
L'_B 150
|
| 152 |
+
L'_E 151
|
| 153 |
+
L'_I 152
|
| 154 |
+
L'_S 153
|
| 155 |
+
La_B 154
|
| 156 |
+
La_E 155
|
| 157 |
+
La_I 156
|
| 158 |
+
La_S 157
|
| 159 |
+
Lb_B 158
|
| 160 |
+
Lb_E 159
|
| 161 |
+
Lb_I 160
|
| 162 |
+
Lb_S 161
|
| 163 |
+
Lc_B 162
|
| 164 |
+
Lc_E 163
|
| 165 |
+
Lc_I 164
|
| 166 |
+
Lc_S 165
|
| 167 |
+
Ld_B 166
|
| 168 |
+
Ld_E 167
|
| 169 |
+
Ld_I 168
|
| 170 |
+
Ld_S 169
|
| 171 |
+
Le_B 170
|
| 172 |
+
Le_E 171
|
| 173 |
+
Le_I 172
|
| 174 |
+
Le_S 173
|
| 175 |
+
Lf_B 174
|
| 176 |
+
Lf_E 175
|
| 177 |
+
Lf_I 176
|
| 178 |
+
Lf_S 177
|
| 179 |
+
Lg_B 178
|
| 180 |
+
Lg_E 179
|
| 181 |
+
Lg_I 180
|
| 182 |
+
Lg_S 181
|
| 183 |
+
Lh_B 182
|
| 184 |
+
Lh_E 183
|
| 185 |
+
Lh_I 184
|
| 186 |
+
Lh_S 185
|
| 187 |
+
Li_B 186
|
| 188 |
+
Li_E 187
|
| 189 |
+
Li_I 188
|
| 190 |
+
Li_S 189
|
| 191 |
+
Lj_B 190
|
| 192 |
+
Lj_E 191
|
| 193 |
+
Lj_I 192
|
| 194 |
+
Lj_S 193
|
| 195 |
+
Lk_B 194
|
| 196 |
+
Lk_E 195
|
| 197 |
+
Lk_I 196
|
| 198 |
+
Lk_S 197
|
| 199 |
+
Ll_B 198
|
| 200 |
+
Ll_E 199
|
| 201 |
+
Ll_I 200
|
| 202 |
+
Ll_S 201
|
| 203 |
+
Lm_B 202
|
| 204 |
+
Lm_E 203
|
| 205 |
+
Lm_I 204
|
| 206 |
+
Lm_S 205
|
| 207 |
+
Ln_B 206
|
| 208 |
+
Ln_E 207
|
| 209 |
+
Ln_I 208
|
| 210 |
+
Ln_S 209
|
| 211 |
+
Lo_B 210
|
| 212 |
+
Lo_E 211
|
| 213 |
+
Lo_I 212
|
| 214 |
+
Lo_S 213
|
| 215 |
+
Lp_B 214
|
| 216 |
+
Lp_E 215
|
| 217 |
+
Lp_I 216
|
| 218 |
+
Lp_S 217
|
| 219 |
+
Lq_B 218
|
| 220 |
+
Lq_E 219
|
| 221 |
+
Lq_I 220
|
| 222 |
+
Lq_S 221
|
| 223 |
+
Lr_B 222
|
| 224 |
+
Lr_E 223
|
| 225 |
+
Lr_I 224
|
| 226 |
+
Lr_S 225
|
| 227 |
+
Ls_B 226
|
| 228 |
+
Ls_E 227
|
| 229 |
+
Ls_I 228
|
| 230 |
+
Ls_S 229
|
| 231 |
+
Lt_B 230
|
| 232 |
+
Lt_E 231
|
| 233 |
+
Lt_I 232
|
| 234 |
+
Lt_S 233
|
| 235 |
+
Lu_B 234
|
| 236 |
+
Lu_E 235
|
| 237 |
+
Lu_I 236
|
| 238 |
+
Lu_S 237
|
| 239 |
+
Lv_B 238
|
| 240 |
+
Lv_E 239
|
| 241 |
+
Lv_I 240
|
| 242 |
+
Lv_S 241
|
| 243 |
+
Lw_B 242
|
| 244 |
+
Lw_E 243
|
| 245 |
+
Lw_I 244
|
| 246 |
+
Lw_S 245
|
| 247 |
+
Lx_B 246
|
| 248 |
+
Lx_E 247
|
| 249 |
+
Lx_I 248
|
| 250 |
+
Lx_S 249
|
| 251 |
+
Ly_B 250
|
| 252 |
+
Ly_E 251
|
| 253 |
+
Ly_I 252
|
| 254 |
+
Ly_S 253
|
| 255 |
+
Lz_B 254
|
| 256 |
+
Lz_E 255
|
| 257 |
+
Lz_I 256
|
| 258 |
+
Lz_S 257
|
| 259 |
+
ae_B 258
|
| 260 |
+
ae_E 259
|
| 261 |
+
ae_I 260
|
| 262 |
+
ae_S 261
|
| 263 |
+
cc_B 262
|
| 264 |
+
cc_E 263
|
| 265 |
+
cc_I 264
|
| 266 |
+
cc_S 265
|
| 267 |
+
ga_B 266
|
| 268 |
+
ga_E 267
|
| 269 |
+
ga_I 268
|
| 270 |
+
ga_S 269
|
| 271 |
+
ge_B 270
|
| 272 |
+
ge_E 271
|
| 273 |
+
ge_I 272
|
| 274 |
+
ge_S 273
|
| 275 |
+
gu_B 274
|
| 276 |
+
gu_E 275
|
| 277 |
+
gu_I 276
|
| 278 |
+
gu_S 277
|
| 279 |
+
ha_B 278
|
| 280 |
+
ha_E 279
|
| 281 |
+
ha_I 280
|
| 282 |
+
ha_S 281
|
| 283 |
+
he_B 282
|
| 284 |
+
he_E 283
|
| 285 |
+
he_I 284
|
| 286 |
+
he_S 285
|
| 287 |
+
hi_B 286
|
| 288 |
+
hi_E 287
|
| 289 |
+
hi_I 288
|
| 290 |
+
hi_S 289
|
| 291 |
+
ho_B 290
|
| 292 |
+
ho_E 291
|
| 293 |
+
ho_I 292
|
| 294 |
+
ho_S 293
|
| 295 |
+
hu_B 294
|
| 296 |
+
hu_E 295
|
| 297 |
+
hu_I 296
|
| 298 |
+
hu_S 297
|
| 299 |
+
#0 298
|
| 300 |
+
#1 299
|
| 301 |
+
#2 300
|
| 302 |
+
#3 301
|
stt/ar-tn/vosk-model-ar-tn-0.1-linto/am/tree
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:841160139eae5a74a5ebb69fa407ff8db25d2e57d7344e929f246ea05b9dfc6c
|
| 3 |
+
size 658228
|
stt/ar-tn/vosk-model-ar-tn-0.1-linto/conf/mfcc.conf
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# config for high-resolution MFCC features, intended for neural network training.
|
| 2 |
+
# Note: we keep all cepstra, so it has the same info as filterbank features,
|
| 3 |
+
# but MFCC is more easily compressible (because less correlated) which is why
|
| 4 |
+
# we prefer this method.
|
| 5 |
+
--use-energy=false # use average of log energy, not energy.
|
| 6 |
+
--sample-frequency=16000
|
| 7 |
+
--num-mel-bins=40
|
| 8 |
+
--num-ceps=40
|
| 9 |
+
--low-freq=40 # low cutoff frequency for mel bins
|
| 10 |
+
--high-freq=-200 # high cutoff frequently, relative to Nyquist of 4000 (=3800)
|
stt/ar-tn/vosk-model-ar-tn-0.1-linto/conf/model.conf
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
--min-active=200
|
| 2 |
+
--max-active=7000
|
| 3 |
+
--beam=11.0
|
| 4 |
+
--lattice-beam=6.0
|
| 5 |
+
--acoustic-scale=1.0
|
| 6 |
+
--frame-subsampling-factor=3
|
| 7 |
+
--endpoint.silence-phones=1:2:3:4:5
|
| 8 |
+
--endpoint.rule2.min-trailing-silence=0.5
|
| 9 |
+
--endpoint.rule3.min-trailing-silence=1.0
|
| 10 |
+
--endpoint.rule4.min-trailing-silence=2.0
|
stt/ar-tn/vosk-model-ar-tn-0.1-linto/conf/splice.conf
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
--left-context=3
|
| 2 |
+
--right-context=3
|
| 3 |
+
|
stt/ar-tn/vosk-model-ar-tn-0.1-linto/graph/HCLG.fst
ADDED
|
|
Git LFS Details
|
stt/ar-tn/vosk-model-ar-tn-0.1-linto/graph/disambig_tid.int
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
14649
|
| 2 |
+
14650
|
| 3 |
+
14651
|
| 4 |
+
14652
|
stt/ar-tn/vosk-model-ar-tn-0.1-linto/graph/num_pdfs
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
2968
|
stt/ar-tn/vosk-model-ar-tn-0.1-linto/graph/phones.txt
ADDED
|
@@ -0,0 +1,302 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<eps> 0
|
| 2 |
+
SIL 1
|
| 3 |
+
SIL_B 2
|
| 4 |
+
SIL_E 3
|
| 5 |
+
SIL_I 4
|
| 6 |
+
SIL_S 5
|
| 7 |
+
A$_B 6
|
| 8 |
+
A$_E 7
|
| 9 |
+
A$_I 8
|
| 10 |
+
A$_S 9
|
| 11 |
+
A&_B 10
|
| 12 |
+
A&_E 11
|
| 13 |
+
A&_I 12
|
| 14 |
+
A&_S 13
|
| 15 |
+
A'_B 14
|
| 16 |
+
A'_E 15
|
| 17 |
+
A'_I 16
|
| 18 |
+
A'_S 17
|
| 19 |
+
A<_B 18
|
| 20 |
+
A<_E 19
|
| 21 |
+
A<_I 20
|
| 22 |
+
A<_S 21
|
| 23 |
+
A>_B 22
|
| 24 |
+
A>_E 23
|
| 25 |
+
A>_I 24
|
| 26 |
+
A>_S 25
|
| 27 |
+
AA_B 26
|
| 28 |
+
AA_E 27
|
| 29 |
+
AA_I 28
|
| 30 |
+
AA_S 29
|
| 31 |
+
AD_B 30
|
| 32 |
+
AD_E 31
|
| 33 |
+
AD_I 32
|
| 34 |
+
AD_S 33
|
| 35 |
+
AE_B 34
|
| 36 |
+
AE_E 35
|
| 37 |
+
AE_I 36
|
| 38 |
+
AE_S 37
|
| 39 |
+
AH_B 38
|
| 40 |
+
AH_E 39
|
| 41 |
+
AH_I 40
|
| 42 |
+
AH_S 41
|
| 43 |
+
AS_B 42
|
| 44 |
+
AS_E 43
|
| 45 |
+
AS_I 44
|
| 46 |
+
AS_S 45
|
| 47 |
+
AT_B 46
|
| 48 |
+
AT_E 47
|
| 49 |
+
AT_I 48
|
| 50 |
+
AT_S 49
|
| 51 |
+
AV_B 50
|
| 52 |
+
AV_E 51
|
| 53 |
+
AV_I 52
|
| 54 |
+
AV_S 53
|
| 55 |
+
AY_B 54
|
| 56 |
+
AY_E 55
|
| 57 |
+
AY_I 56
|
| 58 |
+
AY_S 57
|
| 59 |
+
AZ_B 58
|
| 60 |
+
AZ_E 59
|
| 61 |
+
AZ_I 60
|
| 62 |
+
AZ_S 61
|
| 63 |
+
Ab_B 62
|
| 64 |
+
Ab_E 63
|
| 65 |
+
Ab_I 64
|
| 66 |
+
Ab_S 65
|
| 67 |
+
Ad_B 66
|
| 68 |
+
Ad_E 67
|
| 69 |
+
Ad_I 68
|
| 70 |
+
Ad_S 69
|
| 71 |
+
Af_B 70
|
| 72 |
+
Af_E 71
|
| 73 |
+
Af_I 72
|
| 74 |
+
Af_S 73
|
| 75 |
+
Ag_B 74
|
| 76 |
+
Ag_E 75
|
| 77 |
+
Ag_I 76
|
| 78 |
+
Ag_S 77
|
| 79 |
+
Ah_B 78
|
| 80 |
+
Ah_E 79
|
| 81 |
+
Ah_I 80
|
| 82 |
+
Ah_S 81
|
| 83 |
+
Aj_B 82
|
| 84 |
+
Aj_E 83
|
| 85 |
+
Aj_I 84
|
| 86 |
+
Aj_S 85
|
| 87 |
+
Ak_B 86
|
| 88 |
+
Ak_E 87
|
| 89 |
+
Ak_I 88
|
| 90 |
+
Ak_S 89
|
| 91 |
+
Al_B 90
|
| 92 |
+
Al_E 91
|
| 93 |
+
Al_I 92
|
| 94 |
+
Al_S 93
|
| 95 |
+
Am_B 94
|
| 96 |
+
Am_E 95
|
| 97 |
+
Am_I 96
|
| 98 |
+
Am_S 97
|
| 99 |
+
An_B 98
|
| 100 |
+
An_E 99
|
| 101 |
+
An_I 100
|
| 102 |
+
An_S 101
|
| 103 |
+
Ap_B 102
|
| 104 |
+
Ap_E 103
|
| 105 |
+
Ap_I 104
|
| 106 |
+
Ap_S 105
|
| 107 |
+
Aq_B 106
|
| 108 |
+
Aq_E 107
|
| 109 |
+
Aq_I 108
|
| 110 |
+
Aq_S 109
|
| 111 |
+
Ar_B 110
|
| 112 |
+
Ar_E 111
|
| 113 |
+
Ar_I 112
|
| 114 |
+
Ar_S 113
|
| 115 |
+
As_B 114
|
| 116 |
+
As_E 115
|
| 117 |
+
As_I 116
|
| 118 |
+
As_S 117
|
| 119 |
+
At_B 118
|
| 120 |
+
At_E 119
|
| 121 |
+
At_I 120
|
| 122 |
+
At_S 121
|
| 123 |
+
Av_B 122
|
| 124 |
+
Av_E 123
|
| 125 |
+
Av_I 124
|
| 126 |
+
Av_S 125
|
| 127 |
+
Aw_B 126
|
| 128 |
+
Aw_E 127
|
| 129 |
+
Aw_I 128
|
| 130 |
+
Aw_S 129
|
| 131 |
+
Ax_B 130
|
| 132 |
+
Ax_E 131
|
| 133 |
+
Ax_I 132
|
| 134 |
+
Ax_S 133
|
| 135 |
+
Ay_B 134
|
| 136 |
+
Ay_E 135
|
| 137 |
+
Ay_I 136
|
| 138 |
+
Ay_S 137
|
| 139 |
+
Az_B 138
|
| 140 |
+
Az_E 139
|
| 141 |
+
Az_I 140
|
| 142 |
+
Az_S 141
|
| 143 |
+
A|_B 142
|
| 144 |
+
A|_E 143
|
| 145 |
+
A|_I 144
|
| 146 |
+
A|_S 145
|
| 147 |
+
A}_B 146
|
| 148 |
+
A}_E 147
|
| 149 |
+
A}_I 148
|
| 150 |
+
A}_S 149
|
| 151 |
+
L'_B 150
|
| 152 |
+
L'_E 151
|
| 153 |
+
L'_I 152
|
| 154 |
+
L'_S 153
|
| 155 |
+
La_B 154
|
| 156 |
+
La_E 155
|
| 157 |
+
La_I 156
|
| 158 |
+
La_S 157
|
| 159 |
+
Lb_B 158
|
| 160 |
+
Lb_E 159
|
| 161 |
+
Lb_I 160
|
| 162 |
+
Lb_S 161
|
| 163 |
+
Lc_B 162
|
| 164 |
+
Lc_E 163
|
| 165 |
+
Lc_I 164
|
| 166 |
+
Lc_S 165
|
| 167 |
+
Ld_B 166
|
| 168 |
+
Ld_E 167
|
| 169 |
+
Ld_I 168
|
| 170 |
+
Ld_S 169
|
| 171 |
+
Le_B 170
|
| 172 |
+
Le_E 171
|
| 173 |
+
Le_I 172
|
| 174 |
+
Le_S 173
|
| 175 |
+
Lf_B 174
|
| 176 |
+
Lf_E 175
|
| 177 |
+
Lf_I 176
|
| 178 |
+
Lf_S 177
|
| 179 |
+
Lg_B 178
|
| 180 |
+
Lg_E 179
|
| 181 |
+
Lg_I 180
|
| 182 |
+
Lg_S 181
|
| 183 |
+
Lh_B 182
|
| 184 |
+
Lh_E 183
|
| 185 |
+
Lh_I 184
|
| 186 |
+
Lh_S 185
|
| 187 |
+
Li_B 186
|
| 188 |
+
Li_E 187
|
| 189 |
+
Li_I 188
|
| 190 |
+
Li_S 189
|
| 191 |
+
Lj_B 190
|
| 192 |
+
Lj_E 191
|
| 193 |
+
Lj_I 192
|
| 194 |
+
Lj_S 193
|
| 195 |
+
Lk_B 194
|
| 196 |
+
Lk_E 195
|
| 197 |
+
Lk_I 196
|
| 198 |
+
Lk_S 197
|
| 199 |
+
Ll_B 198
|
| 200 |
+
Ll_E 199
|
| 201 |
+
Ll_I 200
|
| 202 |
+
Ll_S 201
|
| 203 |
+
Lm_B 202
|
| 204 |
+
Lm_E 203
|
| 205 |
+
Lm_I 204
|
| 206 |
+
Lm_S 205
|
| 207 |
+
Ln_B 206
|
| 208 |
+
Ln_E 207
|
| 209 |
+
Ln_I 208
|
| 210 |
+
Ln_S 209
|
| 211 |
+
Lo_B 210
|
| 212 |
+
Lo_E 211
|
| 213 |
+
Lo_I 212
|
| 214 |
+
Lo_S 213
|
| 215 |
+
Lp_B 214
|
| 216 |
+
Lp_E 215
|
| 217 |
+
Lp_I 216
|
| 218 |
+
Lp_S 217
|
| 219 |
+
Lq_B 218
|
| 220 |
+
Lq_E 219
|
| 221 |
+
Lq_I 220
|
| 222 |
+
Lq_S 221
|
| 223 |
+
Lr_B 222
|
| 224 |
+
Lr_E 223
|
| 225 |
+
Lr_I 224
|
| 226 |
+
Lr_S 225
|
| 227 |
+
Ls_B 226
|
| 228 |
+
Ls_E 227
|
| 229 |
+
Ls_I 228
|
| 230 |
+
Ls_S 229
|
| 231 |
+
Lt_B 230
|
| 232 |
+
Lt_E 231
|
| 233 |
+
Lt_I 232
|
| 234 |
+
Lt_S 233
|
| 235 |
+
Lu_B 234
|
| 236 |
+
Lu_E 235
|
| 237 |
+
Lu_I 236
|
| 238 |
+
Lu_S 237
|
| 239 |
+
Lv_B 238
|
| 240 |
+
Lv_E 239
|
| 241 |
+
Lv_I 240
|
| 242 |
+
Lv_S 241
|
| 243 |
+
Lw_B 242
|
| 244 |
+
Lw_E 243
|
| 245 |
+
Lw_I 244
|
| 246 |
+
Lw_S 245
|
| 247 |
+
Lx_B 246
|
| 248 |
+
Lx_E 247
|
| 249 |
+
Lx_I 248
|
| 250 |
+
Lx_S 249
|
| 251 |
+
Ly_B 250
|
| 252 |
+
Ly_E 251
|
| 253 |
+
Ly_I 252
|
| 254 |
+
Ly_S 253
|
| 255 |
+
Lz_B 254
|
| 256 |
+
Lz_E 255
|
| 257 |
+
Lz_I 256
|
| 258 |
+
Lz_S 257
|
| 259 |
+
ae_B 258
|
| 260 |
+
ae_E 259
|
| 261 |
+
ae_I 260
|
| 262 |
+
ae_S 261
|
| 263 |
+
cc_B 262
|
| 264 |
+
cc_E 263
|
| 265 |
+
cc_I 264
|
| 266 |
+
cc_S 265
|
| 267 |
+
ga_B 266
|
| 268 |
+
ga_E 267
|
| 269 |
+
ga_I 268
|
| 270 |
+
ga_S 269
|
| 271 |
+
ge_B 270
|
| 272 |
+
ge_E 271
|
| 273 |
+
ge_I 272
|
| 274 |
+
ge_S 273
|
| 275 |
+
gu_B 274
|
| 276 |
+
gu_E 275
|
| 277 |
+
gu_I 276
|
| 278 |
+
gu_S 277
|
| 279 |
+
ha_B 278
|
| 280 |
+
ha_E 279
|
| 281 |
+
ha_I 280
|
| 282 |
+
ha_S 281
|
| 283 |
+
he_B 282
|
| 284 |
+
he_E 283
|
| 285 |
+
he_I 284
|
| 286 |
+
he_S 285
|
| 287 |
+
hi_B 286
|
| 288 |
+
hi_E 287
|
| 289 |
+
hi_I 288
|
| 290 |
+
hi_S 289
|
| 291 |
+
ho_B 290
|
| 292 |
+
ho_E 291
|
| 293 |
+
ho_I 292
|
| 294 |
+
ho_S 293
|
| 295 |
+
hu_B 294
|
| 296 |
+
hu_E 295
|
| 297 |
+
hu_I 296
|
| 298 |
+
hu_S 297
|
| 299 |
+
#0 298
|
| 300 |
+
#1 299
|
| 301 |
+
#2 300
|
| 302 |
+
#3 301
|
stt/ar-tn/vosk-model-ar-tn-0.1-linto/graph/phones/align_lexicon.int
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
stt/ar-tn/vosk-model-ar-tn-0.1-linto/graph/phones/align_lexicon.txt
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:89605218591f6556a3fcc5e34e1db69bc9e017863a011fef28273beba1493d09
|
| 3 |
+
size 16309319
|
stt/ar-tn/vosk-model-ar-tn-0.1-linto/graph/phones/disambig.int
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
298
|
| 2 |
+
299
|
| 3 |
+
300
|
| 4 |
+
301
|
stt/ar-tn/vosk-model-ar-tn-0.1-linto/graph/phones/disambig.txt
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#0
|
| 2 |
+
#1
|
| 3 |
+
#2
|
| 4 |
+
#3
|
stt/ar-tn/vosk-model-ar-tn-0.1-linto/graph/phones/optional_silence.csl
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
1
|
stt/ar-tn/vosk-model-ar-tn-0.1-linto/graph/phones/optional_silence.int
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
1
|