code: def get_audio_summary(self, cache=True):
          
          if not (cache and ('audio_summary' in self.cache)):
              response = self.get_attribute('profile', bucket='audio_summary')
              if response['songs'] and 'audio_summary' in response['songs'][0]:
                  self.cache['audio_summary'] = response['songs'][0]['audio_summary']
              else:
                  self.cache['audio_summary'] = {}
          return self.cache['audio_summary']
docs: Get an audio summary of a song containing mode, tempo, key, duration, time signature, loudness, danceability, energy, and analysis_url.
          
          Args:
          
          Kwargs:
              cache (bool): A boolean indicating whether or not the cached value should be used (if available). Defaults to True.
          
          Returns:
              A dictionary containing mode, tempo, key, duration, time signature, loudness, danceability, energy and analysis_url keys.
              
          Example:
              >>> s = song.Song('SOGNMKX12B0B806320')
              >>> s.audio_summary
               {u'analysis_url': u'https://echonest-analysis.s3.amazonaws.com/TR/RnMKCg47J5LgQZr0SISyoPuRxKVQx3Z_YSuhVa/3/full.json?Signature=KBUbewLiP3sZ2X6rRZzXhrgh8fw%3D&Expires=1349809604&AWSAccessKeyId=AKIAJRDFEY23UEVW42BQ',
                u'audio_md5': u'ca3fdfa72eed23d5ad89872c38cecc0e',
                u'danceability': 0.33712086491871546,
                u'duration': 470.70666999999997,
                u'energy': 0.58186979146361684,
                u'key': 0,
                u'liveness': 0.08676759933615498,
                u'loudness': -9.5960000000000001,
                u'mode': 1,
                u'speechiness': 0.036938896635994867,
                u'tempo': 126.949,
                u'time_signature': 4}
              >>>