class_docstr: Creates a new ``AudioData`` instance, which represents mono audio data.
  
  The raw audio data is specified by ``frame_data``, which is a sequence of bytes representing audio samples. This is the frame data structure used by the PCM WAV format.
  
  The width of each sample, in bytes, is specified by ``sample_width``. Each group of ``sample_width`` bytes represents a single audio sample.
  
  The audio data is assumed to have a sample rate of ``sample_rate`` samples per second (Hertz).
  
  Usually, instances of this class are obtained from ``recognizer_instance.record`` or ``recognizer_instance.listen``, or in the callback for ``recognizer_instance.listen_in_background``, rather than instantiating them directly.
class_docstr_tok: ["Creates","a","new","``","AudioData","``","instance",",","which","represents","mono","audio","data",".","The","raw","audio","data","is","specified","by","``","frame_data","``",",","which","is","a","sequence","of","bytes","representing","audio","samples",".","This","is","the","frame","data","structure","used","by","the","PCM","WAV","format",".","The","width","of","each","sample",",","in","bytes",",","is","specified","by","``","sample_width","``",".","Each","group","of","``","sample_width","``","bytes","represents","a","single","audio","sample",".","The","audio","data","is","assumed","to","have","a","sample","rate","of","``","sample_rate","``","samples","per","second","(","Hertz",")",".","Usually",",","instances","of","this","class","are","obtained","from","``","recognizer_instance.record","``","or","``","recognizer_instance.listen","``",",","or","in","the","callback","for","``","recognizer_instance.listen_in_background","``",",","rather","than","instantiating","them","directly","."]
docstr: Returns a byte string representing the raw frame data for the audio represented by the ``AudioData`` instance.
  
  If ``convert_rate`` is specified and the audio sample rate is not ``convert_rate`` Hz, the resulting audio is resampled to match.
  
  If ``convert_width`` is specified and the audio samples are not ``convert_width`` bytes each, the resulting audio is converted to match.
  
  Writing these bytes directly to a file results in a valid `RAW/PCM audio file <https://en.wikipedia.org/wiki/Raw_audio_format>`__.
docstr_tok: ["Returns","a","byte","string","representing","the","raw","frame","data","for","the","audio","represented","by","the","``","AudioData","``","instance",".","If","``","convert_rate","``","is","specified","and","the","audio","sample","rate","is","not","``","convert_rate","``","Hz",",","the","resulting","audio","is","resampled","to","match",".","If","``","convert_width","``","is","specified","and","the","audio","samples","are","not","``","convert_width","``","bytes","each",",","the","resulting","audio","is","converted","to","match",".","Writing","these","bytes","directly","to","a","file","results","in","a","valid","`","RAW\/PCM","audio","file","<","https",":","\/\/en.wikipedia.org\/wiki\/Raw_audio_format",">","`","__","."]
code: def get_raw_data(self, convert_rate=None, convert_width=None):
      """
      Returns a byte string representing the raw frame data for the audio represented by the ``AudioData`` instance.
  
      If ``convert_rate`` is specified and the audio sample rate is not ``convert_rate`` Hz, the resulting audio is resampled to match.
  
      If ``convert_width`` is specified and the audio samples are not ``convert_width`` bytes each, the resulting audio is converted to match.
  
      Writing these bytes directly to a file results in a valid `RAW/PCM audio file <https://en.wikipedia.org/wiki/Raw_audio_format>`__.
      """
      assert (
          convert_rate is None or convert_rate > 0
      ), "Sample rate to convert to must be a positive integer"
      assert convert_width is None or (
          convert_width % 1 == 0 and 1 <= convert_width <= 4
      ), "Sample width to convert to must be between 1 and 4 inclusive"
  
      raw_data = self.frame_data
  
      # make sure unsigned 8-bit audio (which uses unsigned samples) is handled like higher sample width audio (which uses signed samples)
      if self.sample_width == 1:
          raw_data = audioop.bias(
              raw_data, 1, -128
          )  # subtract 128 from every sample to make them act like signed samples
  
      # resample audio at the desired rate if specified
      if convert_rate is not None and self.sample_rate != convert_rate:
          raw_data, _ = audioop.ratecv(
              raw_data,
              self.sample_width,
              1,
              self.sample_rate,
              convert_rate,
              None,
          )
  
      # convert samples to desired sample width if specified
      if (
          convert_width is not None
          and self.sample_width != convert_width
      ):
          if (
              convert_width == 3
          ):  # we're converting the audio into 24-bit (workaround for https://bugs.python.org/issue12866)
              raw_data = audioop.lin2lin(
                  raw_data, self.sample_width, 4
              )  # convert audio into 32-bit first, which is always supported
              try:
                  audioop.bias(
                      b"", 3, 0
                  )  # test whether 24-bit audio is supported (for example, ``audioop`` in Python 3.3 and below don't support sample width 3, while Python 3.4+ do)
              except (
                  audioop.error
              ):  # this version of audioop doesn't support 24-bit audio (probably Python 3.3 or less)
                  raw_data = b"".join(
                      raw_data[i + 1 : i + 4]
                      for i in range(0, len(raw_data), 4)
                  )  # since we're in little endian, we discard the first byte from each 32-bit sample to get a 24-bit sample
              else:  # 24-bit audio fully supported, we don't need to shim anything
                  raw_data = audioop.lin2lin(
                      raw_data, self.sample_width, convert_width
                  )
          else:
              raw_data = audioop.lin2lin(
                  raw_data, self.sample_width, convert_width
              )
  
      # if the output is 8-bit audio with unsigned samples, convert the samples we've been treating as signed to unsigned again
      if convert_width == 1:
          raw_data = audioop.bias(
              raw_data, 1, 128
          )  # add 128 to every sample to make them act like unsigned samples again
  
      return raw_data
  
file_path: speech_recognition/speech_recognition/audio.py
imports: import aifc
  import audioop
  import io
  import os
  import platform
  import stat
  import subprocess
  import sys
  import wave
label_desc: Use image node_id 3 for calling the AudioData obj's underlying member method code with example usage: obj.get_raw_data(convert_rate, convert_width) and returns: raw_data