SPOTISCIENCE: Una Herramienta Para Data Scientists y Music Lovers

Cristóbal V
Ciencia y Datos
Published in
9 min readJul 6, 2021

Spotiscience busca facilitar la descarga y predicción de datos en la música de Spotify.

Photo by Eric Nopanen on Unsplash

¿A quién no le gusta trabajar con música?, somos muchos los que trabajamos todo el día con Spotify corriendo de fondo en nuestros computadores, mientras la música aleatoria de las playlists y artistas que nos gustan van generando con sus melodías un ambiente mágico y nos entregan esa píldora energética tan necesaria para trabajar con toda productividad.

Con el fin de integrar mi trabajo como Data Scientist y mi pasión por la música , decidí crear una herramienta llamada “Spotiscience”, la cual permite descargar datos de canciones, artistas, álbumes y playlists utilizando la API oficial de Spotify. Ademas estos datos son modelados para generar nuevos datos, como saber el estado de animo de una canción, las temáticas de las letras de canciones y encontrar canciones similares, todo esto suena muy interesante, ¿verdad?, si quieres saber más, sigue leyendo este articulo!

En este articulo aprenderás a:

  • Descargar datos de canciones, álbumes, artistas y playlists desde API Spotify
  • Descargar letras de canciones desde API Genius.
  • Predecir el estado de animo de una canción.
  • Encontrar las temáticas1.2 SpotisciencePredicter más importantes de la letra de una canción.
  • Buscar canciones similares en álbumes, discografías de artistas o playlists de Spotify.

Indice

1.1 SpotiscienceDownloader

  • 1.1.1 Configuración Inicial
  • 1.1.2 Extracción de Información de Canciones
  • 1.1.3 Extracción de Álbumes
  • 1.1.4 Extracción de Playlists
  • 1.1.5 Extracción de Información de Playlist y Artista

1.2 SpotisciencePredicter

  • 1.2.1 Configuración Inicial
  • 1.2.2 Predicción de Estado de Animo en Canciones
  • 1.2.3 Predicción de Temáticas en Letras de Canciones
  • 1.2.4 Predicción de Canciones Similares

1. Spotiscience

Spotiscience es un proyecto que realicé en Github programado en Python, con el que puedes interactuar con la API de Spotify y Genius para extraer datos y características de canciones, álbumes, artistas y playlists. Ademas puedes analizar estos datos para generar nueva información tal como predicción de estados de ánimos, modelado de tópicos, y distancias matemáticas para encontrar canciones similares. Para descargar Spotiscience puedes acceder al repositorio de Github,

Para comprender el funcionamiento y configuración de Spotiscience, detallaré las dos clases principales de esta herramienta:

1.1 SpotiScienceDownloader

1.1.1 Configuración Inicial

Esta clase es la encargada de extraer los datos desde la API de Spotify y Genius, para utilizarla, se debe configurar de la siguiente manera:

import spotiscience

#create a dictionary with authorization keys
CREDENTIALS = {}
CREDENTIALS['client_id'] = "your_spotify_client_id"
CREDENTIALS['client_secret'] = "your_spotify_client_secret"
CREDENTIALS['redirect_url'] = "your_redirect_url"
CREDENTIALS['user_id'] = "your_spotify_user_id"
CREDENTIALS['genius_access_token'] = "your_genius_access_token"

"""You also can set your credentials id on credentials.py"""
# returns 'downloader class'
sd = spotiscience.SpotiScienceDownloader(credentials=CREDENTIALS)

Para obtener las credenciales de autorización para la API de Spotify y Genius, puedes ver los siguientes tutoriales.

Tutorial Autenticación Web API Spotify

Tutorial Credenciales API Genius

Para obtener el “user_id” de tu cuenta de Spotify, debes acceder a la aplicación de escritorio de Spotify, ir a “perfil”, cliquear en los 3 puntos, y copiar el enlace de perfil de la siguiente manera:

Photo by Author

Obtendrás el siguiente resultado, tu user_id es lo que está en remarcado en negro, lo demás lo debes eliminar:

“https://open.spotify.com/user/{USER_ID}?si=9f52cafadbf148b2”

1.1.2 Extracción de Información de Canciones

Para extraer la información de una canción , primero debes buscar la canción en Spotify y luego copiar el enlace de la canción de la siguiente manera:

Photo by Author

para este caso copié el enlace de la canción Blinding Lights de The Weeknd.

song_copy_link = "https://open.spotify.com/track/0VjIjW4GlUZAMYd2vXMi3b?si=369f90167c9d48fb"song = sd.get_song_features(song_id=song_copy_link)

EL resultado será un diccionario con las siguientes características de la canción. Para obtener mayor información sobre estas características, puedes ver la documentación oficial de la Web APi Spotify sobre Audio Features.

