Example #1
0
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
Example #2
0
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"]
Example #3
0
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"]
Example #4
0
	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)
Example #5
0
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
Example #6
0
 def _api_call(url):
     track = etrack.track_from_url(url)
     track.get_analysis()
     return track