code: def audio(
      name,
      tensor,
      sample_rate,
      max_outputs=3,
      collections=None,
      family=None,
  ):
      # pylint: disable=line-too-long
      """Outputs a `Summary` protocol buffer with audio.
  
      The summary has up to `max_outputs` summary values containing audio. The
      audio is built from `tensor` which must be 3-D with shape `[batch_size,
      frames, channels]` or 2-D with shape `[batch_size, frames]`. The values are
      assumed to be in the range of `[-1.0, 1.0]` with a sample rate of
      `sample_rate`.
  
      The `tag` in the outputted Summary.Value protobufs is generated based on the
      name, with a suffix depending on the max_outputs setting:
  
      *  If `max_outputs` is 1, the summary value tag is '*name*/audio'.
      *  If `max_outputs` is greater than 1, the summary value tags are
         generated sequentially as '*name*/audio/0', '*name*/audio/1', etc
  
      Args:
        name: A name for the generated node. Will also serve as a series name in
          TensorBoard.
        tensor: A 3-D `float32` `Tensor` of shape `[batch_size, frames, channels]`
          or a 2-D `float32` `Tensor` of shape `[batch_size, frames]`.
        sample_rate: A Scalar `float32` `Tensor` indicating the sample rate of the
          signal in hertz.
        max_outputs: Max number of batch elements to generate audio for.
        collections: Optional list of ops.GraphKeys.  The collections to add the
          summary to.  Defaults to [_ops.GraphKeys.SUMMARIES]
        family: Optional; if provided, used as the prefix of the summary tag name,
          which controls the tab name used for display on Tensorboard.
  
      Returns:
        A scalar `Tensor` of type `string`. The serialized `Summary` protocol
        buffer.
  
      @compatibility(TF2)
      For compatibility purposes, when invoked in TF2 where the outermost context is
      eager mode, this API will check if there is a suitable TF2 summary writer
      context available, and if so will forward this call to that writer instead. A
      "suitable" writer context means that the writer is set as the default writer,
      and there is an associated non-empty value for `step` (see
      `tf.summary.SummaryWriter.as_default`, `tf.summary.experimental.set_step` or
      alternatively `tf.compat.v1.train.create_global_step`). For the forwarded
      call, the arguments here will be passed to the TF2 implementation of
      `tf.summary.audio`, and the return value will be an empty bytestring tensor,
      to avoid duplicate summary writing. This forwarding is best-effort and not all
      arguments will be preserved. Additionally:
  
      * The TF2 op just outputs the data under a single tag that contains multiple
        samples, rather than multiple tags (i.e. no "/0" or "/1" suffixes).
  
      To migrate to TF2, please use `tf.summary.audio` instead. Please check
      [Migrating tf.summary usage to
      TF 2.0](https://www.tensorflow.org/tensorboard/migrate#in_tf_1x) for concrete
      steps for migration.
  
      #### How to Map Arguments
  
      | TF1 Arg Name  | TF2 Arg Name    | Note                                   |
      | :------------ | :-------------- | :------------------------------------- |
      | `name`        | `name`          | -                                      |
      | `tensor`      | `data`          | Input for this argument now must be    |
      :               :                 : three-dimensional `[k, t, c]`, where   :
      :               :                 : `k` is the number of audio clips, `t`  :
      :               :                 : is the number of frames, and `c` is    :
      :               :                 : the number of channels. Two-dimensional:
      :               :                 : input is no longer supported.          :
      | `sample_rate` | `sample_rate`   | -                                      |
      | -             | `step`          | Explicit int64-castable monotonic step |
      :               :                 : value. If omitted, this defaults to    :
      :               :                 : `tf.summary.experimental.get_step()`.  :
      | `max_outputs` | `max_outputs`   | -                                      |
      | `collections` | Not Supported   | -                                      |
      | `family`      | Removed         | Please use `tf.name_scope` instead to  |
      :               :                 : manage summary name prefix.            :
      | -             | `encoding`      | Optional constant str for the desired  |
      :               :                 : encoding. Check the docs for           :
      :               :                 : `tf.summary.audio` for latest supported:
      :               :                 : audio formats.                         :
      | -             | `description`   | Optional long-form `str` description   |
      :               :                 : for the summary. Markdown is supported.:
      :               :                 : Defaults to empty.                     :
  
      @end_compatibility
      """
      if _distribute_summary_op_util.skip_summary():
          return _constant_op.constant("")
  
      # Special case: invoke v2 op for TF2 users who have a v2 writer.
      if _should_invoke_v2_op():
          # Defer the import to happen inside the symbol to prevent breakage due to
          # missing dependency.
          if tensor.shape.rank == 2:
              # TF2 op requires 3-D tensor, add the `channels` dimension.
              tensor = _array_ops.expand_dims_v2(tensor, axis=2)
          with _compat_summary_scope(name, family) as tag:
              tb_summary.audio(
                  name=tag,
                  data=tensor,
                  sample_rate=sample_rate,
                  step=_get_step_for_v2(),
                  max_outputs=max_outputs,
              )
          # Return an empty Tensor, which will be acceptable as an input to the
          # `tf.compat.v1.summary.merge()` API.
          return _constant_op.constant(b"")
  
      # Fall back to legacy v1 audio implementation.
      with _summary_op_util.summary_scope(
          name, family=family, values=[tensor]
      ) as (tag, scope):
          sample_rate = _ops.convert_to_tensor(
              sample_rate, dtype=_dtypes.float32, name="sample_rate"
          )
          val = _gen_logging_ops.audio_summary_v2(
              tag=tag,
              tensor=tensor,
              max_outputs=max_outputs,
              sample_rate=sample_rate,
              name=scope,
          )
          _summary_op_util.collect(
              val, collections, [_ops.GraphKeys.SUMMARIES]
          )
      return val
  
imports: import contextlib
  import warnings
  from google.protobuf import json_format
  from tensorflow.core.framework.summary_pb2 import Summary
  from tensorflow.core.framework.summary_pb2 import SummaryDescription
  from tensorflow.core.framework.summary_pb2 import SummaryMetadata
  from tensorflow.core.util.event_pb2 import Event
  from tensorflow.core.util.event_pb2 import SessionLog
  from tensorflow.core.util.event_pb2 import TaggedRunMetadata
  from tensorflow.python.distribute import summary_op_util
  from tensorflow.python.eager import context
  from tensorflow.python.framework import constant_op
  from tensorflow.python.framework import dtypes
  from tensorflow.python.framework import ops
  from tensorflow.python.ops import array_ops
  from tensorflow.python.ops import gen_logging_ops
  from tensorflow.python.ops import gen_summary_ops
  from tensorflow.python.ops import summary_op_util
  from tensorflow.python.ops import summary_ops_v2
  from tensorflow.python.summary import tb_summary
  from tensorflow.python.summary.writer.writer import FileWriter
  from tensorflow.python.summary.writer.writer_cache import FileWriterCache
  from tensorflow.python.training import training_util
  from tensorflow.python.util import compat
  from tensorflow.python.util.tf_export import tf_export
label_desc: Use image node_id 4 for calling a global function with example usage: audio(name, tensor, sample_rate, max_outputs, collections, family) and returns: val, _constant_op, _constant_op