code: def audio_bottom(x, model_hparams, vocab_size):
    
    del vocab_size  # unused arg
    inputs = x
    with tf.variable_scope("audio_modality"):
      # TODO(aidangomez): Will need to sort out a better audio pipeline
      def xnet_resblock(x, filters, res_relu, name):
        """Xception block."""
        with tf.variable_scope(name):
          # Typically audio samples are >100k samples in length and have a width
          # of 2 or 4. Mono audio has a single channel while stereo has 2.
          y = common_layers.separable_conv_block(
              x,
              filters, [((1, 1), (3, 3)), ((1, 1), (3, 3))],
              first_relu=True,
              padding="SAME",
              force2d=True,
              name="sep_conv_block")
          y = common_layers.pool(y, (3, 3), "MAX", "SAME", strides=(2, 2))
          return y + common_layers.conv_block(
              x,
              filters, [((1, 1), (1, 1))],
              padding="SAME",
              strides=(2, 2),
              first_relu=res_relu,
              force2d=True,
              name="res_conv0")
  
      x = tf.to_float(inputs) / 255.
      x.set_shape([None, None, None, 1])
      for i in range(model_hparams.audio_compression):
        x = xnet_resblock(x, 2**(i + 1), True, "compress_block_%d" % i)
      return xnet_resblock(x,
                           model_hparams.hidden_size,
                           False,
                           "compress_block_final")
docs: Transform input from data space to model space.
  
    Args:
      x: A Tensor with shape [batch, ...]
      model_hparams: HParams, model hyperparmeters.
      vocab_size: int, vocabulary size.
  
    Returns:
      body_input: A Tensor with shape [batch, ?, ?,
        model_hparams.hidden_size].