class_docstr: Asynchronously record and buffer audio using pyaudio.
  
  This class wraps the pyaudio interface. It contains a queue.Queue object to
  hold chunks of raw audio, and a callback function _enqueue_audio() which
  places raw audio into this queue. This allows the pyaudio.Stream object to
  record asynchronously at low latency.
  
  The class acts as a context manager. When entering the context it creates a
  pyaudio.Stream object and starts recording; it stops recording on exit. The
  Stream saves all of its audio to the Queue as two-tuples of
  (timestamp, raw_audio). The raw_audio is available from the queue as a numpy
  array using the get_audio() function.
  
  This class uses the term "frame" in the same sense that PortAudio does, so
  "frame" means something different here than elsewhere in the daredevil stack.
  A frame in PortAudio is one audio sample across all channels, so one frame of
  16-bit stereo audio is four bytes of data as two 16-bit integers.
code: def __exit__(self, exception_type, exception_value, traceback):
      self._stream.stop_stream()
      self._stream.close()
      logging.info("Stopped and closed audio stream.")
  
imports: import importlib
  import math
  import queue
  import time
  from absl import logging
  import numpy
  import pyaudio
  import scipy
  import six
label_desc: Use image node_id 3 for calling the AudioRecorder obj's underlying member method code with example usage: obj.__exit__(exception_type, exception_value, traceback) without return types