{'id': '0VjIjW4GlUZAMYd2vXMi3b',
'name': 'Blinding Lights',
'artist': 'The Weeknd',
'album': 'After Hours',
'release_date': '2020-03-20',
'popularity': 94,
'length': 200040,
'acousticness': 0.00146,
'danceability': 0.514,
'energy': 0.73,
'instrumentalness': 9.54e-05,
'liveness': 0.0897,
'valence': 0.334,
'loudness': -5.934,
'speechiness': 0.0598,
'tempo': 171.005,
'key': 1,
'time_signature': 4}

Ademas puedes extraer el genero musical y la letra de la canción de la siguiente manera:

# Returns song lyric
sd.get_song_lyrics(songname=song['name'],artistname=song['artist'])
#Returns song Genre
sd.get_song_music_genre(song_id=song['id'])

1.1.3 Extracción de Albums

para extraer las características de las canciones de un álbum, se debe buscar el álbum o los álbumes en Spotify y copiar el enlace del álbum como en el caso de las canciones. El método posee un parámetro id el cual recibe un string o una lista de strings de los enlaces de álbumes y especificar el parámetro is_artist en “False”:

#Returns songs features of album or albumsalbums =[
‘https://open.spotify.com/album/4yP0hdKOZPNshxUOjY0cZj?si=p5ItRNgXRlarmq4cihAVmA&dl_branch=1',
‘https://open.spotify.com/album/6Yf9kML4wT3opmXhTUIfk7?si=clKN-hzuTB236hINPATp-Q&dl_branch=1'
]
sd.get_albums_song_features(id=albums,is_artist=False)

El resultado será un diccionario donde cada llave es el nombre del álbum y el contenido una lista con todas las características de las canciones del álbum.

También se puede descargar la discografía de un artista, para este caso el parámetro id solo recibe un string, y se debe especificar is_artist en “True” de la siguiente manera:

#Returns songs features of artist's discographyartist = 'https://open.spotify.com/artist/4fvA5FEHcdz97gscK90xZa?si=HNLNN7-dS5OR2W9TIUqQug&dl_branch=1'sd.get_albums_song_features(id=artist,is_artist=True)

El resultado al igual que el método anterior, será un diccionario donde cada llave es el nombre del álbum y el contenido una lista con todas las características de canciones del álbum.

1.1.4 Extracción de Playlists

Se pueden extraer las características de canciones de una playlist con el siguiente método. para este caso el parámetro playlist_id solo recibe un string y se debe especificar el total de canciones que se requiere extraer:

#Return song features of playlistplaylist = ‘https://open.spotify.com/playlist/37i9dQZF1DXcfZ6moR6J0G?si=da1435f1a0804933'sd.get_playlist_song_features(playlist_id=playlist,n_songs=50)

El resultado será un diccionario donde la llave es el nombre de la playlist y el contenido una lista con todas las características de canciones de la playlist.

1.1.5 Extracción de Información de Playlist y Artista

Por ultimo se puede extraer la información básica de una playlist y un artista de la siguiente forma:

playlist = ‘https://open.spotify.com/playlist/37i9dQZF1DXcfZ6moR6J0G?si=da1435f1a0804933'artist = 'metallica'#Returns playlist information
sd.get_playlist_information(playlist_id=playlist)
#Returns song information
sd.get_artist_information(artist=artist)

los resultados serán dos diccionarios con la información de la playlist y del artista respectivamente.

Para un mayor detalle de los parámetros de todos los métodos de SpotiScienceDownloader, puedes acceder al código fuente del módulo downloader.py del proyecto Spotiscience aquí.

1.2 SpotiSciencePredicter

Esta clase es la encargada de modelar los datos de canciones utilizando técnicas de clasificación para aprendizaje supervisado, modelación de tópicos con procesamiento del lenguaje natural y similitud de canciones con distancias matemáticas.

1.2.1 Configuración Inicial

Para configurar esta clase solo debes llamarla de la siguiente manera:

import spotiscience
# returns 'predicter class'
sp = spotiscience.SpotiSciencePredicter()

1.2.2 Predicción de Estado de Animo en Canciones

Para realizar la predicción de estado de animo de canciones, utilicé el enfoque de aprendizaje automático al catalogar una serie de canciones en playlists de estados de animo creadas por Spotify, luego entrené un modelo con el algoritmo RandomForestClassifier para clasificar las canciones en base a sus características.

Para mayor información de este tópico, puedes leer mi articulo sobre Predicción de Estado de Animo de Canciones aquí.

Para predecir el estado de animo, solo se debe pasar los datos de la canción extraído con SpotisciendeDownloader de la siguiente manera:

#returns the tag of mood 
sp.predict_song_mood(song=song)

