class_docstr: Compute CTC label sequence scores
  
  which is based on Algorithm 2 in WATANABE et al.
  "HYBRID CTC/ATTENTION ARCHITECTURE FOR END-TO-END SPEECH RECOGNITION,"
  but extended to efficiently compute the probablities of multiple labels
  simultaneously
class_docstr_tok: ["Compute","CTC","label","sequence","scores","which","is","based","on","Algorithm","2","in","WATANABE","et","al",".","``","HYBRID","CTC\/ATTENTION","ARCHITECTURE","FOR","END-TO-END","SPEECH","RECOGNITION",",","''","but","extended","to","efficiently","compute","the","probablities","of","multiple","labels","simultaneously"]
docstr: Compute CTC prefix scores for next labels
  
  :param y     : prefix label sequence
  :param cs    : array of next labels
  :param r_prev: previous CTC state
  :return ctc_scores, ctc_states
docstr_tok: ["Compute","CTC","prefix","scores","for","next","labels",":","param","y",":","prefix","label","sequence",":","param","cs",":","array","of","next","labels",":","param","r_prev",":","previous","CTC","state",":","return","ctc_scores",",","ctc_states"]
code: def __call__(self, y, cs, r_prev):
      """Compute CTC prefix scores for next labels
  
      :param y     : prefix label sequence
      :param cs    : array of next labels
      :param r_prev: previous CTC state
      :return ctc_scores, ctc_states
      """
      # initialize CTC states
      output_length = len(y) - 1  # ignore sos
      # new CTC states are prepared as a frame x (n or b) x n_labels tensor
      # that corresponds to r_t^n(h) and r_t^b(h).
      r = self.xp.ndarray(
          (self.input_length, 2, len(cs)), dtype=np.float32
      )
      xs = self.x[:, cs]
      if output_length == 0:
          r[0, 0] = xs[0]
          r[0, 1] = self.logzero
      else:
          r[output_length - 1] = self.logzero
  
      # prepare forward probabilities for the last label
      r_sum = self.xp.logaddexp(
          r_prev[:, 0], r_prev[:, 1]
      )  # log(r_t^n(g) + r_t^b(g))
      last = y[-1]
      if output_length > 0 and last in cs:
          log_phi = self.xp.ndarray(
              (self.input_length, len(cs)), dtype=np.float32
          )
          for i in range(len(cs)):
              log_phi[:, i] = r_sum if cs[i] != last else r_prev[:, 1]
      else:
          log_phi = r_sum
  
      # compute forward probabilities log(r_t^n(h)), log(r_t^b(h)),
      # and log prefix probabilities log(psi)
      start = max(output_length, 1)
      log_psi = r[start - 1, 0]
      for t in range(start, self.input_length):
          r[t, 0] = (
              self.xp.logaddexp(r[t - 1, 0], log_phi[t - 1]) + xs[t]
          )
          r[t, 1] = (
              self.xp.logaddexp(r[t - 1, 0], r[t - 1, 1])
              + self.x[t, self.blank]
          )
          log_psi = self.xp.logaddexp(log_psi, log_phi[t - 1] + xs[t])
  
      # get P(...eos|X) that ends with the prefix itself
      eos_pos = self.xp.where(cs == self.eos)[0]
      if len(eos_pos) > 0:
          log_psi[eos_pos] = r_sum[-1]  # log(r_T^n(g) + r_T^b(g))
  
      # exclude blank probs
      blank_pos = self.xp.where(cs == self.blank)[0]
      if len(blank_pos) > 0:
          log_psi[blank_pos] = self.logzero
  
      # return the log prefix probability and CTC states, where the label axis
      # of the CTC states is moved to the first axis to slice it easily
      return log_psi, self.xp.rollaxis(r, 2)
  
file_path: espnet/espnet/nets/ctc_prefix_score.py
imports: import numpy
  import torch
label_desc: Use image node_id 3 for calling the CTCPrefixScore obj's underlying member method code with example usage: obj.__call__(y, cs, r_prev) and returns: log_psi,  self