class_docstr: CTC ASR Model
  reference: https://www.cs.cmu.edu/~ymiao/pub/icassp2016_ctc.pdf
class_docstr_tok: ["CTC","ASR","Model","reference",":","https",":","\/\/www.cs.cmu.edu\/~ymiao\/pub\/icassp2016_ctc.pdf"]
code: def build(self):
      input_tensor = Input(
          name="inputs",
          shape=(None, *self._feat_shape, 1),
          dtype=tf.float32,
      )
  
      x = input_tensor
      _, _, dim, channels = x.get_shape().as_list()
      output_dim = dim * channels
      x = Reshape((-1, output_dim))(x)
  
      x = Bidirectional(
          LSTM(
              units=320,
              kernel_initializer="glorot_uniform",
              bias_initializer="random_normal",
              return_sequences=True,
              name="lstm",
          )
      )(x)
  
      x = Bidirectional(
          LSTM(
              units=320,
              kernel_initializer="glorot_uniform",
              bias_initializer="random_normal",
              return_sequences=True,
              name="lstm1",
          )
      )(x)
  
      x = Bidirectional(
          LSTM(
              units=320,
              kernel_initializer="glorot_uniform",
              bias_initializer="random_normal",
              return_sequences=True,
              name="lstm2",
          )
      )(x)
  
      x = Bidirectional(
          LSTM(
              units=320,
              kernel_initializer="glorot_uniform",
              bias_initializer="random_normal",
              return_sequences=True,
              name="lstm3",
          )
      )(x)
  
      x = Bidirectional(
          LSTM(
              units=320,
              kernel_initializer="glorot_uniform",
              bias_initializer="random_normal",
              return_sequences=True,
              name="lstm4",
          )
      )(x)
  
      # Output layer with softmax
      x = TimeDistributed(Dense(self._vocab_size), name="outputs")(x)
  
      input_length = Input(name="input_length", shape=[], dtype="int64")
      labels = Input(name="targets", shape=[None], dtype="int32")
      label_length = Input(
          name="target_length", shape=[], dtype="int64"
      )
      loss_out = Lambda(
          self.ctc_lambda_func, output_shape=(), name="ctc"
      )([x, input_length, labels, label_length])
  
      self._model = tf.keras.Model(
          inputs=[input_tensor, labels, input_length, label_length],
          outputs=[loss_out],
      )
  
imports: import delta.compat
  from tensorflow.keras import backend
  from tensorflow.keras.models import Model
  from tensorflow.keras.layers import Bidirectional
  from tensorflow.keras.layers import Activation
  from tensorflow.keras.layers import LSTM
  from tensorflow.keras.layers import TimeDistributed
  from tensorflow.keras.layers import Conv2D
  from tensorflow.keras.layers import Reshape
  from tensorflow.keras.layers import Dense
  from tensorflow.keras.layers import Lambda
  from tensorflow.keras.layers import Dropout
  from tensorflow.keras.layers import Input
  from absl import logging
  from delta import utils
  from delta.utils.loss.loss_impl import CTCLoss
  from delta.models.base_model import RawModel
  from delta.utils.register import registers
label_desc: Use image node_id 1 for calling the CTC5BlstmAsrModel obj's underlying member method code with example usage: obj.build() without return types