class_docstr: This class calculates Viterbi alignments in the forward method.
  
  It also records alignments and creates batches of them for use
  in Viterbi training.
  
  Arguments
  ---------
  states_per_phoneme : int
      Number of hidden states to use per phoneme.
  output_folder : str
      It is the folder that the alignments will be stored in when
      saved to disk. Not yet implemented.
  neg_inf : float
      The float used to represent a negative infinite log probability.
      Using `-float("Inf")` tends to give numerical instability.
      A number more negative than -1e5 also sometimes gave errors when
      the `genbmm` library was used (currently not in use). (default: -1e5)
  batch_reduction : string
      One of "none", "sum" or "mean".
      What kind of batch-level reduction to apply to the loss calculated
      in the forward method.
  input_len_norm : bool
      Whether to normalize the loss in the forward method by the length of
      the inputs.
  target_len_norm : bool
      Whether to normalize the loss in the forward method by the length of
      the targets.
  lexicon_path : string
      The location of the lexicon.
  
  Example
  -------
  >>> log_posteriors = torch.tensor([[[ -1., -10., -10.],
  ...                                 [-10.,  -1., -10.],
  ...                                 [-10., -10.,  -1.]],
  ...
  ...                                [[ -1., -10., -10.],
  ...                                 [-10.,  -1., -10.],
  ...                                 [-10., -10., -10.]]])
  >>> lens = torch.tensor([1., 0.66])
  >>> phns = torch.tensor([[0, 1, 2],
  ...                      [0, 1, 0]])
  >>> phn_lens = torch.tensor([1., 0.66])
  >>> aligner = HMMAligner()
  >>> forward_scores = aligner(
  ...        log_posteriors, lens, phns, phn_lens, 'forward'
  ... )
  >>> forward_scores.shape
  torch.Size([2])
  >>> viterbi_scores, alignments = aligner(
  ...        log_posteriors, lens, phns, phn_lens, 'viterbi'
  ... )
  >>> alignments
  [[0, 1, 2], [0, 1]]
  >>> viterbi_scores.shape
  torch.Size([2])
docstr: Fetches previously recorded Viterbi alignments if they are available.
  If not, fetches flat start alignments.
  Currently, assumes that if a Viterbi alignment is not available for the
  first utterance in the batch, it will not be available for the rest of
  the utterances.
  
  Arguments
  ---------
  ids : list of str
      IDs of the files in the batch.
  emission_pred : torch.Tensor (batch, time, phoneme in vocabulary)
      Posterior probabilities from our acoustic model. Used to infer the
      duration of the longest utterance in the batch.
  lens : torch.Tensor (batch)
      The relative duration of each utterance sound file.
  phns : torch.Tensor (batch, phoneme in phn sequence)
      The phonemes that are known/thought to be in each utterance.
  phn_lens : torch.Tensor (batch)
      The relative length of each phoneme sequence in the batch.
  
  Returns
  -------
  torch.Tensor (batch, time)
      Zero-padded alignments.
  
  Example
  -------
  >>> ids = ['id1', 'id2']
  >>> emission_pred = torch.tensor([[[ -1., -10., -10.],
  ...                                [-10.,  -1., -10.],
  ...                                [-10., -10.,  -1.]],
  ...
  ...                               [[ -1., -10., -10.],
  ...                                [-10.,  -1., -10.],
  ...                                [-10., -10., -10.]]])
  >>> lens = torch.tensor([1., 0.66])
  >>> phns = torch.tensor([[0, 1, 2],
  ...                      [0, 1, 0]])
  >>> phn_lens = torch.tensor([1., 0.66])
  >>> aligner = HMMAligner()
  >>> alignment_batch = aligner.get_prev_alignments(
  ...        ids, emission_pred, lens, phns, phn_lens
  ... )
  >>> alignment_batch
  tensor([[0, 1, 2],
          [0, 1, 0]])
