ludx Derur commited on
Commit
bd7d14d
·
0 Parent(s):

Duplicate from Derur/vosk-models

Browse files

Co-authored-by: Derur <Derur@users.noreply.huggingface.co>

This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .gitattributes +567 -0
  2. README.md +52 -0
  3. punctuation/vosk-recasepunc-de-0.21.7z +3 -0
  4. punctuation/vosk-recasepunc-de-0.21/README +7 -0
  5. punctuation/vosk-recasepunc-de-0.21/checkpoint +3 -0
  6. punctuation/vosk-recasepunc-de-0.21/de-test.txt +6 -0
  7. punctuation/vosk-recasepunc-de-0.21/de-test.txt.orig +6 -0
  8. punctuation/vosk-recasepunc-de-0.21/example.py +23 -0
  9. punctuation/vosk-recasepunc-de-0.21/recasepunc.py +742 -0
  10. punctuation/vosk-recasepunc-en-0.22.7z +3 -0
  11. punctuation/vosk-recasepunc-en-0.22/README +7 -0
  12. punctuation/vosk-recasepunc-en-0.22/checkpoint +3 -0
  13. punctuation/vosk-recasepunc-en-0.22/example.py +26 -0
  14. punctuation/vosk-recasepunc-en-0.22/recasepunc.py +742 -0
  15. punctuation/vosk-recasepunc-en-0.22/vosk-adapted.txt +17 -0
  16. punctuation/vosk-recasepunc-en-0.22/vosk-adapted.txt.punc +1 -0
  17. punctuation/vosk-recasepunc-ru-0.22.7z +3 -0
  18. punctuation/vosk-recasepunc-ru-0.22/README +7 -0
  19. punctuation/vosk-recasepunc-ru-0.22/checkpoint +3 -0
  20. punctuation/vosk-recasepunc-ru-0.22/example.py +23 -0
  21. punctuation/vosk-recasepunc-ru-0.22/recasepunc.py +743 -0
  22. punctuation/vosk-recasepunc-ru-0.22/ru-test.txt +17 -0
  23. punctuation/vosk-recasepunc-ru-0.22/ru-test.txt.orig +17 -0
  24. speaker_indentification/vosk-model-spk-0.4.7z +3 -0
  25. speaker_indentification/vosk-model-spk-0.4/README.txt +119 -0
  26. speaker_indentification/vosk-model-spk-0.4/final.ext.raw +3 -0
  27. speaker_indentification/vosk-model-spk-0.4/mean.vec +1 -0
  28. speaker_indentification/vosk-model-spk-0.4/mfcc.conf +5 -0
  29. speaker_indentification/vosk-model-spk-0.4/transform.mat +0 -0
  30. stt/ar-tn/vosk-model-ar-tn-0.1-linto.7z +3 -0
  31. stt/ar-tn/vosk-model-ar-tn-0.1-linto/am/cmvn_opts +1 -0
  32. stt/ar-tn/vosk-model-ar-tn-0.1-linto/am/final.ie.id +1 -0
  33. stt/ar-tn/vosk-model-ar-tn-0.1-linto/am/final.mdl +3 -0
  34. stt/ar-tn/vosk-model-ar-tn-0.1-linto/am/frame_subsampling_factor +1 -0
  35. stt/ar-tn/vosk-model-ar-tn-0.1-linto/am/num_jobs +1 -0
  36. stt/ar-tn/vosk-model-ar-tn-0.1-linto/am/phones.txt +302 -0
  37. stt/ar-tn/vosk-model-ar-tn-0.1-linto/am/tree +3 -0
  38. stt/ar-tn/vosk-model-ar-tn-0.1-linto/conf/mfcc.conf +10 -0
  39. stt/ar-tn/vosk-model-ar-tn-0.1-linto/conf/model.conf +10 -0
  40. stt/ar-tn/vosk-model-ar-tn-0.1-linto/conf/splice.conf +3 -0
  41. stt/ar-tn/vosk-model-ar-tn-0.1-linto/graph/HCLG.fst +3 -0
  42. stt/ar-tn/vosk-model-ar-tn-0.1-linto/graph/disambig_tid.int +4 -0
  43. stt/ar-tn/vosk-model-ar-tn-0.1-linto/graph/num_pdfs +1 -0
  44. stt/ar-tn/vosk-model-ar-tn-0.1-linto/graph/phones.txt +302 -0
  45. stt/ar-tn/vosk-model-ar-tn-0.1-linto/graph/phones/align_lexicon.int +0 -0
  46. stt/ar-tn/vosk-model-ar-tn-0.1-linto/graph/phones/align_lexicon.txt +3 -0
  47. stt/ar-tn/vosk-model-ar-tn-0.1-linto/graph/phones/disambig.int +4 -0
  48. stt/ar-tn/vosk-model-ar-tn-0.1-linto/graph/phones/disambig.txt +4 -0
  49. stt/ar-tn/vosk-model-ar-tn-0.1-linto/graph/phones/optional_silence.csl +1 -0
  50. 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

  • SHA256: 085283ce8dd16b6217d980407446a80baa495af1e523a7ddbfaff641e585aca8
  • Pointer size: 135 Bytes
  • Size of remote file: 1.33 GB
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