nshmyrevgmail commited on
Commit
f9a3fb3
1 Parent(s): 3ec7591

Import initial model

Browse files
Files changed (8) hide show
  1. am/jit_script.pt +3 -0
  2. decode.py +695 -0
  3. lang/bpe.model +3 -0
  4. lang/tokens.txt +502 -0
  5. lang/unigram_500.vocab +500 -0
  6. lm/2gram.fst.txt +0 -0
  7. lm/epoch-99.pt +3 -0
  8. test.wav +0 -0
am/jit_script.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:d5b64964bad8c24fe48f5d9c0ffe98c4787495ea991a186f00b059fc3fa549c9
3
+ size 264940286
decode.py ADDED
@@ -0,0 +1,695 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ # Copyright 2021-2023 Xiaomi Corporation (Author: Fangjun Kuang, Zengwei Yao)
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ import sys
17
+ import argparse
18
+ import logging
19
+ import math
20
+ import warnings
21
+ from dataclasses import dataclass, field
22
+ from typing import Dict, List, Optional, Tuple, Union
23
+
24
+ import kaldifeat
25
+ import sentencepiece as spm
26
+ import torch
27
+ import torchaudio
28
+
29
+ from torch.nn.utils.rnn import pad_sequence
30
+
31
+ from icefall import NgramLm, NgramLmStateCost
32
+ from icefall.decode import Nbest, one_best_decoding
33
+ from icefall.lm_wrapper import LmScorer
34
+ from icefall.rnn_lm.model import RnnLmModel
35
+ from icefall.transformer_lm.model import TransformerLM
36
+ from icefall.utils import AttributeDict
37
+ from icefall.lexicon import Lexicon
38
+
39
+ import k2
40
+
41
+
42
+ def read_sound_files(
43
+ filenames: List[str], expected_sample_rate: float = 16000
44
+ ) -> List[torch.Tensor]:
45
+ """Read a list of sound files into a list 1-D float32 torch tensors.
46
+ Args:
47
+ filenames:
48
+ A list of sound filenames.
49
+ expected_sample_rate:
50
+ The expected sample rate of the sound files.
51
+ Returns:
52
+ Return a list of 1-D float32 torch tensors.
53
+ """
54
+ ans = []
55
+ for f in filenames:
56
+ wave, sample_rate = torchaudio.load(f)
57
+ resampler = torchaudio.transforms.Resample(sample_rate, 16_000)
58
+ wav = resampler(wave[0])
59
+ ans.append(wav)
60
+ return ans
61
+
62
+ @dataclass
63
+ class Hypothesis:
64
+ # The predicted tokens so far.
65
+ # Newly predicted tokens are appended to `ys`.
66
+ ys: List[int]
67
+
68
+ # The log prob of ys.
69
+ # It contains only one entry.
70
+ log_prob: torch.Tensor
71
+
72
+ # timestamp[i] is the frame index after subsampling
73
+ # on which ys[i] is decoded
74
+ timestamp: List[int] = field(default_factory=list)
75
+
76
+ # the lm score for next token given the current ys
77
+ lm_score: Optional[torch.Tensor] = None
78
+
79
+ # the RNNLM states (h and c in LSTM)
80
+ state: Optional[Tuple[torch.Tensor, torch.Tensor]] = None
81
+
82
+ # N-gram LM state
83
+ state_cost: Optional[NgramLmStateCost] = None
84
+
85
+ @property
86
+ def key(self) -> str:
87
+ """Return a string representation of self.ys"""
88
+ return "_".join(map(str, self.ys))
89
+
90
+
91
+ class HypothesisList(object):
92
+ def __init__(self, data: Optional[Dict[str, Hypothesis]] = None) -> None:
93
+ """
94
+ Args:
95
+ data:
96
+ A dict of Hypotheses. Its key is its `value.key`.
97
+ """
98
+ if data is None:
99
+ self._data = {}
100
+ else:
101
+ self._data = data
102
+
103
+ @property
104
+ def data(self) -> Dict[str, Hypothesis]:
105
+ return self._data
106
+
107
+ def add(self, hyp: Hypothesis) -> None:
108
+ """Add a Hypothesis to `self`.
109
+
110
+ If `hyp` already exists in `self`, its probability is updated using
111
+ `log-sum-exp` with the existed one.
112
+
113
+ Args:
114
+ hyp:
115
+ The hypothesis to be added.
116
+ """
117
+ key = hyp.key
118
+ if key in self:
119
+ old_hyp = self._data[key] # shallow copy
120
+ torch.logaddexp(old_hyp.log_prob, hyp.log_prob, out=old_hyp.log_prob)
121
+ else:
122
+ self._data[key] = hyp
123
+
124
+ def get_most_probable(self, length_norm: bool = False) -> Hypothesis:
125
+ """Get the most probable hypothesis, i.e., the one with
126
+ the largest `log_prob`.
127
+
128
+ Args:
129
+ length_norm:
130
+ If True, the `log_prob` of a hypothesis is normalized by the
131
+ number of tokens in it.
132
+ Returns:
133
+ Return the hypothesis that has the largest `log_prob`.
134
+ """
135
+ if length_norm:
136
+ return max(self._data.values(), key=lambda hyp: hyp.log_prob / len(hyp.ys))
137
+ else:
138
+ return max(self._data.values(), key=lambda hyp: hyp.log_prob)
139
+
140
+ def remove(self, hyp: Hypothesis) -> None:
141
+ """Remove a given hypothesis.
142
+
143
+ Caution:
144
+ `self` is modified **in-place**.
145
+
146
+ Args:
147
+ hyp:
148
+ The hypothesis to be removed from `self`.
149
+ Note: It must be contained in `self`. Otherwise,
150
+ an exception is raised.
151
+ """
152
+ key = hyp.key
153
+ assert key in self, f"{key} does not exist"
154
+ del self._data[key]
155
+
156
+ def filter(self, threshold: torch.Tensor) -> "HypothesisList":
157
+ """Remove all Hypotheses whose log_prob is less than threshold.
158
+
159
+ Caution:
160
+ `self` is not modified. Instead, a new HypothesisList is returned.
161
+
162
+ Returns:
163
+ Return a new HypothesisList containing all hypotheses from `self`
164
+ with `log_prob` being greater than the given `threshold`.
165
+ """
166
+ ans = HypothesisList()
167
+ for _, hyp in self._data.items():
168
+ if hyp.log_prob > threshold:
169
+ ans.add(hyp) # shallow copy
170
+ return ans
171
+
172
+ def topk(self, k: int, length_norm: bool = False) -> "HypothesisList":
173
+ """Return the top-k hypothesis.
174
+
175
+ Args:
176
+ length_norm:
177
+ If True, the `log_prob` of a hypothesis is normalized by the
178
+ number of tokens in it.
179
+ """
180
+ hyps = list(self._data.items())
181
+
182
+ if length_norm:
183
+ hyps = sorted(
184
+ hyps, key=lambda h: h[1].log_prob / len(h[1].ys), reverse=True
185
+ )[:k]
186
+ else:
187
+ hyps = sorted(hyps, key=lambda h: h[1].log_prob, reverse=True)[:k]
188
+
189
+ ans = HypothesisList(dict(hyps))
190
+ return ans
191
+
192
+ def __contains__(self, key: str):
193
+ return key in self._data
194
+
195
+ def __iter__(self):
196
+ return iter(self._data.values())
197
+
198
+ def __len__(self) -> int:
199
+ return len(self._data)
200
+
201
+ def __str__(self) -> str:
202
+ s = []
203
+ for key in self:
204
+ s.append(key)
205
+ return ", ".join(s)
206
+
207
+
208
+ def get_hyps_shape(hyps: List[HypothesisList]) -> k2.RaggedShape:
209
+ """Return a ragged shape with axes [utt][num_hyps].
210
+
211
+ Args:
212
+ hyps:
213
+ len(hyps) == batch_size. It contains the current hypothesis for
214
+ each utterance in the batch.
215
+ Returns:
216
+ Return a ragged shape with 2 axes [utt][num_hyps]. Note that
217
+ the shape is on CPU.
218
+ """
219
+ num_hyps = [len(h) for h in hyps]
220
+
221
+ # torch.cumsum() is inclusive sum, so we put a 0 at the beginning
222
+ # to get exclusive sum later.
223
+ num_hyps.insert(0, 0)
224
+
225
+ num_hyps = torch.tensor(num_hyps)
226
+ row_splits = torch.cumsum(num_hyps, dim=0, dtype=torch.int32)
227
+ ans = k2.ragged.create_ragged_shape2(
228
+ row_splits=row_splits, cached_tot_size=row_splits[-1].item()
229
+ )
230
+ return ans
231
+
232
+
233
+ def modified_beam_search_LODR(
234
+ model,
235
+ encoder_out: torch.Tensor,
236
+ encoder_out_lens: torch.Tensor,
237
+ LODR_lm: NgramLm,
238
+ LODR_lm_scale: float,
239
+ LM: LmScorer,
240
+ beam: int = 4,
241
+ ) -> List[List[int]]:
242
+ """This function implements LODR (https://arxiv.org/abs/2203.16776) with
243
+ `modified_beam_search`. It uses a bi-gram language model as the estimate
244
+ of the internal language model and subtracts its score during shallow fusion
245
+ with an external language model. This implementation uses a RNNLM as the
246
+ external language model.
247
+
248
+ Args:
249
+ model (Transducer):
250
+ The transducer model
251
+ encoder_out (torch.Tensor):
252
+ Encoder output in (N,T,C)
253
+ encoder_out_lens (torch.Tensor):
254
+ A 1-D tensor of shape (N,), containing the number of
255
+ valid frames in encoder_out before padding.
256
+ LODR_lm:
257
+ A low order n-gram LM, whose score will be subtracted during shallow fusion
258
+ LODR_lm_scale:
259
+ The scale of the LODR_lm
260
+ LM:
261
+ A neural net LM, e.g an RNNLM or transformer LM
262
+ beam (int, optional):
263
+ Beam size. Defaults to 4.
264
+
265
+ Returns:
266
+ Return a list-of-list of token IDs. ans[i] is the decoding results
267
+ for the i-th utterance.
268
+
269
+ """
270
+ assert encoder_out.ndim == 3, encoder_out.shape
271
+ assert encoder_out.size(0) >= 1, encoder_out.size(0)
272
+ assert LM is not None
273
+ lm_scale = LM.lm_scale
274
+
275
+ packed_encoder_out = torch.nn.utils.rnn.pack_padded_sequence(
276
+ input=encoder_out,
277
+ lengths=encoder_out_lens.cpu(),
278
+ batch_first=True,
279
+ enforce_sorted=False,
280
+ )
281
+
282
+ blank_id = model.decoder.blank_id
283
+ sos_id = getattr(LM, "sos_id", 1)
284
+ unk_id = getattr(model, "unk_id", blank_id)
285
+ context_size = model.decoder.context_size
286
+ device = next(model.parameters()).device
287
+
288
+ batch_size_list = packed_encoder_out.batch_sizes.tolist()
289
+ N = encoder_out.size(0)
290
+ assert torch.all(encoder_out_lens > 0), encoder_out_lens
291
+ assert N == batch_size_list[0], (N, batch_size_list)
292
+
293
+ # get initial lm score and lm state by scoring the "sos" token
294
+ sos_token = torch.tensor([[sos_id]]).to(torch.int64).to(device)
295
+ lens = torch.tensor([1]).to(device)
296
+ init_score, init_states = LM.score_token(sos_token, lens)
297
+
298
+ B = [HypothesisList() for _ in range(N)]
299
+ for i in range(N):
300
+ B[i].add(
301
+ Hypothesis(
302
+ ys=[blank_id] * context_size,
303
+ log_prob=torch.zeros(1, dtype=torch.float32, device=device),
304
+ state=init_states, # state of the NN LM
305
+ lm_score=init_score.reshape(-1),
306
+ state_cost=NgramLmStateCost(
307
+ LODR_lm
308
+ ), # state of the source domain ngram
309
+ )
310
+ )
311
+
312
+ encoder_out = model.joiner.encoder_proj(packed_encoder_out.data)
313
+
314
+ offset = 0
315
+ finalized_B = []
316
+ for batch_size in batch_size_list:
317
+ start = offset
318
+ end = offset + batch_size
319
+ current_encoder_out = encoder_out.data[start:end] # get batch
320
+ current_encoder_out = current_encoder_out.unsqueeze(1).unsqueeze(1)
321
+ # current_encoder_out's shape is (batch_size, 1, 1, encoder_out_dim)
322
+ offset = end
323
+
324
+ finalized_B = B[batch_size:] + finalized_B
325
+ B = B[:batch_size]
326
+
327
+ hyps_shape = get_hyps_shape(B).to(device)
328
+
329
+ A = [list(b) for b in B]
330
+ B = [HypothesisList() for _ in range(batch_size)]
331
+
332
+ ys_log_probs = torch.cat(
333
+ [hyp.log_prob.reshape(1, 1) for hyps in A for hyp in hyps]
334
+ )
335
+
336
+ decoder_input = torch.tensor(
337
+ [hyp.ys[-context_size:] for hyps in A for hyp in hyps],
338
+ device=device,
339
+ dtype=torch.int64,
340
+ ) # (num_hyps, context_size)
341
+
342
+ decoder_out = model.decoder(decoder_input, need_pad=False).unsqueeze(1)
343
+ decoder_out = model.joiner.decoder_proj(decoder_out)
344
+
345
+ current_encoder_out = torch.index_select(
346
+ current_encoder_out,
347
+ dim=0,
348
+ index=hyps_shape.row_ids(1).to(torch.int64),
349
+ ) # (num_hyps, 1, 1, encoder_out_dim)
350
+
351
+ logits = model.joiner(
352
+ current_encoder_out,
353
+ decoder_out,
354
+ project_input=False,
355
+ ) # (num_hyps, 1, 1, vocab_size)
356
+
357
+ logits = logits.squeeze(1).squeeze(1) # (num_hyps, vocab_size)
358
+
359
+ log_probs = logits.log_softmax(dim=-1) # (num_hyps, vocab_size)
360
+
361
+ log_probs.add_(ys_log_probs)
362
+
363
+ vocab_size = log_probs.size(-1)
364
+
365
+ log_probs = log_probs.reshape(-1)
366
+
367
+ row_splits = hyps_shape.row_splits(1) * vocab_size
368
+ log_probs_shape = k2.ragged.create_ragged_shape2(
369
+ row_splits=row_splits, cached_tot_size=log_probs.numel()
370
+ )
371
+ ragged_log_probs = k2.RaggedTensor(shape=log_probs_shape, value=log_probs)
372
+ """
373
+ for all hyps with a non-blank new token, score this token.
374
+ It is a little confusing here because this for-loop
375
+ looks very similar to the one below. Here, we go through all
376
+ top-k tokens and only add the non-blanks ones to the token_list.
377
+ LM will score those tokens given the LM states. Note that
378
+ the variable `scores` is the LM score after seeing the new
379
+ non-blank token.
380
+ """
381
+ token_list = []
382
+ hs = []
383
+ cs = []
384
+ for i in range(batch_size):
385
+ topk_log_probs, topk_indexes = ragged_log_probs[i].topk(beam)
386
+
387
+ with warnings.catch_warnings():
388
+ warnings.simplefilter("ignore")
389
+ topk_hyp_indexes = (topk_indexes // vocab_size).tolist()
390
+ topk_token_indexes = (topk_indexes % vocab_size).tolist()
391
+ for k in range(len(topk_hyp_indexes)):
392
+ hyp_idx = topk_hyp_indexes[k]
393
+ hyp = A[i][hyp_idx]
394
+
395
+ new_token = topk_token_indexes[k]
396
+ if new_token not in (blank_id, unk_id):
397
+ if LM.lm_type == "rnn":
398
+ token_list.append([new_token])
399
+ # store the LSTM states
400
+ hs.append(hyp.state[0])
401
+ cs.append(hyp.state[1])
402
+ else:
403
+ # for transformer LM
404
+ token_list.append(
405
+ [sos_id] + hyp.ys[context_size:] + [new_token]
406
+ )
407
+
408
+ # forward NN LM to get new states and scores
409
+ if len(token_list) != 0:
410
+ x_lens = torch.tensor([len(tokens) for tokens in token_list]).to(device)
411
+ if LM.lm_type == "rnn":
412
+ tokens_to_score = (
413
+ torch.tensor(token_list).to(torch.int64).to(device).reshape(-1, 1)
414
+ )
415
+ hs = torch.cat(hs, dim=1).to(device)
416
+ cs = torch.cat(cs, dim=1).to(device)
417
+ state = (hs, cs)
418
+ else:
419
+ # for transformer LM
420
+ tokens_list = [torch.tensor(tokens) for tokens in token_list]
421
+ tokens_to_score = (
422
+ torch.nn.utils.rnn.pad_sequence(
423
+ tokens_list, batch_first=True, padding_value=0.0
424
+ )
425
+ .to(device)
426
+ .to(torch.int64)
427
+ )
428
+
429
+ state = None
430
+
431
+ scores, lm_states = LM.score_token(tokens_to_score, x_lens, state)
432
+
433
+ count = 0 # index, used to locate score and lm states
434
+ for i in range(batch_size):
435
+ topk_log_probs, topk_indexes = ragged_log_probs[i].topk(beam)
436
+
437
+ with warnings.catch_warnings():
438
+ warnings.simplefilter("ignore")
439
+ topk_hyp_indexes = (topk_indexes // vocab_size).tolist()
440
+ topk_token_indexes = (topk_indexes % vocab_size).tolist()
441
+
442
+ for k in range(len(topk_hyp_indexes)):
443
+ hyp_idx = topk_hyp_indexes[k]
444
+ hyp = A[i][hyp_idx]
445
+
446
+ ys = hyp.ys[:]
447
+
448
+ # current score of hyp
449
+ lm_score = hyp.lm_score
450
+ state = hyp.state
451
+
452
+ hyp_log_prob = topk_log_probs[k] # get score of current hyp
453
+ new_token = topk_token_indexes[k]
454
+ if new_token not in (blank_id, unk_id):
455
+
456
+ ys.append(new_token)
457
+ state_cost = hyp.state_cost.forward_one_step(new_token)
458
+
459
+ # calculate the score of the latest token
460
+ current_ngram_score = state_cost.lm_score - hyp.state_cost.lm_score
461
+
462
+ assert current_ngram_score <= 0.0, (
463
+ state_cost.lm_score,
464
+ hyp.state_cost.lm_score,
465
+ )
466
+ # score = score + TDLM_score - LODR_score
467
+ # LODR_LM_scale should be a negative number here
468
+ hyp_log_prob += (
469
+ lm_score[new_token] * lm_scale
470
+ + LODR_lm_scale * current_ngram_score
471
+ ) # add the lm score
472
+
473
+ lm_score = scores[count]
474
+ if LM.lm_type == "rnn":
475
+ state = (
476
+ lm_states[0][:, count, :].unsqueeze(1),
477
+ lm_states[1][:, count, :].unsqueeze(1),
478
+ )
479
+ count += 1
480
+ else:
481
+ state_cost = hyp.state_cost
482
+
483
+ new_hyp = Hypothesis(
484
+ ys=ys,
485
+ log_prob=hyp_log_prob,
486
+ state=state,
487
+ lm_score=lm_score,
488
+ state_cost=state_cost,
489
+ )
490
+ B[i].add(new_hyp)
491
+
492
+ B = B + finalized_B
493
+ best_hyps = [b.get_most_probable(length_norm=True) for b in B]
494
+
495
+ sorted_ans = [h.ys[context_size:] for h in best_hyps]
496
+ ans = []
497
+ unsorted_indices = packed_encoder_out.unsorted_indices.tolist()
498
+ for i in range(N):
499
+ ans.append(sorted_ans[unsorted_indices[i]])
500
+
501
+ return ans
502
+
503
+
504
+ def greedy_search(
505
+ model: torch.jit.ScriptModule,
506
+ encoder_out: torch.Tensor,
507
+ encoder_out_lens: torch.Tensor,
508
+ ) -> List[List[int]]:
509
+ """Greedy search in batch mode. It hardcodes --max-sym-per-frame=1.
510
+ Args:
511
+ model:
512
+ The transducer model.
513
+ encoder_out:
514
+ A 3-D tensor of shape (N, T, C)
515
+ encoder_out_lens:
516
+ A 1-D tensor of shape (N,).
517
+ Returns:
518
+ Return the decoded results for each utterance.
519
+ """
520
+ assert encoder_out.ndim == 3
521
+ assert encoder_out.size(0) >= 1, encoder_out.size(0)
522
+
523
+ packed_encoder_out = torch.nn.utils.rnn.pack_padded_sequence(
524
+ input=encoder_out,
525
+ lengths=encoder_out_lens.cpu(),
526
+ batch_first=True,
527
+ enforce_sorted=False,
528
+ )
529
+
530
+ device = encoder_out.device
531
+ blank_id = 0 # hard-code to 0
532
+
533
+ batch_size_list = packed_encoder_out.batch_sizes.tolist()
534
+ N = encoder_out.size(0)
535
+
536
+ assert torch.all(encoder_out_lens > 0), encoder_out_lens
537
+ assert N == batch_size_list[0], (N, batch_size_list)
538
+
539
+ context_size = model.decoder.context_size
540
+ hyps = [[blank_id] * context_size for _ in range(N)]
541
+
542
+ decoder_input = torch.tensor(
543
+ hyps,
544
+ device=device,
545
+ dtype=torch.int64,
546
+ ) # (N, context_size)
547
+
548
+ decoder_out = model.decoder(
549
+ decoder_input,
550
+ need_pad=torch.tensor([False]),
551
+ ).squeeze(1)
552
+
553
+ offset = 0
554
+ for batch_size in batch_size_list:
555
+ start = offset
556
+ end = offset + batch_size
557
+ current_encoder_out = packed_encoder_out.data[start:end]
558
+ current_encoder_out = current_encoder_out
559
+ # current_encoder_out's shape: (batch_size, encoder_out_dim)
560
+ offset = end
561
+
562
+ decoder_out = decoder_out[:batch_size]
563
+
564
+ logits = model.joiner(
565
+ current_encoder_out,
566
+ decoder_out,
567
+ )
568
+ # logits'shape (batch_size, vocab_size)
569
+
570
+ assert logits.ndim == 2, logits.shape
571
+ y = logits.argmax(dim=1).tolist()
572
+ emitted = False
573
+ for i, v in enumerate(y):
574
+ if v != blank_id:
575
+ hyps[i].append(v)
576
+ emitted = True
577
+ if emitted:
578
+ # update decoder output
579
+ decoder_input = [h[-context_size:] for h in hyps[:batch_size]]
580
+ decoder_input = torch.tensor(
581
+ decoder_input,
582
+ device=device,
583
+ dtype=torch.int64,
584
+ )
585
+ decoder_out = model.decoder(
586
+ decoder_input,
587
+ need_pad=torch.tensor([False]),
588
+ )
589
+ decoder_out = decoder_out.squeeze(1)
590
+
591
+ sorted_ans = [h[context_size:] for h in hyps]
592
+ ans = []
593
+ unsorted_indices = packed_encoder_out.unsorted_indices.tolist()
594
+ for i in range(N):
595
+ ans.append(sorted_ans[unsorted_indices[i]])
596
+
597
+ return ans
598
+
599
+
600
+ @torch.no_grad()
601
+ def main():
602
+ torch.set_num_threads(8)
603
+
604
+ device = torch.device("cpu")
605
+ if torch.cuda.is_available():
606
+ device = torch.device("cuda", 0)
607
+
608
+ model = torch.jit.load("am/jit_script.pt")
609
+
610
+ model.eval()
611
+
612
+ model.to(device)
613
+
614
+ sp = spm.SentencePieceProcessor()
615
+ sp.load("lang/bpe.model")
616
+
617
+ opts = kaldifeat.FbankOptions()
618
+ opts.device = device
619
+ opts.frame_opts.dither = 0
620
+ opts.frame_opts.snip_edges = False
621
+ opts.frame_opts.samp_freq = 16000
622
+ opts.mel_opts.num_bins = 80
623
+
624
+ fbank = kaldifeat.Fbank(opts)
625
+
626
+ all_filenames = sys.argv[1:]
627
+
628
+ params = AttributeDict()
629
+ params.vocab_size = 500
630
+ params.rnn_lm_embedding_dim = 2048
631
+ params.rnn_lm_hidden_dim = 2048
632
+ params.rnn_lm_num_layers = 3
633
+ params.rnn_lm_tie_weights = True
634
+ params.lm_epoch = 99
635
+ params.lm_exp_dir = "lm"
636
+ params.lm_avg = 1
637
+
638
+ LM = LmScorer(
639
+ lm_type="rnn",
640
+ params=params,
641
+ device=device,
642
+ lm_scale=0.2,
643
+ )
644
+ LM.to(device)
645
+ LM.eval()
646
+
647
+ ngram_lm = NgramLm(
648
+ "lm/2gram.fst.txt",
649
+ backoff_id=500,
650
+ is_binary=False,
651
+ )
652
+ ngram_lm_scale = -0.1
653
+
654
+ for i in range(0, len(all_filenames), 16):
655
+ filenames = all_filenames[i:i+16]
656
+ waves = read_sound_files(
657
+ filenames=filenames,
658
+ )
659
+ waves = [w.to(device) for w in waves]
660
+
661
+ features = fbank(waves)
662
+ feature_lengths = [f.size(0) for f in features]
663
+
664
+ features = pad_sequence(
665
+ features,
666
+ batch_first=True,
667
+ padding_value=math.log(1e-10),
668
+ )
669
+
670
+ feature_lengths = torch.tensor(feature_lengths, device=device)
671
+
672
+ encoder_out, encoder_out_lens = model.encoder(
673
+ features=features,
674
+ feature_lengths=feature_lengths,
675
+ )
676
+
677
+ hyps = modified_beam_search_LODR(
678
+ model=model,
679
+ encoder_out=encoder_out,
680
+ encoder_out_lens=encoder_out_lens,
681
+ beam=20,
682
+ LODR_lm=ngram_lm,
683
+ LODR_lm_scale=ngram_lm_scale,
684
+ LM=LM,
685
+ )
686
+
687
+ for f, hyp in zip(filenames, hyps):
688
+ words = sp.decode(hyp)
689
+ print(f"{f.split('/')[-1][0:-4]} {words}")
690
+
691
+ if __name__ == "__main__":
692
+ formatter = "%(asctime)s %(levelname)s [%(filename)s:%(lineno)d] %(message)s"
693
+
694
+ logging.basicConfig(format=formatter, level=logging.INFO)
695
+ main()
lang/bpe.model ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c7a756aeb3550417d6b2ed3efde9a7aa3eea54787d4eac011e9cce6090c9c64a
3
+ size 246184
lang/tokens.txt ADDED
@@ -0,0 +1,502 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <blk> 0
2
+ <sos/eos> 1
3
+ <unk> 2
4
+ е 3
5
+ ▁с 4
6
+ т 5
7
+ ▁в 6
8
+ ▁ 7
9
+ с 8
10
+ н 9
11
+ м 10
12
+ ▁и 11
13
+ и 12
14
+ р 13
15
+ ▁на 14
16
+ ▁по 15
17
+ д 16
18
+ в 17
19
+ у 18
20
+ л 19
21
+ ▁не 20
22
+ к 21
23
+ й 22
24
+ я 23
25
+ а 24
26
+ ра 25
27
+ ▁у 26
28
+ ли 27
29
+ но 28
30
+ ла 29
31
+ ка 30
32
+ х 31
33
+ ч 32
34
+ о 33
35
+ ▁за 34
36
+ з 35
37
+ ю 36
38
+ ло 37
39
+ ни 38
40
+ ▁а 39
41
+ то 40
42
+ ст 41
43
+ ва 42
44
+ г 43
45
+ ы 44
46
+ ▁что 45
47
+ ш 46
48
+ ть 47
49
+ ь 48
50
+ ль 49
51
+ ▁к 50
52
+ ▁я 51
53
+ го 52
54
+ ▁это 53
55
+ ж 54
56
+ на 55
57
+ ро 56
58
+ ▁о 57
59
+ ти 58
60
+ ▁то 59
61
+ ле 60
62
+ во 61
63
+ ре 62
64
+ ки 63
65
+ п 64
66
+ да 65
67
+ ▁вы 66
68
+ б 67
69
+ та 68
70
+ ▁до 69
71
+ ри 70
72
+ ▁при 71
73
+ ▁как 72
74
+ ▁от 73
75
+ ▁но 74
76
+ ▁про 75
77
+ ▁так 76
78
+ ко 77
79
+ ▁да 78
80
+ ▁д 79
81
+ ви 80
82
+ не 81
83
+ те 82
84
+ ет 83
85
+ ру 84
86
+ ▁со 85
87
+ ▁об 86
88
+ ди 87
89
+ ▁все 88
90
+ ▁ко 89
91
+ ми 90
92
+ ой 91
93
+ ве 92
94
+ ▁мо 93
95
+ чи 94
96
+ ля 95
97
+ - 96
98
+ ▁он 97
99
+ ё 98
100
+ ку 99
101
+ ов 100
102
+ ом 101
103
+ до 102
104
+ че 103
105
+ ▁п 104
106
+ ма 105
107
+ ча 106
108
+ ▁го 107
109
+ ту 108
110
+ де 109
111
+ ся 110
112
+ ▁ма 111
113
+ лу 112
114
+ же 113
115
+ ц 114
116
+ ▁т 115
117
+ ▁г 116
118
+ ▁м 117
119
+ ▁из 118
120
+ ем 119
121
+ ан 120
122
+ ▁вот 121
123
+ ▁во 122
124
+ ▁раз 123
125
+ жи 124
126
+ ста 125
127
+ по 126
128
+ ши 127
129
+ ный 128
130
+ ▁есть 129
131
+ ▁б 130
132
+ ше 131
133
+ ▁ли 132
134
+ за 133
135
+ ▁з 134
136
+ бо 135
137
+ га 136
138
+ ▁ка 137
139
+ ▁мы 138
140
+ мо 139
141
+ ▁де 140
142
+ сти 141
143
+ ▁те 142
144
+ ну 143
145
+ ▁под 144
146
+ тор 145
147
+ ить 146
148
+ ▁бы 147
149
+ ▁ни 148
150
+ ▁ф 149
151
+ ▁э 150
152
+ ▁ре 151
153
+ ные 152
154
+ ать 153
155
+ ры 154
156
+ мен 155
157
+ ▁мне 156
158
+ ение 157
159
+ ей 158
160
+ ня 159
161
+ па 160
162
+ ▁же 161
163
+ му 162
164
+ пе 163
165
+ ения 164
166
+ ду 165
167
+ ги 166
168
+ ф 167
169
+ сь 168
170
+ об 169
171
+ ны 170
172
+ ется 171
173
+ ты 172
174
+ ▁пере 173
175
+ со 174
176
+ ую 175
177
+ ал 176
178
+ ▁его 177
179
+ ого 178
180
+ лю 179
181
+ це 180
182
+ ▁ну 181
183
+ вер 182
184
+ ной 183
185
+ ци 184
186
+ жа 185
187
+ им 186
188
+ щи 187
189
+ ▁па 188
190
+ би 189
191
+ ят 190
192
+ ▁ро 191
193
+ ▁если 192
194
+ ного 193
195
+ ёт 194
196
+ ск 195
197
+ ных 196
198
+ ход 197
199
+ щ 198
200
+ ще 199
201
+ ая 200
202
+ ров 201
203
+ ▁меня 202
204
+ ▁ш 203
205
+ ▁она 204
206
+ жд 205
207
+ ▁ты 206
208
+ бе 207
209
+ ▁ку 208
210
+ ▁рас 209
211
+ мер 210
212
+ ▁для 211
213
+ ца 212
214
+ ря 213
215
+ ень 214
216
+ ▁бо 215
217
+ ▁бе 216
218
+ си 217
219
+ тель 218
220
+ ная 219
221
+ ным 220
222
+ он 221
223
+ ▁ещё 222
224
+ ▁будет 223
225
+ ▁хо 224
226
+ вы 225
227
+ ▁ми 226
228
+ са 227
229
+ ▁там 228
230
+ лы 229
231
+ ша 230
232
+ ▁ле 231
233
+ ▁они 232
234
+ пу 233
235
+ зна 234
236
+ нов 235
237
+ пи 236
238
+ ое 237
239
+ ба 238
240
+ ил 239
241
+ дел 240
242
+ ▁был 241
243
+ ско 242
244
+ ▁ба 243
245
+ ите 244
246
+ ▁друг 245
247
+ ▁че 246
248
+ ▁вам 247
249
+ ▁х 248
250
+ ый 249
251
+ ▁вид 250
252
+ лов 251
253
+ ▁час 252
254
+ ▁было 253
255
+ ▁только 254
256
+ ▁вас 255
257
+ ке 256
258
+ тер 257
259
+ э 258
260
+ ▁или 259
261
+ ▁когда 260
262
+ ▁сто 261
263
+ ▁уже 262
264
+ ▁нас 263
265
+ вать 264
266
+ ▁пред 265
267
+ ▁может 266
268
+ ▁включи 267
269
+ ▁очень 268
270
+ хо 269
271
+ лись 270
272
+ ха 271
273
+ ▁ра 272
274
+ сть 273
275
+ ство 274
276
+ ▁пре 275
277
+ ное 276
278
+ ков 277
279
+ ▁кон 278
280
+ ▁ис 279
281
+ ами 280
282
+ ▁оп 281
283
+ ▁е 282
284
+ ▁тебя 283
285
+ лась 284
286
+ ▁сам 285
287
+ ания 286
288
+ раз 287
289
+ ник 288
290
+ зы 289
291
+ ▁фильм 290
292
+ ▁один 291
293
+ ▁эти 292
294
+ ним 293
295
+ ▁чтобы 294
296
+ ание 295
297
+ ции 296
298
+ чно 297
299
+ ▁сейчас 298
300
+ ▁бу 299
301
+ ▁нет 300
302
+ ком 301
303
+ ▁просто 302
304
+ ём 303
305
+ ён 304
306
+ лось 305
307
+ фи 306
308
+ ▁три 307
309
+ из 308
310
+ аться 309
311
+ гу 310
312
+ смотр 311
313
+ ▁воз 312
314
+ вор 313
315
+ ▁ком 314
316
+ ▁пер 315
317
+ зи 316
318
+ ▁ж 317
319
+ ▁ос 318
320
+ ▁можно 319
321
+ ▁её 320
322
+ пол 321
323
+ ▁два 322
324
+ ▁оста 323
325
+ ▁вер 324
326
+ нул 325
327
+ ▁сер 326
328
+ ент 327
329
+ ▁люб 328
330
+ ых 329
331
+ ную 330
332
+ пис 331
333
+ ▁чем 332
334
+ ▁после 333
335
+ ▁сказал 334
336
+ ▁пу 335
337
+ тов 336
338
+ айте 337
339
+ ▁му 338
340
+ ▁человек 339
341
+ ▁кар 340
342
+ кой 341
343
+ ешь 342
344
+ ится 343
345
+ ▁сезон 344
346
+ ают 345
347
+ бы 346
348
+ ▁тв 347
349
+ ился 348
350
+ ально 349
351
+ ▁могу 350
352
+ ▁мест 351
353
+ ▁две 352
354
+ тро 353
355
+ пра 354
356
+ ▁боль 355
357
+ ался 356
358
+ ▁где 357
359
+ сси 358
360
+ ▁пи 359
361
+ ща 360
362
+ форм 361
363
+ ▁потому 362
364
+ ▁быть 363
365
+ ▁двадцать 364
366
+ ▁ваш 365
367
+ ёл 366
368
+ про 367
369
+ ность 368
370
+ ▁без 369
371
+ ▁дела 370
372
+ ▁та 371
373
+ ъ 372
374
+ ически 373
375
+ ▁пе 374
376
+ ▁которые 375
377
+ ▁пожалуйста 376
378
+ ▁само 377
379
+ ▁одно 378
380
+ ▁работ 379
381
+ ▁пять 380
382
+ ский 381
383
+ ▁прав 382
384
+ ▁время 383
385
+ ▁даже 384
386
+ ▁смотрешке 385
387
+ ция 386
388
+ ▁здесь 387
389
+ ▁четыре 388
390
+ ской 389
391
+ ственно 390
392
+ ▁этого 391
393
+ ▁гр 392
394
+ ▁нужно 393
395
+ ▁билет 394
396
+ ▁рук 395
397
+ ности 396
398
+ иться 397
399
+ ▁чи 398
400
+ ▁какой 399
401
+ ▁тре 400
402
+ ▁ему 401
403
+ ются 402
404
+ ительно 403
405
+ ▁стан 404
406
+ ▁который 405
407
+ ▁свои 406
408
+ ▁семь 407
409
+ ▁стар 408
410
+ ▁себя 409
411
+ ▁хочу 410
412
+ ▁сколько 411
413
+ ▁теперь 412
414
+ ▁буду 413
415
+ ▁какие 414
416
+ ▁салют 415
417
+ ▁больше 416
418
+ ▁кино 417
419
+ ▁потом 418
420
+ ▁восемь 419
421
+ ▁ничего 420
422
+ ▁след 421
423
+ ▁минут 422
424
+ ская 423
425
+ ▁поезд 424
426
+ ▁сериал 425
427
+ ▁вопрос 426
428
+ ▁спасибо 427
429
+ ▁канал 428
430
+ ▁говорит 429
431
+ ▁хорошо 430
432
+ ▁жив 431
433
+ ▁девять 432
434
+ ▁через 433
435
+ ▁шесть 434
436
+ ▁конечно 435
437
+ ▁тогда 436
438
+ ▁покажи 437
439
+ ▁стал 438
440
+ ▁вообще 439
441
+ ывает 440
442
+ ▁интерес 441
443
+ ▁себе 442
444
+ ▁крас 443
445
+ ▁тридцать 444
446
+ ▁сегодня 445
447
+ ▁действ 446
448
+ ▁сторон 447
449
+ ▁чу 448
450
+ ении 449
451
+ ▁почему 450
452
+ ▁более 451
453
+ ▁поэтому 452
454
+ ▁десят 453
455
+ ▁отправ 454
456
+ ▁знаю 455
457
+ ских 456
458
+ ▁тысяч 457
459
+ ▁всё 458
460
+ ▁можешь 459
461
+ ▁значит 460
462
+ ▁против 461
463
+ ▁ответ 462
464
+ ▁найди 463
465
+ ▁люди 464
466
+ ▁одна 465
467
+ ▁начал 466
468
+ ▁серия 467
469
+ ▁между 468
470
+ ▁свет 469
471
+ ▁именно 470
472
+ ▁телефон 471
473
+ нибудь 472
474
+ ▁пятьдесят 473
475
+ очка 474
476
+ ▁времени 475
477
+ ▁цел 476
478
+ ▁возможно 477
479
+ ▁сказать 478
480
+ ▁глаза 479
481
+ ▁называ 480
482
+ ▁хотел 481
483
+ ▁сорок 482
484
+ ▁поставь 483
485
+ ▁первый 484
486
+ ▁связ 485
487
+ ▁которая 486
488
+ ▁электр 487
489
+ ▁например 488
490
+ ▁ведь 489
491
+ ▁сделать 490
492
+ ▁говорил 491
493
+ ▁благо 492
494
+ ировать 493
495
+ ▁посмотреть 494
496
+ ▁всегда 495
497
+ ▁несколько 496
498
+ ▁людей 497
499
+ ▁случае 498
500
+ ▁гарри 499
501
+ #0 500
502
+ #1 501
lang/unigram_500.vocab ADDED
@@ -0,0 +1,500 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <blk> 0
2
+ <sos/eos> 0
3
+ <unk> 0
4
+ е -3.72421
5
+ ▁с -4.00711
6
+ т -4.08971
7
+ ▁в -4.14234
8
+ ▁ -4.14364
9
+ с -4.15149
10
+ н -4.16546
11
+ м -4.20176
12
+ ▁и -4.21221
13
+ и -4.29997
14
+ р -4.37977
15
+ ▁на -4.3817
16
+ ▁по -4.38887
17
+ д -4.41525
18
+ в -4.41704
19
+ у -4.43597
20
+ л -4.53253
21
+ ▁не -4.56287
22
+ к -4.58558
23
+ й -4.60495
24
+ я -4.64027
25
+ а -4.64466
26
+ ра -4.75414
27
+ ▁у -4.7655
28
+ ли -4.81635
29
+ но -4.86806
30
+ ла -4.87179
31
+ ка -4.92484
32
+ х -4.9503
33
+ ч -4.95321
34
+ о -4.98385
35
+ ▁за -5.05821
36
+ з -5.05928
37
+ ю -5.08551
38
+ ло -5.11068
39
+ ни -5.1306
40
+ ▁а -5.13288
41
+ то -5.13924
42
+ ст -5.14875
43
+ ва -5.15182
44
+ г -5.16538
45
+ ы -5.18352
46
+ ▁что -5.22316
47
+ ш -5.22707
48
+ ть -5.23793
49
+ ь -5.2509
50
+ ль -5.25799
51
+ ▁к -5.26308
52
+ ▁я -5.26591
53
+ го -5.27411
54
+ ▁это -5.29806
55
+ ж -5.3083
56
+ на -5.30963
57
+ ро -5.3109
58
+ ▁о -5.34496
59
+ ти -5.3955
60
+ ▁то -5.40496
61
+ ле -5.41254
62
+ во -5.4165
63
+ ре -5.4188
64
+ ки -5.47916
65
+ п -5.48377
66
+ да -5.52795
67
+ ▁вы -5.52823
68
+ б -5.52901
69
+ та -5.54602
70
+ ▁до -5.55857
71
+ ри -5.56377
72
+ ▁при -5.58046
73
+ ▁как -5.58207
74
+ ▁от -5.63345
75
+ ▁но -5.63407
76
+ ▁про -5.63691
77
+ ▁так -5.6499
78
+ ко -5.65805
79
+ ▁да -5.67491
80
+ ▁д -5.67721
81
+ ви -5.68739
82
+ не -5.6981
83
+ те -5.74268
84
+ ет -5.77888
85
+ ру -5.78523
86
+ ▁со -5.80155
87
+ ▁об -5.80862
88
+ ди -5.85919
89
+ ▁все -5.88436
90
+ ▁ко -5.90038
91
+ ми -5.91224
92
+ ой -5.91948
93
+ ве -5.92044
94
+ ▁мо -5.9268
95
+ чи -5.93594
96
+ ля -5.94037
97
+ - -5.95904
98
+ ▁он -5.97629
99
+ ё -5.99857
100
+ ку -6.00185
101
+ ов -6.01007
102
+ ом -6.0288
103
+ до -6.04131
104
+ че -6.0471
105
+ ▁п -6.05797
106
+ ма -6.06525
107
+ ча -6.07659
108
+ ▁го -6.08481
109
+ ту -6.0907
110
+ де -6.09127
111
+ ся -6.10754
112
+ ▁ма -6.12254
113
+ лу -6.12261
114
+ же -6.15441
115
+ ц -6.17019
116
+ ▁т -6.17707
117
+ ▁г -6.18064
118
+ ▁м -6.187
119
+ ▁из -6.18745
120
+ ем -6.18764
121
+ ан -6.1898
122
+ ▁вот -6.20622
123
+ ▁во -6.21312
124
+ ▁раз -6.21391
125
+ жи -6.21908
126
+ ста -6.2236
127
+ по -6.23241
128
+ ши -6.23353
129
+ ный -6.23429
130
+ ▁есть -6.25535
131
+ ▁б -6.25862
132
+ ше -6.26684
133
+ ▁ли -6.2692
134
+ за -6.27292
135
+ ▁з -6.27702
136
+ бо -6.29133
137
+ га -6.29361
138
+ ▁ка -6.30692
139
+ ▁мы -6.30719
140
+ мо -6.30974
141
+ ▁де -6.31045
142
+ сти -6.32652
143
+ ▁те -6.34079
144
+ ну -6.36912
145
+ ▁под -6.37186
146
+ тор -6.37209
147
+ ить -6.37813
148
+ ▁бы -6.38675
149
+ ▁ни -6.38974
150
+ ▁ф -6.395
151
+ ▁э -6.39689
152
+ ▁ре -6.4069
153
+ ные -6.40992
154
+ ать -6.41185
155
+ ры -6.41376
156
+ мен -6.42197
157
+ ▁мне -6.42556
158
+ ение -6.43243
159
+ ей -6.44644
160
+ ня -6.45298
161
+ па -6.45865
162
+ ▁же -6.46201
163
+ му -6.48738
164
+ пе -6.49161
165
+ ения -6.49489
166
+ ду -6.50284
167
+ ги -6.50349
168
+ ф -6.50672
169
+ сь -6.50802
170
+ об -6.51477
171
+ ны -6.51839
172
+ ется -6.5246
173
+ ты -6.52819
174
+ ▁пере -6.53089
175
+ со -6.53688
176
+ ую -6.53716
177
+ ал -6.53947
178
+ ▁его -6.54683
179
+ ого -6.5558
180
+ лю -6.57673
181
+ це -6.60805
182
+ ▁ну -6.61118
183
+ вер -6.61359
184
+ ной -6.61434
185
+ ци -6.61518
186
+ жа -6.62145
187
+ им -6.62822
188
+ щи -6.6424
189
+ ▁па -6.65636
190
+ би -6.65941
191
+ ят -6.67541
192
+ ▁ро -6.69099
193
+ ▁если -6.70234
194
+ ного -6.71022
195
+ ёт -6.71453
196
+ ск -6.71786
197
+ ных -6.71869
198
+ ход -6.72616
199
+ щ -6.7273
200
+ ще -6.73349
201
+ ая -6.73537
202
+ ров -6.75237
203
+ ▁меня -6.75302
204
+ ▁ш -6.75798
205
+ ▁она -6.76858
206
+ жд -6.77673
207
+ ▁ты -6.77867
208
+ бе -6.79111
209
+ ▁ку -6.79506
210
+ ▁рас -6.79763
211
+ мер -6.79882
212
+ ▁для -6.8128
213
+ ца -6.82069
214
+ ря -6.83478
215
+ ень -6.83977
216
+ ▁бо -6.84372
217
+ ▁бе -6.84714
218
+ си -6.85532
219
+ тель -6.85941
220
+ ная -6.86527
221
+ ным -6.86943
222
+ он -6.88114
223
+ ▁ещё -6.8825
224
+ ▁будет -6.88757
225
+ ▁хо -6.89723
226
+ вы -6.89731
227
+ ▁ми -6.90201
228
+ са -6.90676
229
+ ▁там -6.91816
230
+ лы -6.92175
231
+ ша -6.92869
232
+ ▁ле -6.93238
233
+ ▁они -6.9348
234
+ пу -6.93718
235
+ зна -6.93926
236
+ нов -6.94786
237
+ пи -6.95597
238
+ ое -6.95774
239
+ ба -6.9586
240
+ ил -6.96984
241
+ дел -6.98119
242
+ ▁был -6.98238
243
+ ско -6.98854
244
+ ▁ба -6.98951
245
+ ите -6.99367
246
+ ▁друг -6.9943
247
+ ▁че -6.99802
248
+ ▁вам -7.01029
249
+ ▁х -7.01148
250
+ ый -7.01826
251
+ ▁вид -7.01874
252
+ лов -7.02428
253
+ ▁час -7.02801
254
+ ▁было -7.03338
255
+ ▁только -7.03819
256
+ ▁вас -7.04398
257
+ ке -7.05017
258
+ тер -7.06037
259
+ э -7.06244
260
+ ▁или -7.06254
261
+ ▁когда -7.06466
262
+ ▁сто -7.07688
263
+ ▁уже -7.0945
264
+ ▁нас -7.0947
265
+ вать -7.09646
266
+ ▁пред -7.1066
267
+ ▁может -7.10866
268
+ ▁включи -7.1111
269
+ ▁очень -7.11544
270
+ хо -7.11665
271
+ лись -7.12812
272
+ ха -7.13242
273
+ ▁ра -7.13898
274
+ сть -7.13935
275
+ ство -7.14754
276
+ ▁пре -7.15134
277
+ ное -7.15238
278
+ ков -7.15586
279
+ ▁кон -7.15816
280
+ ▁ис -7.1604
281
+ ами -7.16615
282
+ ▁оп -7.18563
283
+ ▁е -7.18591
284
+ ▁тебя -7.18813
285
+ лась -7.19185
286
+ ▁сам -7.19982
287
+ ания -7.19995
288
+ раз -7.20058
289
+ ник -7.20603
290
+ зы -7.20843
291
+ ▁фильм -7.21124
292
+ ▁один -7.21558
293
+ ▁эти -7.21559
294
+ ним -7.21944
295
+ ▁чтобы -7.22289
296
+ ание -7.23062
297
+ ции -7.23383
298
+ чно -7.23714
299
+ ▁сейчас -7.24093
300
+ ▁бу -7.24279
301
+ ▁нет -7.24342
302
+ ком -7.24996
303
+ ▁просто -7.2506
304
+ ём -7.2565
305
+ ён -7.26084
306
+ лось -7.26338
307
+ фи -7.26581
308
+ ▁три -7.27362
309
+ из -7.28159
310
+ аться -7.2843
311
+ гу -7.28869
312
+ смотр -7.2938
313
+ ▁воз -7.30375
314
+ вор -7.3041
315
+ ▁ком -7.31052
316
+ ▁пер -7.3106
317
+ зи -7.3194
318
+ ▁ж -7.32187
319
+ ▁ос -7.3302
320
+ ▁можно -7.3382
321
+ ▁её -7.33991
322
+ пол -7.34408
323
+ ▁два -7.34513
324
+ ▁оста -7.3556
325
+ ▁вер -7.36032
326
+ нул -7.36142
327
+ ▁сер -7.36736
328
+ ент -7.37146
329
+ ▁люб -7.37199
330
+ ых -7.37646
331
+ ную -7.37825
332
+ пис -7.37833
333
+ ▁чем -7.38971
334
+ ▁после -7.39552
335
+ ▁сказал -7.3956
336
+ ▁пу -7.39903
337
+ тов -7.39953
338
+ айте -7.40175
339
+ ▁му -7.41591
340
+ ▁человек -7.42485
341
+ ▁кар -7.427
342
+ кой -7.42935
343
+ ешь -7.43681
344
+ ится -7.44416
345
+ ▁сезон -7.45472
346
+ ают -7.46059
347
+ бы -7.46086
348
+ ▁тв -7.46131
349
+ ился -7.46134
350
+ ально -7.46924
351
+ ▁могу -7.47201
352
+ ▁мест -7.47594
353
+ ▁две -7.48553
354
+ тро -7.49256
355
+ пра -7.49279
356
+ ▁боль -7.49293
357
+ ался -7.49695
358
+ ▁где -7.50004
359
+ сси -7.50442
360
+ ▁пи -7.50621
361
+ ща -7.52085
362
+ форм -7.54043
363
+ ▁потому -7.54055
364
+ ▁быть -7.55272
365
+ ▁двадцать -7.55597
366
+ ▁ваш -7.5597
367
+ ёл -7.56701
368
+ про -7.57489
369
+ ность -7.57697
370
+ ▁без -7.57787
371
+ ▁дела -7.58268
372
+ ▁та -7.58835
373
+ ъ -7.59162
374
+ ически -7.59388
375
+ ▁пе -7.59514
376
+ ▁которые -7.59823
377
+ ▁пожалуйста -7.60476
378
+ ▁само -7.62166
379
+ ▁одно -7.62488
380
+ ▁работ -7.62587
381
+ ▁пять -7.63438
382
+ ский -7.63578
383
+ ▁прав -7.64631
384
+ ▁время -7.64938
385
+ ▁даже -7.65259
386
+ ▁смотрешке -7.65371
387
+ ция -7.65981
388
+ ▁здесь -7.6756
389
+ ▁четыре -7.67719
390
+ ской -7.68614
391
+ ственно -7.68683
392
+ ▁этого -7.68729
393
+ ▁гр -7.68949
394
+ ▁нужно -7.68976
395
+ ▁билет -7.69119
396
+ ▁рук -7.69124
397
+ ности -7.70224
398
+ иться -7.71736
399
+ ▁чи -7.74136
400
+ ▁какой -7.74534
401
+ ▁тре -7.75798
402
+ ▁ему -7.76136
403
+ ются -7.76285
404
+ ительно -7.76457
405
+ ▁стан -7.77955
406
+ ▁который -7.78311
407
+ ▁свои -7.79485
408
+ ▁семь -7.80293
409
+ ▁стар -7.82062
410
+ ▁себя -7.829
411
+ ▁хочу -7.82951
412
+ ▁сколько -7.84939
413
+ ▁теперь -7.86712
414
+ ▁буду -7.88652
415
+ ▁какие -7.89257
416
+ ▁салют -7.89721
417
+ ▁больше -7.90363
418
+ ▁кино -7.9076
419
+ ▁потом -7.90802
420
+ ▁восемь -7.92117
421
+ ▁ничего -7.92557
422
+ ▁след -7.93644
423
+ ▁минут -7.93963
424
+ ская -7.94281
425
+ ▁поезд -7.94517
426
+ ▁сериал -7.95059
427
+ ▁вопрос -7.96073
428
+ ▁спасибо -7.96309
429
+ ▁канал -7.9692
430
+ ▁говорит -7.97006
431
+ ▁хорошо -7.9883
432
+ ▁жив -7.99152
433
+ ▁девять -7.99548
434
+ ▁через -8.00708
435
+ ▁шесть -8.01468
436
+ ▁конечно -8.01557
437
+ ▁тогда -8.03135
438
+ ▁покажи -8.0337
439
+ ▁стал -8.03473
440
+ ▁вообще -8.05943
441
+ ывает -8.06989
442
+ ▁интерес -8.07217
443
+ ▁себе -8.09189
444
+ ▁крас -8.10057
445
+ ▁тридцать -8.10802
446
+ ▁сегодня -8.11505
447
+ ▁действ -8.12242
448
+ ▁сторон -8.12496
449
+ ▁чу -8.13269
450
+ ении -8.14634
451
+ ▁почему -8.15047
452
+ ▁более -8.15271
453
+ ▁поэтому -8.16289
454
+ ▁десят -8.16801
455
+ ▁отправ -8.16928
456
+ ▁знаю -8.17321
457
+ ских -8.18712
458
+ ▁тысяч -8.18932
459
+ ▁всё -8.20101
460
+ ▁можешь -8.2129
461
+ ▁значит -8.214
462
+ ▁против -8.22679
463
+ ▁ответ -8.22794
464
+ ▁найди -8.23782
465
+ ▁люди -8.23857
466
+ ▁одна -8.24067
467
+ ▁начал -8.24422
468
+ ▁серия -8.25009
469
+ ▁между -8.26
470
+ ▁свет -8.2639
471
+ ▁именно -8.2677
472
+ ▁телефон -8.27473
473
+ нибудь -8.29168
474
+ ▁пятьдесят -8.30322
475
+ очка -8.30543
476
+ ▁времени -8.31148
477
+ ▁цел -8.33721
478
+ ▁возможно -8.35705
479
+ ▁сказать -8.35962
480
+ ▁глаза -8.37791
481
+ ▁называ -8.3883
482
+ ▁хотел -8.39147
483
+ ▁сорок -8.39892
484
+ ▁поставь -8.41498
485
+ ▁первый -8.41767
486
+ ▁связ -8.4299
487
+ ▁которая -8.43202
488
+ ▁электр -8.43714
489
+ ▁например -8.45837
490
+ ▁ведь -8.45906
491
+ ▁сделать -8.46666
492
+ ▁говорил -8.47077
493
+ ▁благо -8.4716
494
+ ировать -8.48783
495
+ ▁посмотреть -8.48969
496
+ ▁всегда -8.49153
497
+ ▁несколько -8.49574
498
+ ▁людей -8.49624
499
+ ▁случае -8.5061
500
+ ▁гарри -8.5218
lm/2gram.fst.txt ADDED
The diff for this file is too large to render. See raw diff
 
lm/epoch-99.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:0fb6cbccb971a9cfc50c1dc8d2311eee51095ceff68e9bc03810e4176a816feb
3
+ size 406952299
test.wav ADDED
Binary file (227 kB). View file