El resultado será un string con la categoría que corresponde al estado de animo, estas categorías son; “sad, calm, energy y happy”.

1.2.3 Predicción de Temáticas en Letras de Canciones

La predicción de temáticas en letras de canciones utiliza cualquiera de los algoritmos Latent Dirichlet Allocation Model (LDA), Non-Negative Matrix Factorization Model (NMF) o Latent Semantic Indexing Model (LSI) . Para esto me basé en el siguiente articulo el cual puedes leer aquí.

para predecir la temática debes configurar los siguientes parámetros:

  • lyric = letra de la canción
  • model = modelo a utilizar [puede ser “lsi”, “lda” o “nmf”]
  • lang = idioma de la letra de canción [puede ser “english” o “spanish”]
  • n_grams = cantidad de subsequencia de palabras para agrupar
  • n_topics = cantidad de tópicos a retornar
  • top_n = cantidad de palabras por cada tópico a retornar

Para más información sobre el parámetro n_grams ver documentación de sklearn sobre vectorización de texto aquí.

lyric = song_lyrics
model = 'lda' (available type 'lda', 'lsi', 'nmf')
lang = 'english' (available type 'english','spanish')
n_grams = (1,1)
n_topics = 1
top_n = 5
#predict the topics of the song lyric
sp.predict_topic_lyric(lyric,model,lang,n_grams,n_topics,top_n)

1.2.4 Predicción de Canciones Similares

Para predecir la similitud de canciones, generé un enfoque en el cual se miden las distancias Manhattan (l1) o Euclidiana (l2) entre las características de canciones y se ordenan de menor a mayor resultado, con el fin de generar una tupla con las canciones con menor distancia a la canción objetivo, que corresponden a las mas similares.

para predecir la similitud de canciones debes configurar los siguientes parámetros:

  • object = canción de referencia a comparar
  • target = grupo de canciones a evaluar en álbum, playlist o artista.
  • distance = distancia a utilizar [puede ser “l1” o “l2”]
  • n_features = cantidad de características de canciones a utilizar
  • top_n = cantidad de canciones a retornar

Para mas información sobre el parámetro n_features ver código fuente de la clase aquí

Ejemplo 1: Predecir qué canciones de la playlist “Nu Metal Generation” son más similares a la canción “‘Change (In the House of Flies)” de “Deftones”.

playlist_link = "https://open.spotify.com/playlist/37i9dQZF1DXcfZ6moR6J0G?si=452e104160384c8e"song_link = "https://open.spotify.com/track/51c94ac31swyDQj9B3Lzs3?si=5aca903582464acd"target = sd.get_playlist_song_features(playlist_link,n_songs=70)
object = sd.get_song_features(song_link)
distance = 'l2'
n_features = 6
top_n = 10
#returns most similar songs from playlistsp.predict_similar_songs(object,target,distance,n_features,top_n)

Ejemplo 2: Predecir qué canciones de la discografía de “Dua Lipa” son más similares a la canción “Blinding Lights” de “The Weeknd”.

artist_link = "https://open.spotify.com/artist/6M2wZ9GZgrQXHCFfjv46we?si=VJ3J-isZRbSM5x2pNUnrhw&dl_branch=1"song_link = "https://open.spotify.com/track/0VjIjW4GlUZAMYd2vXMi3b?si=369f90167c9d48fb"target = sd.get_albums_song_features(id=artist_link,is_artist=True)
object = sd.get_song_features(song_link)
distance = 'l2'
n_features = 6
top_n = 10
#returns most similar songs from playlistsp.predict_similar_songs(object,target,distance,n_features,top_n)

Ambos resultados de los ejemplos entregarán un diccionario donde la llave es el nombre de la canción de referencia y el contenido corresponde a una lista de tuplas donde cada valor de la tupla es el nombre de la canción similar y la distancia de esta respecto a la canción de referencia.

Nota: También es posible buscar canciones similares en álbumes, sin necesidad de descargar toda la discografía del artista, para esto se puede pasar al parámetro target, las características de los álbumes.

2. Conclusión

Combinar la Ciencia de Datos y la Música puede generar grandes beneficios que sirven para comprender como se desarrolla la música en una cultura de constante cambio, donde el sonido de un instrumento, la poesía lírica y las habilidades vocales se pueden interpretar en tantos significados diferentes.

Con la ayuda de la tecnología, se busca lograr una aproximación de estas interpretaciones y significados para estudiar qué es esa energía invisible que hace que la música nos acompañe durante todo el transcurso de nuestras vidas. Espero que Spotiscience pueda ser una de esas tecnologías que ayude a todos los Data Scientist y Desarrolladores amantes de la música como yo.

3. Referencias

Mis Otros Artículos

--

--