Spleeter

Spleeter es un proyecto de Deezer que permite separar archivos de una canción en varios archivos de audio, cada uno con un instrumento diferente.

En este vídeo se puede ver una demostración bastante aclaratoria:

Spleeter con docker

Vamos a crear un contenedor basándonos en un fichero Dockerfile del proyecto Spleeter.

FROM python:3.7
RUN mkdir -p /model
ENV MODEL_PATH /model
RUN apt-get update && apt-get install -y ffmpeg libsndfile1
RUN pip install musdb museval
RUN pip install spleeter==1.4.5
ENTRYPOINT ["spleeter"]

Este archivo lo guardaremos con el nombre Dockerfile en la carpeta de trabajo que vayamos a usar. Posteriormente construiremos una imagen a partir de este fichero:

$ docker build -t spleeter .

Crearemos una carpeta data/in/ para el fichero de entrada y otra data/out/ para los ficheros de salida:

$ mkdir data/in data/out -p

Ahora copiamos el archivo que queramos separar en data/in y ejecutamos el contenedor:

$ cp archivo_a_separar.mp3 data/in
$ docker run -v $(pwd)/data:/data spleeter separate -i /data/in/archivo_a_separar.mp3 -o /data/out

Esto separará el archivo de entrada en dos ficheros, uno de voz y otro de acompañamiento en la carpeta data/out.

Si queremos separar en 4 pistas (voz, bajo, batería y resto), usaremos el siguiente comando:

$ docker run -v $(pwd)/data:/data spleeter separate -i /data/in/i.mp3 -o /data/out/i2 -p spleeter:4stems

En el momento de escribir este artículo podemos hacer la siguientes separaciones:

  • spleeter:2stems – voz y acompañamiento
  • spleeter:4stems – voz, bajo, batería y resto
  • spleeter:5stems – voz, bajo, batería, piano y resto

Podemos resumir todo con el siguiente script:

$ git clone https://github.com/Deezer/spleeter
$ cp spleeter/docker/python-3.7.dockerfile Dockerfile
$ mkdir data/in data/out -p
$ docker build -t spleeter .
$ cp i.mp3 data/in
$ docker run -v $(pwd)/data:/data spleeter separate -i /data/in/i.mp3 -o /data/out
$ ls data/out

Procesando varios archivos

Si queremos hacer un batch podemos usar el siguiente parámetro para i:

$ eval "files=($(ls --quoting-style=shell-always -vd ./data/in/*.mp3))"
$ ... -i "${files[@]}" ...

Referencias

Empezando con Spleeter