docstr_tok: ["Fetches","previously","recorded","Viterbi","alignments","if","they","are","available",".","If","not",",","fetches","flat","start","alignments",".","Currently",",","assumes","that","if","a","Viterbi","alignment","is","not","available","for","the","first","utterance","in","the","batch",",","it","will","not","be","available","for","the","rest","of","the","utterances",".","Arguments","--","--","--","--","-","ids",":","list","of","str","IDs","of","the","files","in","the","batch",".","emission_pred",":","torch.Tensor","(","batch",",","time",",","phoneme","in","vocabulary",")","Posterior","probabilities","from","our","acoustic","model",".","Used","to","infer","the","duration","of","the","longest","utterance","in","the","batch",".","lens",":","torch.Tensor","(","batch",")","The","relative","duration","of","each","utterance","sound","file",".","phns",":","torch.Tensor","(","batch",",","phoneme","in","phn","sequence",")","The","phonemes","that","are","known\/thought","to","be","in","each","utterance",".","phn_lens",":","torch.Tensor","(","batch",")","The","relative","length","of","each","phoneme","sequence","in","the","batch",".","Returns","--","--","--","-","torch.Tensor","(","batch",",","time",")","Zero-padded","alignments",".","Example","--","--","--","-",">",">",">","ids","=","[","'id1","'",",","'id2","'","]",">",">",">","emission_pred","=","torch.tensor","(","[","[","[","-1.",",","-10.",",","-10",".","]",",","...","[","-10.",",","-1.",",","-10",".","]",",","...","[","-10.",",","-10.",",","-1",".","]","]",",","...","...","[","[","-1.",",","-10.",",","-10",".","]",",","...","[","-10.",",","-1.",",","-10",".","]",",","...","[","-10.",",","-10.",",","-10",".","]","]","]",")",">",">",">","lens","=","torch.tensor","(","[","1.",",","0.66","]",")",">",">",">","phns","=","torch.tensor","(","[","[","0",",","1",",","2","]",",","...","[","0",",","1",",","0","]","]",")",">",">",">","phn_lens","=","torch.tensor","(","[","1.",",","0.66","]",")",">",">",">","aligner","=","HMMAligner","(",")",">",">",">","alignment_batch","=","aligner.get_prev_alignments","(","...","ids",",","emission_pred",",","lens",",","phns",",","phn_lens","...",")",">",">",">","alignment_batch","tensor","(","[","[","0",",","1",",","2","]",",","[","0",",","1",",","0","]","]",")"]
code: def get_prev_alignments(
      self, ids, emission_pred, lens, phns, phn_lens
  ):
      """Fetches previously recorded Viterbi alignments if they are available.
      If not, fetches flat start alignments.
      Currently, assumes that if a Viterbi alignment is not available for the
      first utterance in the batch, it will not be available for the rest of
      the utterances.
  
      Arguments
      ---------
      ids : list of str
          IDs of the files in the batch.
      emission_pred : torch.Tensor (batch, time, phoneme in vocabulary)
          Posterior probabilities from our acoustic model. Used to infer the
          duration of the longest utterance in the batch.
      lens : torch.Tensor (batch)
          The relative duration of each utterance sound file.
      phns : torch.Tensor (batch, phoneme in phn sequence)
          The phonemes that are known/thought to be in each utterance.
      phn_lens : torch.Tensor (batch)
          The relative length of each phoneme sequence in the batch.
  
      Returns
      -------
      torch.Tensor (batch, time)
          Zero-padded alignments.
  
      Example
      -------
      >>> ids = ['id1', 'id2']
      >>> emission_pred = torch.tensor([[[ -1., -10., -10.],
      ...                                [-10.,  -1., -10.],
      ...                                [-10., -10.,  -1.]],
      ...
      ...                               [[ -1., -10., -10.],
      ...                                [-10.,  -1., -10.],
      ...                                [-10., -10., -10.]]])
      >>> lens = torch.tensor([1., 0.66])
      >>> phns = torch.tensor([[0, 1, 2],
      ...                      [0, 1, 0]])
      >>> phn_lens = torch.tensor([1., 0.66])
      >>> aligner = HMMAligner()
      >>> alignment_batch = aligner.get_prev_alignments(
      ...        ids, emission_pred, lens, phns, phn_lens
      ... )
      >>> alignment_batch
      tensor([[0, 1, 2],
              [0, 1, 0]])
      """
  
      lens_abs = torch.round(emission_pred.shape[1] * lens).long()
      phn_lens_abs = torch.round(phns.shape[1] * phn_lens).long()
  
      if ids[0] in self.align_dict:
          return self._get_viterbi_batch(ids, lens_abs)
      else:
          return self._get_flat_start_batch(
              lens_abs, phn_lens_abs, phns
          )
  
imports: import torch
  import random
  from speechbrain.utils.checkpoints import register_checkpoint_hooks
  from speechbrain.utils.checkpoints import mark_as_saver
  from speechbrain.utils.checkpoints import mark_as_loader
  from speechbrain.utils.data_utils import undo_padding
label_desc: Use image node_id 15 for calling the HMMAligner obj's underlying member method code with example usage: obj.get_prev_alignments(ids, emission_pred, lens, phns, phn_lens) and returns: self, self