diff --git a/.circleci/config.yml b/.circleci/config.yml deleted file mode 100644 index cd5ff97..0000000 --- a/.circleci/config.yml +++ /dev/null @@ -1,285 +0,0 @@ -version: 2 -jobs: - # ======================================================================================= - # Python 3.6 testing. - # ======================================================================================= - test-3.6: - docker: - - image: python:3.6 - working_directory: ~/spleeter - steps: - - checkout - - restore_cache: - key: models-{{ checksum "spleeter/model/__init__.py" }} - - run: apt-get update && apt-get install -y ffmpeg - - run: pip install -r requirements.txt && pip install pytest pytest-xdist musdb museval - - run: make test - - save_cache: - key: models-{{ checksum "spleeter/model/__init__.py" }} - paths: - - "pretrained_models" - # ======================================================================================= - # Python 3.7 testing. - # ======================================================================================= - test-3.7: - docker: - - image: python:3.7 - working_directory: ~/spleeter - steps: - - checkout - - restore_cache: - key: models-{{ checksum "spleeter/model/__init__.py" }} - - run: apt-get update && apt-get install -y ffmpeg - - run: pip install -r requirements.txt && pip install pytest pytest-xdist musdb museval - - run: make test - - save_cache: - key: models-{{ checksum "spleeter/model/__init__.py" }} - paths: - - "pretrained_models" - # ======================================================================================= - # Source distribution packaging. - # ======================================================================================= - sdist: - docker: - - image: python:3 - steps: - - checkout - - run: make build - - save_cache: - key: sdist-{{ .Branch }}-{{ checksum "setup.py" }} - paths: - - dist - sdist-gpu: - docker: - - image: python:3 - steps: - - checkout - - run: make build-gpu - - save_cache: - key: sdist-{{ .Branch }}-{{ checksum "setup.py" }} - paths: - - dist - # ======================================================================================= - # PyPi deployment. - # ======================================================================================= - pypi-deploy: - docker: - - image: python:3 - steps: - - checkout - - restore_cache: - key: sdist-{{ .Branch }}-{{ checksum "setup.py" }} - - run: - name: upload to PyPi - # TODO: Infer destination regarding of branch. - # - master => production PyPi - # - other => testing PyPi - command: make build deploy - pypi-deploy-gpu: - docker: - - image: python:3 - steps: - - checkout - - restore_cache: - key: sdist-{{ .Branch }}-{{ checksum "setup.py" }} - - run: - name: upload to PyPi - # TODO: Infer destination regarding of branch. - # - master => production PyPi - # - other => testing PyPi - command: make build-gpu deploy - # ======================================================================================= - # Docker build. - # ======================================================================================= - - docker-conda-cpu: - docker: - - image: docker:17.05.0-ce-git - steps: - - checkout - - setup_remote_docker - - run: docker build -t conda -f docker/conda.dockerfile . - - run: docker build --build-arg BASE=conda -t researchdeezer/spleeter:conda -f docker/spleeter-conda.dockerfile . - - run: docker build --build-arg BASE=researchdeezer/spleeter:conda --build-arg MODEL=2stems -t researchdeezer/spleeter:conda-2stems -f docker/spleeter-model.dockerfile . - - run: docker build --build-arg BASE=researchdeezer/spleeter:conda --build-arg MODEL=4stems -t researchdeezer/spleeter:conda-4stems -f docker/spleeter-model.dockerfile . - - run: docker build --build-arg BASE=researchdeezer/spleeter:conda --build-arg MODEL=5stems -t researchdeezer/spleeter:conda-5stems -f docker/spleeter-model.dockerfile . - - run: docker run -v $(pwd):/runtime researchdeezer/spleeter:conda separate -i /runtime/audio_example.mp3 -o /tmp - - run: docker run -v $(pwd):/runtime researchdeezer/spleeter:conda-2stems separate -i /runtime/audio_example.mp3 -o /tmp - - run: docker run -v $(pwd):/runtime researchdeezer/spleeter:conda-4stems separate -i /runtime/audio_example.mp3 -p spleeter:4stems -o /tmp - - run: docker run -v $(pwd):/runtime researchdeezer/spleeter:conda-5stems separate -i /runtime/audio_example.mp3 -p spleeter:5stems -o /tmp - - run: docker login -u $DOCKERHUB_USERNAME -p $DOCKERHUB_PASSWORD - - run: docker push researchdeezer/spleeter:conda - - run: docker push researchdeezer/spleeter:conda-2stems - - run: docker push researchdeezer/spleeter:conda-4stems - - run: docker push researchdeezer/spleeter:conda-5stems - docker-conda-gpu: - docker: - - image: docker:17.05.0-ce-git - steps: - - checkout - - setup_remote_docker - - run: docker build -t conda -f docker/conda.dockerfile . - - run: docker build --build-arg BASE=conda -t conda-gpu -f docker/cuda-10-0.dockerfile . - - run: docker build --build-arg BASE=conda-gpu --build-arg SPLEETER_PACKAGE=spleeter-gpu -t researchdeezer/spleeter:conda-gpu -f docker/spleeter-conda.dockerfile . - - run: docker build --build-arg BASE=researchdeezer/spleeter:conda-gpu --build-arg MODEL=2stems -t researchdeezer/spleeter:conda-gpu-2stems -f docker/spleeter-model.dockerfile . - - run: docker build --build-arg BASE=researchdeezer/spleeter:conda-gpu --build-arg MODEL=4stems -t researchdeezer/spleeter:conda-gpu-4stems -f docker/spleeter-model.dockerfile . - - run: docker build --build-arg BASE=researchdeezer/spleeter:conda-gpu --build-arg MODEL=5stems -t researchdeezer/spleeter:conda-gpu-5stems -f docker/spleeter-model.dockerfile . - - run: docker login -u $DOCKERHUB_USERNAME -p $DOCKERHUB_PASSWORD - - run: docker push researchdeezer/spleeter:conda-gpu - - run: docker push researchdeezer/spleeter:conda-gpu-2stems - - run: docker push researchdeezer/spleeter:conda-gpu-4stems - - run: docker push researchdeezer/spleeter:conda-gpu-5stems - docker-3.6-cpu: - docker: - - image: docker:17.05.0-ce-git - steps: - - checkout - - setup_remote_docker - - run: docker build --build-arg BASE=python:3.6 -t researchdeezer/spleeter:3.6 -f docker/spleeter.dockerfile . - - run: docker build --build-arg BASE=researchdeezer/spleeter:3.6 --build-arg MODEL=2stems -t researchdeezer/spleeter:3.6-2stems -f docker/spleeter-model.dockerfile . - - run: docker build --build-arg BASE=researchdeezer/spleeter:3.6 --build-arg MODEL=4stems -t researchdeezer/spleeter:3.6-4stems -f docker/spleeter-model.dockerfile . - - run: docker build --build-arg BASE=researchdeezer/spleeter:3.6 --build-arg MODEL=5stems -t researchdeezer/spleeter:3.6-5stems -f docker/spleeter-model.dockerfile . - - run: docker run -v $(pwd):/runtime researchdeezer/spleeter:3.6 separate -i /runtime/audio_example.mp3 -o /tmp - - run: docker run -v $(pwd):/runtime researchdeezer/spleeter:3.6-2stems separate -i /runtime/audio_example.mp3 -o /tmp - - run: docker run -v $(pwd):/runtime researchdeezer/spleeter:3.6-4stems separate -i /runtime/audio_example.mp3 -p spleeter:4stems -o /tmp - - run: docker run -v $(pwd):/runtime researchdeezer/spleeter:3.6-5stems separate -i /runtime/audio_example.mp3 -p spleeter:5stems -o /tmp - - run: docker login -u $DOCKERHUB_USERNAME -p $DOCKERHUB_PASSWORD - - run: docker push researchdeezer/spleeter:3.6 - - run: docker push researchdeezer/spleeter:3.6-2stems - - run: docker push researchdeezer/spleeter:3.6-4stems - - run: docker push researchdeezer/spleeter:3.6-5stems - docker-3.6-gpu: - docker: - - image: docker:17.05.0-ce-git - steps: - - checkout - - setup_remote_docker - - run: docker build --build-arg BASE=python:3.6 -t cuda:3.6 -f docker/cuda-10-0.dockerfile . - - run: docker build --build-arg BASE=cuda:3.6 --build-arg SPLEETER_PACKAGE=spleeter-gpu -t researchdeezer/spleeter:3.6-gpu -f docker/spleeter.dockerfile . - - run: docker build --build-arg BASE=researchdeezer/spleeter:3.6-gpu --build-arg MODEL=2stems -t researchdeezer/spleeter:3.6-gpu-2stems -f docker/spleeter-model.dockerfile . - - run: docker build --build-arg BASE=researchdeezer/spleeter:3.6-gpu --build-arg MODEL=4stems -t researchdeezer/spleeter:3.6-gpu-4stems -f docker/spleeter-model.dockerfile . - - run: docker build --build-arg BASE=researchdeezer/spleeter:3.6-gpu --build-arg MODEL=5stems -t researchdeezer/spleeter:3.6-gpu-5stems -f docker/spleeter-model.dockerfile . - - run: docker login -u $DOCKERHUB_USERNAME -p $DOCKERHUB_PASSWORD - - run: docker push researchdeezer/spleeter:3.6-gpu - - run: docker push researchdeezer/spleeter:3.6-gpu-2stems - - run: docker push researchdeezer/spleeter:3.6-gpu-4stems - - run: docker push researchdeezer/spleeter:3.6-gpu-5stems - docker-3.7-cpu: - docker: - - image: docker:17.05.0-ce-git - steps: - - checkout - - setup_remote_docker - - run: docker build --build-arg BASE=python:3.7 -t researchdeezer/spleeter:3.7 -f docker/spleeter.dockerfile . - - run: docker build --build-arg BASE=researchdeezer/spleeter:3.7 --build-arg MODEL=2stems -t researchdeezer/spleeter:3.7-2stems -f docker/spleeter-model.dockerfile . - - run: docker build --build-arg BASE=researchdeezer/spleeter:3.7 --build-arg MODEL=4stems -t researchdeezer/spleeter:3.7-4stems -f docker/spleeter-model.dockerfile . - - run: docker build --build-arg BASE=researchdeezer/spleeter:3.7 --build-arg MODEL=5stems -t researchdeezer/spleeter:3.7-5stems -f docker/spleeter-model.dockerfile . - - run: docker run -v $(pwd):/runtime researchdeezer/spleeter:3.7 separate -i /runtime/audio_example.mp3 -o /tmp - - run: docker run -v $(pwd):/runtime researchdeezer/spleeter:3.7-2stems separate -i /runtime/audio_example.mp3 -o /tmp - - run: docker run -v $(pwd):/runtime researchdeezer/spleeter:3.7-4stems separate -i /runtime/audio_example.mp3 -p spleeter:4stems -o /tmp - - run: docker run -v $(pwd):/runtime researchdeezer/spleeter:3.7-5stems separate -i /runtime/audio_example.mp3 -p spleeter:5stems -o /tmp - - run: docker login -u $DOCKERHUB_USERNAME -p $DOCKERHUB_PASSWORD - - run: docker tag researchdeezer/spleeter:3.7 researchdeezer/spleeter:latest - - run: docker push researchdeezer/spleeter:latest - - run: docker push researchdeezer/spleeter:3.7 - - run: docker push researchdeezer/spleeter:3.7-2stems - - run: docker push researchdeezer/spleeter:3.7-4stems - - run: docker push researchdeezer/spleeter:3.7-5stems - docker-3.7-gpu: - docker: - - image: docker:17.05.0-ce-git - steps: - - checkout - - setup_remote_docker - - run: docker build -t cuda:3.7 -f docker/cuda-10-0.dockerfile . - - run: docker build --build-arg BASE=cuda:3.7 --build-arg SPLEETER_PACKAGE=spleeter-gpu -t researchdeezer/spleeter:3.7-gpu -f docker/spleeter.dockerfile . - - run: docker build --build-arg BASE=researchdeezer/spleeter:3.7-gpu --build-arg MODEL=2stems -t researchdeezer/spleeter:3.7-gpu-2stems -f docker/spleeter-model.dockerfile . - - run: docker build --build-arg BASE=researchdeezer/spleeter:3.7-gpu --build-arg MODEL=4stems -t researchdeezer/spleeter:3.7-gpu-4stems -f docker/spleeter-model.dockerfile . - - run: docker build --build-arg BASE=researchdeezer/spleeter:3.7-gpu --build-arg MODEL=5stems -t researchdeezer/spleeter:3.7-gpu-5stems -f docker/spleeter-model.dockerfile . - - run: docker login -u $DOCKERHUB_USERNAME -p $DOCKERHUB_PASSWORD - - run: docker push researchdeezer/spleeter:3.7-gpu - - run: docker push researchdeezer/spleeter:3.7-gpu-2stems - - run: docker push researchdeezer/spleeter:3.7-gpu-4stems - - run: docker push researchdeezer/spleeter:3.7-gpu-5stems - - run: docker tag researchdeezer/spleeter:3.7-gpu researchdeezer/spleeter:gpu - - run: docker push researchdeezer/spleeter:gpu - -workflows: - version: 2 - spleeter-release-pipeline: - jobs: - - test-3.6 - - test-3.7 - - sdist: - requires: - - test-3.6 - - test-3.7 - - sdist-gpu: - requires: - - test-3.6 - - test-3.7 - - pypi-deploy: - filters: - branches: - only: - - master - requires: - - sdist - - pypi-deploy-gpu: - filters: - branches: - only: - - master - requires: - - sdist-gpu - - conda-forge-validation: - type: approval - requires: - - pypi-deploy - - pypi-deploy-gpu - filters: - branches: - only: - - master - - docker-conda-cpu: - requires: - - conda-forge-validation - filters: - branches: - only: - - master - - docker-conda-gpu: - requires: - - conda-forge-validation - filters: - branches: - only: - - master - - docker-3.6-cpu: - requires: - - pypi-deploy - filters: - branches: - only: - - master - - docker-3.6-gpu: - requires: - - pypi-deploy-gpu - filters: - branches: - only: - - master - - docker-3.7-cpu: - requires: - - pypi-deploy - filters: - branches: - only: - - master - - docker-3.7-gpu: - requires: - - pypi-deploy-gpu - filters: - branches: - only: - - master diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index ee16fc5..de9b1c6 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -14,7 +14,7 @@ Those are the main contributing guidelines for contributing to this project: In order to contribute, the safest is to create your [own fork of spleeter](https://help.github.com/en/github/getting-started-with-github/fork-a-repo) first. The following set of commands will clone this new repository, create a virtual environment provisioned with the dependencies and run the tests (will take a few minutes): ```bash -git clone https://github.com//spleeter +git clone https://github.com//spleeter && cd spleeter python -m venv spleeterenv && source spleeterenv/bin/activate pip install -r requirements.txt && pip install pytest pytest-xdist make test diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml new file mode 100644 index 0000000..3233489 --- /dev/null +++ b/.github/workflows/docker.yml @@ -0,0 +1,81 @@ +name: docker +on: + - workflow_dispatch +jobs: + build-test-push: + runs-on: ubuntu-latest + strategy: + matrix: + platform: [cpu, gpu] + distribution: [3.6, 3.7, conda] + model: [modelless, 2stems, 4stems, 5stems] + fail-fast: true + steps: + - uses: actions/checkout@v2 + # ---------------------------------------------------------------------- + # Note: base image building and env setup. + - name: Setup Python distribution + run: | + echo "::set-env name=base::python:${{ matrix.distribution }}" + echo "::set-env name=tag::${{ matrix.distribution }}" + echo "::set-env name=file::spleeter" + echo "::set-env name=package::spleeter" + - if: ${{ matrix.distribution == 'conda' }} + name: Build Conda base image + run: | + docker build -t python:conda -f docker/conda.dockerfile . + echo "::set-env name=file::spleeter-conda" + - if: ${{ matrix.platform == 'gpu' }} + name: Build CUDA base image + run: | + docker build \ + --build-arg BASE=python:${{ matrix.distribution }} \ + -t cuda:${{ matrix.distribution }} \ + -f docker/cuda-10-0.dockerfile . + echo "::set-env name=base::cuda:${{ matrix.distribution }}" + echo "::set-env name=tag::${{ matrix.distribution }}-gpu" + echo "::set-env name=package::spleeter-gpu" + # ---------------------------------------------------------------------- + # Note: image building. + - name: Build deezer/spleeter:${{ env.tag }} image + run: | + docker build \ + --build-arg BASE=${{ env.base }} \ + --build-arg SPLEETER_PACKAGE=${{ env.package }} \ + -t deezer/spleeter:${{ env.tag }} \ + -f docker/${{ env.file }}.dockerfile . + echo "::set-env name=modelargs::" + - if: ${{ matrix.model != 'modelless' }} + name: Build deezer/spleeter:${{ env.tag }}-${{ matrix.model }} image + run: | + docker build \ + --build-arg BASE=deezer/spleeter:${{ env.tag }} \ + --build-arg MODEL=${{ matrix.model }} \ + -t deezer/spleeter:${{ env.tag }}-${{ matrix.model }} \ + -f docker/spleeter-model.dockerfile . + echo "::set-env name=tag::${{ env.tag }}-${{ matrix.model }}" + echo "::set-env name=modelarg::-p spleeter:${{ matrix.model }}" + # ---------------------------------------------------------------------- + # Note: image testing. + - name: Test deezer/spleeter:${{ env.tag }} image + run: | + docker run \ + -v $(pwd):/runtime \ + deezer/spleeter:${{ env.tag }} \ + separate -i /runtime/audio_example.mp3 -o /tmp \${{ env.modelarg }} + # ---------------------------------------------------------------------- + # Note: image deploy. + - name: Docker login + run: echo ${{ secrets.DOCKERHUB_PASSWORD }} | docker login -u ${{ secrets.DOCKERHUB_USERNAME }} --password-stdin + - name: Push deezer/spleeter:${{ env.tag }} image + run: docker push deezer/spleeter:${{ env.tag }} + - if: ${{ env.tag == 'spleeter:3.7' }} + name: Push deezer/spleeter:latest image + run: | + docker tag deezer/spleeter:3.7 deezer/spleeter:latest + docker push deezer/spleeter:latest + - if: ${{ env.tag == 'spleeter:3.7-gpu' }} + name: Push deezer/spleeter:gpu image + run: | + docker tag deezer/spleeter:3.7-gpu deezer/spleeter:gpu + docker push deezer/spleeter:gpu diff --git a/.github/workflows/pypi.yml b/.github/workflows/pypi.yml new file mode 100644 index 0000000..e2cd0b2 --- /dev/null +++ b/.github/workflows/pypi.yml @@ -0,0 +1,43 @@ +name: pypi +on: + push: + branches: + - master +env: + TWINE_USERNAME: ${{ secrets.TWINE_USERNAME }} + TWINE_PASSWORD: ${{ secrets.TWINE_PASSWORD }} +jobs: + package-and-deploy: + strategy: + matrix: + platform: [cpu, gpu] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-python@v2 + with: + python-version: 3.7 + - uses: actions/cache@v2 + with: + path: ~/.cache/pip + key: ${{ runner.os }}-pip-${{ hashFiles('**/setup.py') }} + restore-keys: | + ${{ runner.os }}-pip- + - uses: actions/cache@v2 + with: + path: ${{ env.GITHUB_WORKSPACE }}/dist + key: sdist-${{ matrix.platform }}-${{ hashFiles('**/setup.py') }} + restore-keys: | + sdist-${{ matrix.platform }}-${{ hashFiles('**/setup.py') }} + sdist-${{ matrix.platform }} + sdist- + - name: Install dependencies + run: pip install --upgrade pip setuptools twine + - if: ${{ matrix.platform == 'cpu' }} + name: Package CPU distribution + run: make build + - if: ${{ matrix.platform == 'gpu' }} + name: Package GPU distribution) + run: make build-gpu + - name: Deploy to pypi + run: make deploy \ No newline at end of file diff --git a/.github/workflows/pytest.yml b/.github/workflows/pytest.yml new file mode 100644 index 0000000..d4b2965 --- /dev/null +++ b/.github/workflows/pytest.yml @@ -0,0 +1,41 @@ +name: pytest +on: + pull_request: + branches: + - master +jobs: + tests: + runs-on: ubuntu-latest + strategy: + matrix: + python-version: [3.6, 3.7] + steps: + - uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - uses: actions/cache@v2 + id: spleeter-pip-cache + with: + path: ~/.cache/pip + key: ${{ runner.os }}-pip-${{ hashFiles('**/setup.py') }} + restore-keys: | + ${{ runner.os }}-pip- + - uses: actions/cache@v2 + env: + model-release: 1 + id: spleeter-model-cache + with: + path: ${{ env.GITHUB_WORKSPACE }}/pretrained_models + key: models-${{ env.model-release }} + restore-keys: | + models-${{ env.model-release }} + - name: Install dependencies + run: | + sudo apt-get update && sudo apt-get install -y ffmpeg + pip install --upgrade pip setuptools + pip install pytest==5.4.3 pytest-xdist==1.32.0 pytest-forked==1.1.3 musdb museval + python setup.py install + - name: Test with pytest + run: make test \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index a9df7a2..a5f4162 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog History +## 1.5.4 + +First release, July 24th 2020 + +Add some padding of the input waveform to avoid separation artefacts on the edges due to unstabilities in the inverse fourier transforms. +Also add tests to ensure both librosa and tensorflow backends have same outputs. + ## 1.5.2 First released, May 15th 2020 diff --git a/Makefile b/Makefile index e8f710e..d667361 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ # ======================================================= # Library lifecycle management. # -# @author Deezer Research +# @author Deezer Research # @licence MIT Licence # ======================================================= @@ -27,8 +27,7 @@ build-gpu: clean python3 setup.py sdist test: - $(PYTEST_CMD) - + $(PYTEST_CMD) tests/ deploy: pip install twine diff --git a/README.md b/README.md index 2249c7f..89120cd 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -[![CircleCI](https://circleci.com/gh/deezer/spleeter/tree/master.svg?style=shield)](https://circleci.com/gh/deezer/spleeter/tree/master) ![PyPI - Python Version](https://img.shields.io/pypi/pyversions/spleeter) [![PyPI version](https://badge.fury.io/py/spleeter.svg)](https://badge.fury.io/py/spleeter) [![Conda](https://img.shields.io/conda/vn/conda-forge/spleeter)](https://anaconda.org/conda-forge/spleeter) [![Docker Pulls](https://img.shields.io/docker/pulls/researchdeezer/spleeter)](https://hub.docker.com/r/researchdeezer/spleeter) [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/deezer/spleeter/blob/master/spleeter.ipynb) [![Gitter chat](https://badges.gitter.im/gitterHQ/gitter.png)](https://gitter.im/spleeter/community) [![status](https://joss.theoj.org/papers/259e5efe669945a343bad6eccb89018b/status.svg)](https://joss.theoj.org/papers/259e5efe669945a343bad6eccb89018b) +[![Github actions](https://github.com/deezer/spleeter/workflows/pytest/badge.svg)](https://github.com/deezer/spleeter/actions) ![PyPI - Python Version](https://img.shields.io/pypi/pyversions/spleeter) [![PyPI version](https://badge.fury.io/py/spleeter.svg)](https://badge.fury.io/py/spleeter) [![Conda](https://img.shields.io/conda/vn/conda-forge/spleeter)](https://anaconda.org/conda-forge/spleeter) [![Docker Pulls](https://img.shields.io/docker/pulls/researchdeezer/spleeter)](https://hub.docker.com/r/researchdeezer/spleeter) [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/deezer/spleeter/blob/master/spleeter.ipynb) [![Gitter chat](https://badges.gitter.im/gitterHQ/gitter.png)](https://gitter.im/spleeter/community) [![status](https://joss.theoj.org/papers/259e5efe669945a343bad6eccb89018b/status.svg)](https://joss.theoj.org/papers/259e5efe669945a343bad6eccb89018b) ## About @@ -45,9 +45,9 @@ For a detailed documentation, please check the [repository wiki](https://github. The following set of commands will clone this repository, create a virtual environment provisioned with the dependencies and run the tests (will take a few minutes): ```bash -git clone https://github.com/Deezer/spleeter +git clone https://github.com/Deezer/spleeter && cd spleeter python -m venv spleeterenv && source spleeterenv/bin/activate -pip install -r requirements.txt && pip install pytest pytest-xdist +pip install . && pip install pytest pytest-xdist make test ``` @@ -98,7 +98,7 @@ As is commonly the case with open-source projects, there are multiple forks expo ## Contributing -If you would like to participate in the development of **spleeter** your are more than welcome to do so. Don't hesitate to throw us a pull request and we'll do our best to examine it quickly. Please check out our [guidelines](.github/CONTRIBUTING.md) first. +If you would like to participate in the development of **spleeter** you are more than welcome to do so. Don't hesitate to throw us a pull request and we'll do our best to examine it quickly. Please check out our [guidelines](.github/CONTRIBUTING.md) first. ## Note diff --git a/docker/cuda-10-1.dockerfile b/docker/cuda-10-1.dockerfile new file mode 100644 index 0000000..19909fa --- /dev/null +++ b/docker/cuda-10-1.dockerfile @@ -0,0 +1,45 @@ +ARG BASE=python:3.8 +FROM ${BASE} + +ENV CUDA_VERSION 10.1.243 +ENV CUDA_PKG_VERSION 10-1=$CUDA_VERSION-1 +ENV PATH /usr/local/nvidia/bin:/usr/local/cuda/bin:${PATH} +ENV LD_LIBRARY_PATH /usr/local/nvidia/lib:/usr/local/nvidia/lib64 + +ENV NVIDIA_VISIBLE_DEVICES all +ENV NVIDIA_DRIVER_CAPABILITIES compute,utility +ENV NVIDIA_REQUIRE_CUDA "cuda>=10.1 brand=tesla,driver>=396,driver<397 brand=tesla,driver>=410,driver<411 brand=tesla,driver>=418,driver<419" +ENV CUDNN_VERSION 7.6.5.32 +ENV NCCL_VERSION 2.7.8 + +LABEL com.nvidia.cuda.version="${CUDA_VERSION}" +LABEL com.nvidia.cudnn.version="${CUDNN_VERSION}" +LABEL com.nvidia.volumes.needed="nvidia_driver" + +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + gnupg2 \ + curl \ + ca-certificates \ + && curl -fsSL https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub | apt-key add - \ + && echo "deb https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64 /" > /etc/apt/sources.list.d/cuda.list \ + && echo "deb https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64 /" > /etc/apt/sources.list.d/nvidia-ml.list \ + && apt-get purge --autoremove -y curl \ + && apt-get update \ + && apt-get install -y --no-install-recommends \ + cuda-cudart-$CUDA_PKG_VERSION \ + cuda-compat-10-1 \ + && ln -s cuda-10.1 /usr/local/cuda \ + && echo "/usr/local/nvidia/lib" >> /etc/ld.so.conf.d/nvidia.conf \ + && echo "/usr/local/nvidia/lib64" >> /etc/ld.so.conf.d/nvidia.conf \ + && apt-get install -y --no-install-recommends \ + cuda-libraries-$CUDA_PKG_VERSION \ + cuda-npp-$CUDA_PKG_VERSION \ + cuda-nvtx-$CUDA_PKG_VERSION \ + libcublas10=10.2.1.243-1 \ + libcudnn7=$CUDNN_VERSION-1+cuda10.1 \ + libnccl2=$NCCL_VERSION-1+cuda10.1 \ + && apt-mark hold libnccl2 \ + && apt-mark hold libcudnn7 \ + && apt-mark hold libcublas10 \ + && rm -rf /var/lib/apt/lists/* diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 28f7286..0000000 --- a/requirements.txt +++ /dev/null @@ -1,9 +0,0 @@ -importlib_resources; python_version<'3.7' -requests -setuptools>=41.0.0 -pandas==0.25.1 -tensorflow==1.15.2 -ffmpeg-python -norbert==0.2.1 -librosa==0.7.2 -numba==0.48.0 \ No newline at end of file diff --git a/setup.py b/setup.py index 3b0b446..d32cd4a 100644 --- a/setup.py +++ b/setup.py @@ -8,7 +8,7 @@ import sys from os import path from setuptools import setup -__email__ = 'research@deezer.com' +__email__ = 'spleeter@deezer.com' __author__ = 'Deezer Research' __license__ = 'MIT License' @@ -33,7 +33,7 @@ setup( long_description=readme, long_description_content_type='text/markdown', author='Deezer Research', - author_email='research@deezer.com', + author_email='spleeter@deezer.com', url='https://github.com/deezer/spleeter', license='MIT License', packages=[ diff --git a/spleeter/__init__.py b/spleeter/__init__.py index 0650c97..c2329ed 100644 --- a/spleeter/__init__.py +++ b/spleeter/__init__.py @@ -13,7 +13,7 @@ by providing train, evaluation and source separation action. """ -__email__ = 'research@deezer.com' +__email__ = 'spleeter@deezer.com' __author__ = 'Deezer Research' __license__ = 'MIT License' diff --git a/spleeter/__main__.py b/spleeter/__main__.py index 5c18b21..e4f3f4a 100644 --- a/spleeter/__main__.py +++ b/spleeter/__main__.py @@ -18,7 +18,7 @@ from .utils.logging import ( enable_tensorflow_logging, get_logger) -__email__ = 'research@deezer.com' +__email__ = 'spleeter@deezer.com' __author__ = 'Deezer Research' __license__ = 'MIT License' diff --git a/spleeter/audio/__init__.py b/spleeter/audio/__init__.py index 02f83c0..3d973c5 100644 --- a/spleeter/audio/__init__.py +++ b/spleeter/audio/__init__.py @@ -10,6 +10,6 @@ - Waveform convertion and transforming functions. """ -__email__ = 'research@deezer.com' +__email__ = 'spleeter@deezer.com' __author__ = 'Deezer Research' __license__ = 'MIT License' diff --git a/spleeter/audio/adapter.py b/spleeter/audio/adapter.py index 720618c..994c8df 100644 --- a/spleeter/audio/adapter.py +++ b/spleeter/audio/adapter.py @@ -19,7 +19,7 @@ from tensorflow.signal import stft, hann_window from .. import SpleeterError from ..utils.logging import get_logger -__email__ = 'research@deezer.com' +__email__ = 'spleeter@deezer.com' __author__ = 'Deezer Research' __license__ = 'MIT License' diff --git a/spleeter/audio/convertor.py b/spleeter/audio/convertor.py index 550345a..0751b03 100644 --- a/spleeter/audio/convertor.py +++ b/spleeter/audio/convertor.py @@ -10,7 +10,7 @@ import tensorflow as tf from ..utils.tensor import from_float32_to_uint8, from_uint8_to_float32 -__email__ = 'research@deezer.com' +__email__ = 'spleeter@deezer.com' __author__ = 'Deezer Research' __license__ = 'MIT License' diff --git a/spleeter/audio/ffmpeg.py b/spleeter/audio/ffmpeg.py index 2277d87..890e02e 100644 --- a/spleeter/audio/ffmpeg.py +++ b/spleeter/audio/ffmpeg.py @@ -20,7 +20,7 @@ from .adapter import AudioAdapter from .. import SpleeterError from ..utils.logging import get_logger -__email__ = 'research@deezer.com' +__email__ = 'spleeter@deezer.com' __author__ = 'Deezer Research' __license__ = 'MIT License' diff --git a/spleeter/audio/spectrogram.py b/spleeter/audio/spectrogram.py index f16782d..a1a79b3 100644 --- a/spleeter/audio/spectrogram.py +++ b/spleeter/audio/spectrogram.py @@ -10,7 +10,7 @@ import tensorflow as tf from tensorflow.signal import stft, hann_window # pylint: enable=import-error -__email__ = 'research@deezer.com' +__email__ = 'spleeter@deezer.com' __author__ = 'Deezer Research' __license__ = 'MIT License' diff --git a/spleeter/commands/__init__.py b/spleeter/commands/__init__.py index 995e866..a54e4c1 100644 --- a/spleeter/commands/__init__.py +++ b/spleeter/commands/__init__.py @@ -9,7 +9,7 @@ from argparse import ArgumentParser from tempfile import gettempdir from os.path import exists, join -__email__ = 'research@deezer.com' +__email__ = 'spleeter@deezer.com' __author__ = 'Deezer Research' __license__ = 'MIT License' @@ -170,6 +170,7 @@ def _create_evaluate_parser(parser_factory): parser.add_argument('-o', '--output_path', **OPT_OUTPUT) parser.add_argument('--mus_dir', **OPT_MUSDB) parser.add_argument('-m', '--mwf', **OPT_MWF) + parser.add_argument('-B', '--stft-backend', **OPT_STFT_BACKEND) return parser diff --git a/spleeter/commands/evaluate.py b/spleeter/commands/evaluate.py index 1e1e3f1..93e0990 100644 --- a/spleeter/commands/evaluate.py +++ b/spleeter/commands/evaluate.py @@ -38,7 +38,7 @@ except ImportError: logger.error('Please install musdb and museval first, abort') sys.exit(1) -__email__ = 'research@deezer.com' +__email__ = 'spleeter@deezer.com' __author__ = 'Deezer Research' __license__ = 'MIT License' @@ -77,7 +77,7 @@ def _separate_evaluation_dataset(arguments, musdb_root_directory, params): bitrate='128k', MWF=arguments.MWF, verbose=arguments.verbose, - stft_backend="auto"), + stft_backend=arguments.stft_backend), params) return audio_output_directory diff --git a/spleeter/commands/separate.py b/spleeter/commands/separate.py index 158190c..193d8f6 100644 --- a/spleeter/commands/separate.py +++ b/spleeter/commands/separate.py @@ -14,7 +14,7 @@ from ..audio.adapter import get_audio_adapter from ..separator import Separator -__email__ = 'research@deezer.com' +__email__ = 'spleeter@deezer.com' __author__ = 'Deezer Research' __license__ = 'MIT License' diff --git a/spleeter/commands/train.py b/spleeter/commands/train.py index 2a40c84..3bffaef 100644 --- a/spleeter/commands/train.py +++ b/spleeter/commands/train.py @@ -19,7 +19,7 @@ from ..model import model_fn from ..model.provider import ModelProvider from ..utils.logging import get_logger -__email__ = 'research@deezer.com' +__email__ = 'spleeter@deezer.com' __author__ = 'Deezer Research' __license__ = 'MIT License' diff --git a/spleeter/dataset.py b/spleeter/dataset.py index 0c8865b..5b11969 100644 --- a/spleeter/dataset.py +++ b/spleeter/dataset.py @@ -38,7 +38,7 @@ from .utils.tensor import ( set_tensor_shape, sync_apply) -__email__ = 'research@deezer.com' +__email__ = 'spleeter@deezer.com' __author__ = 'Deezer Research' __license__ = 'MIT License' diff --git a/spleeter/model/__init__.py b/spleeter/model/__init__.py index 20769d1..8b8f511 100644 --- a/spleeter/model/__init__.py +++ b/spleeter/model/__init__.py @@ -13,7 +13,7 @@ from tensorflow.signal import stft, inverse_stft, hann_window from ..utils.tensor import pad_and_partition, pad_and_reshape -__email__ = 'research@deezer.com' +__email__ = 'spleeter@deezer.com' __author__ = 'Deezer Research' __license__ = 'MIT License' @@ -275,9 +275,16 @@ class EstimatorSpecBuilder(object): spec_name = self.spectrogram_name if stft_name not in self._features: + # pad input with a frame of zeros + waveform = tf.concat([ + tf.zeros((self._frame_length, self._n_channels)), + self._features['waveform'] + ], + 0 + ) stft_feature = tf.transpose( stft( - tf.transpose(self._features['waveform']), + tf.transpose(waveform), self._frame_length, self._frame_step, window_fn=lambda frame_length, dtype: ( @@ -341,7 +348,7 @@ class EstimatorSpecBuilder(object): reshaped = tf.transpose(inversed) if time_crop is None: time_crop = tf.shape(self._features['waveform'])[0] - return reshaped[:time_crop, :] + return reshaped[self._frame_length:self._frame_length+time_crop, :] def _build_mwf_output_waveform(self): """ Perform separation with multichannel Wiener Filtering using Norbert. diff --git a/spleeter/model/functions/__init__.py b/spleeter/model/functions/__init__.py index abe52e9..684f923 100644 --- a/spleeter/model/functions/__init__.py +++ b/spleeter/model/functions/__init__.py @@ -3,7 +3,7 @@ """ This package provide model functions. """ -__email__ = 'research@deezer.com' +__email__ = 'spleeter@deezer.com' __author__ = 'Deezer Research' __license__ = 'MIT License' diff --git a/spleeter/model/functions/blstm.py b/spleeter/model/functions/blstm.py index ff7ce02..b81122b 100644 --- a/spleeter/model/functions/blstm.py +++ b/spleeter/model/functions/blstm.py @@ -33,7 +33,7 @@ from tensorflow.keras.layers import ( from . import apply -__email__ = 'research@deezer.com' +__email__ = 'spleeter@deezer.com' __author__ = 'Deezer Research' __license__ = 'MIT License' diff --git a/spleeter/model/functions/unet.py b/spleeter/model/functions/unet.py index 60dea1e..7f9dbea 100644 --- a/spleeter/model/functions/unet.py +++ b/spleeter/model/functions/unet.py @@ -32,7 +32,7 @@ from tensorflow.compat.v1.keras.initializers import he_uniform from . import apply -__email__ = 'research@deezer.com' +__email__ = 'spleeter@deezer.com' __author__ = 'Deezer Research' __license__ = 'MIT License' diff --git a/spleeter/model/provider/__init__.py b/spleeter/model/provider/__init__.py index 3aa3d8d..3921907 100644 --- a/spleeter/model/provider/__init__.py +++ b/spleeter/model/provider/__init__.py @@ -15,7 +15,7 @@ from abc import ABC, abstractmethod from os import environ, makedirs from os.path import exists, isabs, join, sep -__email__ = 'research@deezer.com' +__email__ = 'spleeter@deezer.com' __author__ = 'Deezer Research' __license__ = 'MIT License' diff --git a/spleeter/model/provider/github.py b/spleeter/model/provider/github.py index cd4d904..65a10b4 100644 --- a/spleeter/model/provider/github.py +++ b/spleeter/model/provider/github.py @@ -25,7 +25,7 @@ import requests from . import ModelProvider from ...utils.logging import get_logger -__email__ = 'research@deezer.com' +__email__ = 'spleeter@deezer.com' __author__ = 'Deezer Research' __license__ = 'MIT License' diff --git a/spleeter/resources/__init__.py b/spleeter/resources/__init__.py index 41d2a65..01939fb 100644 --- a/spleeter/resources/__init__.py +++ b/spleeter/resources/__init__.py @@ -3,6 +3,6 @@ """ Packages that provides static resources file for the library. """ -__email__ = 'research@deezer.com' +__email__ = 'spleeter@deezer.com' __author__ = 'Deezer Research' __license__ = 'MIT License' diff --git a/spleeter/separator.py b/spleeter/separator.py index 47305be..5c57aa8 100644 --- a/spleeter/separator.py +++ b/spleeter/separator.py @@ -31,7 +31,7 @@ from .utils.estimator import create_estimator, get_default_model_dir from .model import EstimatorSpecBuilder, InputProviderFactory -__email__ = 'research@deezer.com' +__email__ = 'spleeter@deezer.com' __author__ = 'Deezer Research' __license__ = 'MIT License' @@ -163,14 +163,18 @@ class Separator(object): data = np.asfortranarray(data) N = self._params["frame_length"] H = self._params["frame_step"] + win = hann(N, sym=False) fstft = istft if inverse else stft - win_len_arg = {"win_length": None, "length": length} if inverse else {"n_fft": N} + win_len_arg = {"win_length": None, + "length": None} if inverse else {"n_fft": N} n_channels = data.shape[-1] out = [] for c in range(n_channels): - d = data[:, :, c].T if inverse else data[:, c] + d = np.concatenate((np.zeros((N, )), data[:, c], np.zeros((N, )))) if not inverse else data[:, :, c].T s = fstft(d, hop_length=H, window=win, center=False, **win_len_arg) + if inverse: + s = s[N:N+length] s = np.expand_dims(s.T, 2-inverse) out.append(s) if len(out) == 1: diff --git a/spleeter/utils/__init__.py b/spleeter/utils/__init__.py index a4ccb5b..8828652 100644 --- a/spleeter/utils/__init__.py +++ b/spleeter/utils/__init__.py @@ -3,6 +3,6 @@ """ This package provides utility function and classes. """ -__email__ = 'research@deezer.com' +__email__ = 'spleeter@deezer.com' __author__ = 'Deezer Research' __license__ = 'MIT License' diff --git a/spleeter/utils/configuration.py b/spleeter/utils/configuration.py index d1fb167..36f1043 100644 --- a/spleeter/utils/configuration.py +++ b/spleeter/utils/configuration.py @@ -16,7 +16,7 @@ from os.path import exists from .. import resources, SpleeterError -__email__ = 'research@deezer.com' +__email__ = 'spleeter@deezer.com' __author__ = 'Deezer Research' __license__ = 'MIT License' diff --git a/spleeter/utils/logging.py b/spleeter/utils/logging.py index 15431d0..6fee540 100644 --- a/spleeter/utils/logging.py +++ b/spleeter/utils/logging.py @@ -7,7 +7,7 @@ import logging from os import environ -__email__ = 'research@deezer.com' +__email__ = 'spleeter@deezer.com' __author__ = 'Deezer Research' __license__ = 'MIT License' diff --git a/spleeter/utils/tensor.py b/spleeter/utils/tensor.py index 402548c..cc5e7e8 100644 --- a/spleeter/utils/tensor.py +++ b/spleeter/utils/tensor.py @@ -8,7 +8,7 @@ import tensorflow as tf import pandas as pd # pylint: enable=import-error -__email__ = 'research@deezer.com' +__email__ = 'spleeter@deezer.com' __author__ = 'Deezer Research' __license__ = 'MIT License' diff --git a/tests/__init__.py b/tests/__init__.py index f584f49..a58c36b 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -3,6 +3,6 @@ """ Unit testing package. """ -__email__ = 'research@deezer.com' +__email__ = 'spleeter@deezer.com' __author__ = 'Deezer Research' __license__ = 'MIT License' diff --git a/tests/test_eval.py b/tests/test_eval.py index 13fb708..f3764b6 100644 --- a/tests/test_eval.py +++ b/tests/test_eval.py @@ -3,7 +3,7 @@ """ Unit testing for Separator class. """ -__email__ = 'research@deezer.com' +__email__ = 'spleeter@deezer.com' __author__ = 'Deezer Research' __license__ = 'MIT License' @@ -25,33 +25,36 @@ from spleeter.commands import evaluate from spleeter.utils.configuration import load_configuration -res_4stems = { "vocals": { - "SDR": -0.007, - "SAR": -19.231, - "SIR": -4.528, - "ISR": 0.000 +BACKENDS = ["tensorflow", "librosa"] +TEST_CONFIGURATIONS = {el:el for el in BACKENDS} + +res_4stems = { + "vocals": { + "SDR": 3.25e-05, + "SAR": -11.153575, + "SIR": -1.3849, + "ISR": 2.75e-05 }, "drums": { - "SDR": -0.071, - "SAR": -14.496, - "SIR": -4.987, - "ISR": 0.001 + "SDR": -0.079505, + "SAR": -15.7073575, + "SIR": -4.972755, + "ISR": 0.0013575 }, "bass":{ - "SDR": -0.001, - "SAR": -12.426, - "SIR": -7.198, - "ISR": -0.001 + "SDR": 2.5e-06, + "SAR": -10.3520575, + "SIR": -4.272325, + "ISR": 2.5e-06 }, "other":{ - "SDR": -1.453, - "SAR": -14.899, - "SIR": -4.678, - "ISR": -0.015 + "SDR": -1.359175, + "SAR": -14.7076775, + "SIR": -4.761505, + "ISR": -0.01528 } } - def generate_fake_eval_dataset(path): """ generate fake evaluation dataset @@ -71,26 +74,15 @@ def generate_fake_eval_dataset(path): aa.save(filename, data, fs) -def test_evaluate(): - """ - test evaluate command - """ - with TemporaryDirectory() as path: - - # generate fake dataset - generate_fake_eval_dataset(path) - - # set up arguments of command +@pytest.mark.parametrize('backend', TEST_CONFIGURATIONS) +def test_evaluate(backend): + with TemporaryDirectory() as directory: + generate_fake_eval_dataset(directory) p = create_argument_parser() - arguments = p.parse_args(["evaluate", "-p", "spleeter:4stems", "--mus_dir", path]) + arguments = p.parse_args(["evaluate", "-p", "spleeter:4stems", "--mus_dir", directory, "-B", backend]) params = load_configuration(arguments.configuration) - - # run evaluation metrics = evaluate.entrypoint(arguments, params) - - # assert that the metric as not changed compared to reference value - # (Note that this fails with tensorflow backend) for instrument, metric in metrics.items(): - for metric, value in metric.items(): - assert np.allclose(np.median(value), res_4stems[instrument][metric], atol=1e-3) \ No newline at end of file + for m, value in metric.items(): + assert np.allclose(np.median(value), res_4stems[instrument][m], atol=1e-3) \ No newline at end of file diff --git a/tests/test_ffmpeg_adapter.py b/tests/test_ffmpeg_adapter.py index 195b737..8eb284a 100644 --- a/tests/test_ffmpeg_adapter.py +++ b/tests/test_ffmpeg_adapter.py @@ -3,7 +3,7 @@ """ Unit testing for audio adapter. """ -__email__ = 'research@deezer.com' +__email__ = 'spleeter@deezer.com' __author__ = 'Deezer Research' __license__ = 'MIT License' diff --git a/tests/test_separator.py b/tests/test_separator.py index 730c4bd..b83477e 100644 --- a/tests/test_separator.py +++ b/tests/test_separator.py @@ -3,7 +3,7 @@ """ Unit testing for Separator class. """ -__email__ = 'research@deezer.com' +__email__ = 'spleeter@deezer.com' __author__ = 'Deezer Research' __license__ = 'MIT License' @@ -39,13 +39,36 @@ TEST_CONFIGURATIONS = list(itertools.product(TEST_AUDIO_DESCRIPTORS, MODELS, BAC print("RUNNING TESTS WITH TF VERSION {}".format(tf.__version__)) +@pytest.mark.parametrize('test_file', TEST_AUDIO_DESCRIPTORS) +def test_separator_backends(test_file): + adapter = get_default_audio_adapter() + waveform, _ = adapter.load(test_file) + + separator_lib = Separator("spleeter:2stems", stft_backend="librosa") + separator_tf = Separator("spleeter:2stems", stft_backend="tensorflow") + + # Test the stft and inverse stft provides exact reconstruction + stft_matrix = separator_lib._stft(waveform) + reconstructed = separator_lib._stft( + stft_matrix, inverse=True, length=waveform.shape[0]) + assert np.allclose(reconstructed, waveform, atol=3e-2) + + # compare both separation, it should be close + out_tf = separator_tf._separate_tensorflow(waveform, test_file) + out_lib = separator_lib._separate_librosa(waveform, test_file) + + for instrument in out_lib.keys(): + # test that both outputs are close everywhere + assert np.allclose(out_tf[instrument], out_lib[instrument], atol=1e-5) + + @pytest.mark.parametrize('test_file, configuration, backend', TEST_CONFIGURATIONS) def test_separate(test_file, configuration, backend): """ Test separation from raw data. """ instruments = MODEL_TO_INST[configuration] adapter = get_default_audio_adapter() waveform, _ = adapter.load(test_file) - separator = Separator(configuration, stft_backend=backend) + separator = Separator(configuration, stft_backend=backend, multiprocess=False) prediction = separator.separate(waveform, test_file) assert len(prediction) == len(instruments) for instrument in instruments: @@ -63,7 +86,7 @@ def test_separate(test_file, configuration, backend): def test_separate_to_file(test_file, configuration, backend): """ Test file based separation. """ instruments = MODEL_TO_INST[configuration] - separator = Separator(configuration, stft_backend=backend) + separator = Separator(configuration, stft_backend=backend, multiprocess=False) name = splitext(basename(test_file))[0] with TemporaryDirectory() as directory: separator.separate_to_file( @@ -79,7 +102,7 @@ def test_separate_to_file(test_file, configuration, backend): def test_filename_format(test_file, configuration, backend): """ Test custom filename format. """ instruments = MODEL_TO_INST[configuration] - separator = Separator(configuration, stft_backend=backend) + separator = Separator(configuration, stft_backend=backend, multiprocess=False) name = splitext(basename(test_file))[0] with TemporaryDirectory() as directory: separator.separate_to_file( @@ -95,7 +118,7 @@ def test_filename_format(test_file, configuration, backend): @pytest.mark.parametrize('test_file, configuration', MODELS_AND_TEST_FILES) def test_filename_conflict(test_file, configuration): """ Test error handling with static pattern. """ - separator = Separator(configuration) + separator = Separator(configuration, multiprocess=False) with TemporaryDirectory() as directory: with pytest.raises(SpleeterError): separator.separate_to_file(