def en_timbre(a_track, b_track, distance='cos'): ''' computes timbral distance using EN features distance = ['cos'|'euc'|'man'|'all'] default is cos distance, can do all ''' a_bits = track.track_from_url(a_track["streaming"]) b_bits = track.track_from_url(b_track["streaming"]) a_timbre = np.zeros((len(a_bits.segments), 12)) for idx, seg in enumerate(a_bits.segments): a_timbre[idx] = seg['timbre'] a_stack = np.hstack((a_timbre.mean(axis=0),a_timbre.std(axis=0))) b_timbre = np.zeros((len(b_bits.segments), 12)) for idx, seg in enumerate(b_bits.segments): b_timbre[idx] = seg['timbre'] b_stack = np.hstack((b_timbre.mean(axis=0),b_timbre.std(axis=0))) if distance == 'cos': return spatial.distance.cosine(a_stack, b_stack) elif distance == 'euc': return spatial.distance.euclidean(a_stack, b_stack) elif distance == 'man': return spatial.distance.cityblock(a_stack, b_stack)#as in manhatten distance elif distance == 'all': euc = spatial.distance.euclidean(a_stack, b_stack) cos = spatial.distance.cosine(a_stack, b_stack) man = spatial.distance.cityblock(a_stack, b_stack)#as in manhatten distance return euc, cos, man
def main(): if DROPBOX_APP_KEY == '' or DROPBOX_APP_SECRET == '': exit("You need to set your DROPBOX_APP_KEY and DROPBOX_APP_SECRET!") dbclient = Dropbox(DROPBOX_APP_KEY, DROPBOX_APP_SECRET) all_files = dbclient.all_files() import random random.shuffle(all_files) for f in all_files: fnew = DEFAULT + f["path"] + ".json" if os.path.exists(fnew): continue # Skip things we've analyzed try: print >> sys.stderr, "%s" % f["path"] fmedia = dbclient.api_client.media(f["path"]) t = track.track_from_url(fmedia["url"]) # print t.__dict__ r = requests.get(t.analysis_url) if r.status_code == 200 and r.headers[ 'content-type'] == "application/json": d = os.path.split(fnew) mkdir_p(d[0]) open(fnew, "wt").write(r.text) # dbclient.api_client.put_file(fnew, r.text) print >> sys.stderr, "... %s" % fnew # print f["path"] + ".json" # print r.json() else: print >> sys.stderr, "Error on %s, %s, %s" % ( f["path"], r.status_code, r.headers['content-type']) # break except Exception, e: print >> sys.stderr, type(e), e, f["path"]
def main(): if DROPBOX_APP_KEY == '' or DROPBOX_APP_SECRET == '': exit("You need to set your DROPBOX_APP_KEY and DROPBOX_APP_SECRET!") dbclient = Dropbox(DROPBOX_APP_KEY, DROPBOX_APP_SECRET) all_files = dbclient.all_files() import random random.shuffle(all_files) for f in all_files: fnew = DEFAULT + f["path"] + ".json" if os.path.exists(fnew): continue # Skip things we've analyzed try: print >> sys.stderr, "%s" % f["path"] fmedia = dbclient.api_client.media(f["path"]) t = track.track_from_url(fmedia["url"]) # print t.__dict__ r = requests.get(t.analysis_url) if r.status_code == 200 and r.headers['content-type'] == "application/json": d = os.path.split(fnew) mkdir_p(d[0]) open(fnew, "wt").write(r.text) # dbclient.api_client.put_file(fnew, r.text) print >> sys.stderr, "... %s" % fnew # print f["path"] + ".json" # print r.json() else: print >> sys.stderr, "Error on %s, %s, %s" % (f["path"], r.status_code, r.headers['content-type']) # break except Exception, e: print >> sys.stderr, type(e), e, f["path"]
def default(self, track_a, track_b): """ takes in two track ids from sc and grabs some analyze from EN. Uses this to make a similarity assertion between the two tracks. Note, doing everything in approximately the stupidist way possible, so ymmv. """ root = init_scope() a_track = root.tracks(int(track_a)) b_track = root.tracks(int(track_b)) a_bits = track.track_from_url(a_track.stream_url) b_bits = track.track_from_url(b_track.stream_url) a_timbre = np.zeros((len(a_bits.segments), 12)) for idx, seg in enumerate(a_bits.segments): a_timbre[idx] = seg['timbre'] a_stack = np.hstack((a_timbre.mean(axis=0),a_timbre.std(axis=0))) b_timbre = np.zeros((len(b_bits.segments), 12)) for idx, seg in enumerate(b_bits.segments): b_timbre[idx] = seg['timbre'] b_stack = np.hstack((b_timbre.mean(axis=0),b_timbre.std(axis=0))) euc = spatial.distance.euclidean(a_stack, b_stack) cos = spatial.distance.cosine(a_stack, b_stack) man = spatial.distance.cityblock(a_stack, b_stack)#as in manhatten distance return """ timbral distance between <a href='{0}'>{1}</a> and <a href='{2}'>{3}</a> in various ways <ul> <li> Euclidean distance: {4}</li> <li> Cosine distance: {5}</li> <li> City block distance {6}</li> </ul> (<a href="../">back</a>) """.format( a_track.permalink_url, "'"+a_track.title+"' by "+a_track.user.username, b_track.permalink_url, "'"+b_track.title+"' by "+b_track.user.username, euc, cos, man)
def echonest_audio(tid): url = 'https://api.soundcloud.com/tracks/%d/stream?consumer_key=17089d3c7d05cb2cfdffe46c2e486ff0' %tid print url attributes = {} try: t = track.track_from_url(url) wait = t.get_analysis() att = dir(t) eid = t.id attributes['tid'] = tid attributes['eid'] = eid key_attribute_list = ['instrumentalness', 'valence', 'loudness', 'duration', 'key', 'mode', 'danceability', 'acousticness', 'speechiness', 'tempo', 'liveness', 'energy'] segment_attr_list = ['pitches', 'timbre'] for a in att: if a in key_attribute_list: ta = getattr(t,a) attributes[a] = ta segment_data = t.segments # average loudness over all segments feature = 'loudness_max' subs = [] for i in segment_data: subs.append(i[feature]) attributes[feature+"_mean"] = np.mean(subs) attributes[feature+"_std"] = np.std(subs) attributes[feature+"_kurt"]= stats.kurtosis(subs) attributes[feature+"_skew"] =stats.skew(subs) # pitch and timbre have multiple levels for feature in segment_attr_list: for j in range(len(segment_data[0][feature])): subs = [] if j<9: featurestr = feature +"0" else: featurestr = feature for i in segment_data: subs.append(i[feature][j]) attributes[featurestr+str(j+1)+"_mean"] = np.mean(subs) attributes[featurestr+str(j+1)+"_std"] = np.std(subs) attributes[featurestr+str(j+1)+"_kurt"] = stats.kurtosis(subs) attributes[featurestr+str(j+1)+"_skew"] = stats.skew(subs) import pdb; pdb.set_trace() except: pass return attributes
def _api_call(url): track = etrack.track_from_url(url) track.get_analysis() return track