From 0a571c9fcabf8be5e40bd94740c6192f97f7074a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20Voituret?= Date: Wed, 6 Nov 2019 17:18:56 +0100 Subject: [PATCH 01/15] fix: add ffmpeg-python --- setup.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/setup.py b/setup.py index 7ecb58a..e39b8ef 100644 --- a/setup.py +++ b/setup.py @@ -69,6 +69,8 @@ setup( 'norbert==0.2.1', 'pandas==0.25.1', 'requests', + 'setuptools>=41.0.0', + 'ffmpeg-python', '{}=={}'.format(tensorflow_dependency, tensorflow_version), ], entry_points={ From c9254625cd00111a608d85adf088bbb3f0ccbdd4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20Voituret?= Date: Wed, 6 Nov 2019 18:03:35 +0100 Subject: [PATCH 02/15] refactor: ffmpeg adapter --- spleeter/utils/audio/ffmpeg.py | 222 ++++++--------------------------- 1 file changed, 40 insertions(+), 182 deletions(-) diff --git a/spleeter/utils/audio/ffmpeg.py b/spleeter/utils/audio/ffmpeg.py index ad24e33..437cdfc 100644 --- a/spleeter/utils/audio/ffmpeg.py +++ b/spleeter/utils/audio/ffmpeg.py @@ -9,12 +9,11 @@ """ import os -import os.path -import platform -import re -import subprocess -import numpy as np # pylint: disable=import-error +# pylint: disable=import-error +import ffmpeg +import numpy as np +# pylint: enable=import-error from .adapter import AudioAdapter from ..logging import get_logger @@ -23,58 +22,9 @@ __email__ = 'research@deezer.com' __author__ = 'Deezer Research' __license__ = 'MIT License' -# Default FFMPEG binary name. -_UNIX_BINARY = 'ffmpeg' -_WINDOWS_BINARY = 'ffmpeg.exe' - - -def _which(program): - """ A pure python implementation of `which`command - for retrieving absolute path from command name or path. - - @see https://stackoverflow.com/a/377028/1211342 - - :param program: Program name or path to expend. - :returns: Absolute path of program if any, None otherwise. - """ - def is_exe(fpath): - return os.path.isfile(fpath) and os.access(fpath, os.X_OK) - - fpath, _ = os.path.split(program) - if fpath: - if is_exe(program): - return program - else: - for path in os.environ['PATH'].split(os.pathsep): - exe_file = os.path.join(path, program) - if is_exe(exe_file): - return exe_file - return None - - -def _get_ffmpeg_path(): - """ Retrieves FFMPEG binary path using ENVVAR if defined - or default binary name (Windows or UNIX style). - - :returns: Absolute path of FFMPEG binary. - :raise IOError: If FFMPEG binary cannot be found. - """ - ffmpeg_path = os.environ.get('FFMPEG_PATH', None) - if ffmpeg_path is None: - # Note: try to infer standard binary name regarding of platform. - if platform.system() == 'Windows': - ffmpeg_path = _WINDOWS_BINARY - else: - ffmpeg_path = _UNIX_BINARY - expended = _which(ffmpeg_path) - if expended is None: - raise IOError(f'FFMPEG binary ({ffmpeg_path}) not found') - return expended - def _to_ffmpeg_time(n): """ Format number of seconds to time expected by FFMPEG. - :param n: Time in seconds to format. :returns: Formatted time in FFMPEG format. """ @@ -83,56 +33,6 @@ def _to_ffmpeg_time(n): return '%d:%02d:%09.6f' % (h, m, s) -def _parse_ffmpg_results(stderr): - """ Extract number of channels and sample rate from - the given FFMPEG STDERR output line. - - :param stderr: STDERR output line to parse. - :returns: Parsed n_channels and sample_rate values. - """ - # Setup default value. - n_channels = 0 - sample_rate = 0 - # Find samplerate - match = re.search(r'(\d+) hz', stderr) - if match: - sample_rate = int(match.group(1)) - # Channel count. - match = re.search(r'hz, ([^,]+),', stderr) - if match: - mode = match.group(1) - if mode == 'stereo': - n_channels = 2 - else: - match = re.match(r'(\d+) ', mode) - n_channels = match and int(match.group(1)) or 1 - return n_channels, sample_rate - - -class _CommandBuilder(object): - """ A simple builder pattern class for CLI string. """ - - def __init__(self, binary): - """ Default constructor. """ - self._command = [binary] - - def flag(self, flag): - """ Add flag or unlabelled opt. """ - self._command.append(flag) - return self - - def opt(self, short, value, formatter=str): - """ Add option if value not None. """ - if value is not None: - self._command.append(short) - self._command.append(formatter(value)) - return self - - def command(self): - """ Build string command. """ - return self._command - - class FFMPEGProcessAudioAdapter(AudioAdapter): """ An AudioAdapter implementation that use FFMPEG binary through subprocess in order to perform I/O operation for audio processing. @@ -142,17 +42,6 @@ class FFMPEGProcessAudioAdapter(AudioAdapter): FFMPEG_PATH environment variable. """ - def __init__(self): - """ Default constructor. """ - self._ffmpeg_path = _get_ffmpeg_path() - - def _get_command_builder(self): - """ Creates and returns a command builder using FFMPEG path. - - :returns: Built command builder. - """ - return _CommandBuilder(self._ffmpeg_path) - def load( self, path, offset=None, duration=None, sample_rate=None, dtype=np.float32): @@ -166,46 +55,30 @@ class FFMPEGProcessAudioAdapter(AudioAdapter): :param dtype: (Optional) Numpy data type to use, default to float32. :returns: Loaded data a (waveform, sample_rate) tuple. """ - if not isinstance(path, str): - path = path.decode() - command = ( - self._get_command_builder() - .opt('-ss', offset, formatter=_to_ffmpeg_time) - .opt('-t', duration, formatter=_to_ffmpeg_time) - .opt('-i', path) - .opt('-ar', sample_rate) - .opt('-f', 'f32le') - .flag('-') - .command()) - process = subprocess.Popen( - command, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - buffer = process.stdout.read(-1) - # Read STDERR until end of the process detected. - while True: - status = process.stderr.readline() - if not status: - raise OSError('Stream info not found') - if isinstance(status, bytes): # Note: Python 3 compatibility. - status = status.decode('utf8', 'ignore') - status = status.strip().lower() - if 'no such file' in status: - raise IOError(f'File {path} not found') - elif 'invalid data found' in status: - raise IOError(f'FFMPEG error : {status}') - elif 'audio:' in status: - n_channels, ffmpeg_sample_rate = _parse_ffmpg_results(status) - if sample_rate is None: - sample_rate = ffmpeg_sample_rate - break - # Load waveform and clean process. + probe = ffmpeg.probe(path) + if 'streams' not in probe or len(probe['streams']) == 0: + raise IOError('No stream was found with ffprobe') + metadata = next( + stream + for stream in probe['stream'] + if stream['codec_type'] == 'audio') + n_channels = metadata['channels'] + if sample_rate is None: + sample_rate = metadata['sample_rate'] + input_kwargs = {'format': 'f32le', 'ar': sample_rate} + if duration is not None: + input_kwargs['t'] = _to_ffmpeg_time(duration) + if offset is not None: + input_kwargs['ss'] = _to_ffmpeg_time(offset) + buffer, _ = ( + ffmpeg + .input(path, **input_kwargs) + .output('-', format='f32le') + .overwrite_output() + .run(quiet=True)) waveform = np.frombuffer(buffer, dtype=' Date: Wed, 6 Nov 2019 18:04:04 +0100 Subject: [PATCH 03/15] fix: ffmpeg adapter --- spleeter/utils/audio/ffmpeg.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spleeter/utils/audio/ffmpeg.py b/spleeter/utils/audio/ffmpeg.py index 437cdfc..899f624 100644 --- a/spleeter/utils/audio/ffmpeg.py +++ b/spleeter/utils/audio/ffmpeg.py @@ -12,7 +12,7 @@ import os # pylint: disable=import-error import ffmpeg -import numpy as np +import numpy as np # pylint: enable=import-error from .adapter import AudioAdapter From 7f759e06958fff7c58808e4b7ebfb9a7b2b55417 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20Voituret?= Date: Wed, 6 Nov 2019 18:18:30 +0100 Subject: [PATCH 04/15] fix: load method --- spleeter/utils/audio/ffmpeg.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/spleeter/utils/audio/ffmpeg.py b/spleeter/utils/audio/ffmpeg.py index 899f624..7e6f4fb 100644 --- a/spleeter/utils/audio/ffmpeg.py +++ b/spleeter/utils/audio/ffmpeg.py @@ -60,7 +60,7 @@ class FFMPEGProcessAudioAdapter(AudioAdapter): raise IOError('No stream was found with ffprobe') metadata = next( stream - for stream in probe['stream'] + for stream in probe['streams'] if stream['codec_type'] == 'audio') n_channels = metadata['channels'] if sample_rate is None: @@ -75,7 +75,7 @@ class FFMPEGProcessAudioAdapter(AudioAdapter): .input(path, **input_kwargs) .output('-', format='f32le') .overwrite_output() - .run(quiet=True)) + .run(capture_stdout=True, capture_stderr=True)) waveform = np.frombuffer(buffer, dtype=' Date: Wed, 6 Nov 2019 18:30:13 +0100 Subject: [PATCH 05/15] fix: ffmpeg issues --- spleeter/utils/audio/ffmpeg.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/spleeter/utils/audio/ffmpeg.py b/spleeter/utils/audio/ffmpeg.py index 7e6f4fb..ba038d9 100644 --- a/spleeter/utils/audio/ffmpeg.py +++ b/spleeter/utils/audio/ffmpeg.py @@ -65,16 +65,15 @@ class FFMPEGProcessAudioAdapter(AudioAdapter): n_channels = metadata['channels'] if sample_rate is None: sample_rate = metadata['sample_rate'] - input_kwargs = {'format': 'f32le', 'ar': sample_rate} + output_kwargs = {'format': 'f32le', 'ar': sample_rate} if duration is not None: - input_kwargs['t'] = _to_ffmpeg_time(duration) + output_kwargs['t'] = _to_ffmpeg_time(duration) if offset is not None: - input_kwargs['ss'] = _to_ffmpeg_time(offset) + output_kwargs['ss'] = _to_ffmpeg_time(offset) buffer, _ = ( ffmpeg - .input(path, **input_kwargs) - .output('-', format='f32le') - .overwrite_output() + .input(path) + .output('-', **output_kwargs) .run(capture_stdout=True, capture_stderr=True)) waveform = np.frombuffer(buffer, dtype=' Date: Wed, 6 Nov 2019 18:36:34 +0100 Subject: [PATCH 06/15] fix: path and log --- spleeter/utils/audio/adapter.py | 1 + spleeter/utils/audio/ffmpeg.py | 2 ++ 2 files changed, 3 insertions(+) diff --git a/spleeter/utils/audio/adapter.py b/spleeter/utils/audio/adapter.py index b2d7cb1..d1a64c0 100644 --- a/spleeter/utils/audio/adapter.py +++ b/spleeter/utils/audio/adapter.py @@ -82,6 +82,7 @@ class AudioAdapter(ABC): duration.numpy(), sample_rate.numpy(), dtype=dtype.numpy()) + get_logger().info('Audio data loaded successfully') return (data, False) except Exception as e: get_logger().warning(e) diff --git a/spleeter/utils/audio/ffmpeg.py b/spleeter/utils/audio/ffmpeg.py index ba038d9..9126eaa 100644 --- a/spleeter/utils/audio/ffmpeg.py +++ b/spleeter/utils/audio/ffmpeg.py @@ -55,6 +55,8 @@ class FFMPEGProcessAudioAdapter(AudioAdapter): :param dtype: (Optional) Numpy data type to use, default to float32. :returns: Loaded data a (waveform, sample_rate) tuple. """ + if not isinstance(path, str): + path = path.decode() probe = ffmpeg.probe(path) if 'streams' not in probe or len(probe['streams']) == 0: raise IOError('No stream was found with ffprobe') From cce8636fdf4575148b79da447cb8dc0d4a0092ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20Voituret?= Date: Wed, 6 Nov 2019 18:42:52 +0100 Subject: [PATCH 07/15] fix: update writing process --- spleeter/commands/separate.py | 12 +++++------- spleeter/utils/audio/ffmpeg.py | 2 +- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/spleeter/commands/separate.py b/spleeter/commands/separate.py index 0098351..25b9226 100644 --- a/spleeter/commands/separate.py +++ b/spleeter/commands/separate.py @@ -129,7 +129,6 @@ def process_audio( yield_single_examples=False) # initialize pool for audio export pool = Pool(16) - tasks = [] for sample in prediction: sample_filename = sample.pop('audio_id', 'unknown_filename').decode() input_directory, input_filename = split(sample_filename) @@ -144,13 +143,12 @@ def process_audio( output_path, output_dirname, f'{instrument}.{codec}') - tasks.append( - pool.apply_async( - audio_adapter.save, - (filename, waveform, sample_rate, codec))) + pool.apply_async( + audio_adapter.save, + (filename, waveform, sample_rate, codec)) # Wait for everything to be written - for task in tasks: - task.wait(timeout=20) + pool.join() + pool.close() def entrypoint(arguments, params): diff --git a/spleeter/utils/audio/ffmpeg.py b/spleeter/utils/audio/ffmpeg.py index 9126eaa..feda039 100644 --- a/spleeter/utils/audio/ffmpeg.py +++ b/spleeter/utils/audio/ffmpeg.py @@ -113,7 +113,7 @@ class FFMPEGProcessAudioAdapter(AudioAdapter): .output(path, format='f32le', **output_kwargs) .run_async(pipe_stdin=True, quiet=True)) try: - process.stdin.write(data.astype(' Date: Wed, 6 Nov 2019 18:46:33 +0100 Subject: [PATCH 08/15] fix: pool managment --- spleeter/commands/separate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spleeter/commands/separate.py b/spleeter/commands/separate.py index 25b9226..71eed2d 100644 --- a/spleeter/commands/separate.py +++ b/spleeter/commands/separate.py @@ -147,8 +147,8 @@ def process_audio( audio_adapter.save, (filename, waveform, sample_rate, codec)) # Wait for everything to be written - pool.join() pool.close() + pool.join() def entrypoint(arguments, params): From eaa6005e0813170bc27de9491c566c5ea943508d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20Voituret?= Date: Wed, 6 Nov 2019 19:41:16 +0100 Subject: [PATCH 09/15] fix: finalizes FFMPEG debug docs: update prog USAGE --- spleeter/commands/__init__.py | 2 +- spleeter/utils/audio/ffmpeg.py | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/spleeter/commands/__init__.py b/spleeter/commands/__init__.py index 2577399..331ee2d 100644 --- a/spleeter/commands/__init__.py +++ b/spleeter/commands/__init__.py @@ -172,7 +172,7 @@ def create_argument_parser(): :returns: Created argument parser. """ - parser = ArgumentParser(prog='python -m spleeter') + parser = ArgumentParser(prog='spleeter') subparsers = parser.add_subparsers() subparsers.dest = 'command' subparsers.required = True diff --git a/spleeter/utils/audio/ffmpeg.py b/spleeter/utils/audio/ffmpeg.py index feda039..d9c5506 100644 --- a/spleeter/utils/audio/ffmpeg.py +++ b/spleeter/utils/audio/ffmpeg.py @@ -72,11 +72,12 @@ class FFMPEGProcessAudioAdapter(AudioAdapter): output_kwargs['t'] = _to_ffmpeg_time(duration) if offset is not None: output_kwargs['ss'] = _to_ffmpeg_time(offset) - buffer, _ = ( + process = ( ffmpeg .input(path) - .output('-', **output_kwargs) - .run(capture_stdout=True, capture_stderr=True)) + .output('pipe:', **output_kwargs) + .run_async(pipe_stdout=True, pipe_stderr=True)) + buffer, _ = process.communicate() waveform = np.frombuffer(buffer, dtype=' Date: Wed, 6 Nov 2019 20:30:47 +0100 Subject: [PATCH 10/15] refactor: logging --- spleeter/__main__.py | 7 +++-- spleeter/model/provider/github.py | 4 +-- spleeter/utils/logging.py | 44 +++++++++++++++++++++---------- 3 files changed, 35 insertions(+), 20 deletions(-) diff --git a/spleeter/__main__.py b/spleeter/__main__.py index fde5292..5f72040 100644 --- a/spleeter/__main__.py +++ b/spleeter/__main__.py @@ -12,7 +12,7 @@ import warnings from .commands import create_argument_parser from .utils.configuration import load_configuration -from .utils.logging import enable_logging, enable_verbose_logging +from .utils.logging import enable_logging, enable_tensorflow_logging __email__ = 'research@deezer.com' __author__ = 'Deezer Research' @@ -28,10 +28,9 @@ def main(argv): """ parser = create_argument_parser() arguments = parser.parse_args(argv[1:]) + enable_logging() if arguments.verbose: - enable_verbose_logging() - else: - enable_logging() + enable_tensorflow_logging() if arguments.command == 'separate': from .commands.separate import entrypoint elif arguments.command == 'train': diff --git a/spleeter/model/provider/github.py b/spleeter/model/provider/github.py index cc7028c..aad0c44 100644 --- a/spleeter/model/provider/github.py +++ b/spleeter/model/provider/github.py @@ -65,9 +65,9 @@ class GithubModelProvider(ModelProvider): raise IOError(f'Resource {url} not found') with TemporaryFile() as stream: copyfileobj(response.raw, stream) - get_logger().debug('Extracting downloaded archive') + get_logger().info('Extracting downloaded %s archive', name) stream.seek(0) tar = tarfile.open(fileobj=stream) tar.extractall(path=path) tar.close() - get_logger().debug('Model file extracted') + get_logger().info('%s model file(s) extracted', name) diff --git a/spleeter/utils/logging.py b/spleeter/utils/logging.py index 031e0c3..15431d0 100644 --- a/spleeter/utils/logging.py +++ b/spleeter/utils/logging.py @@ -3,12 +3,16 @@ """ Centralized logging facilities for Spleeter. """ +import logging + from os import environ __email__ = 'research@deezer.com' __author__ = 'Deezer Research' __license__ = 'MIT License' +_FORMAT = '%(levelname)s:%(name)s:%(message)s' + class _LoggerHolder(object): """ Logger singleton instance holder. """ @@ -16,30 +20,42 @@ class _LoggerHolder(object): INSTANCE = None +def get_tensorflow_logger(): + """ + """ + # pylint: disable=import-error + from tensorflow.compat.v1 import logging + # pylint: enable=import-error + return logging + + def get_logger(): """ Returns library scoped logger. :returns: Library logger. """ if _LoggerHolder.INSTANCE is None: - # pylint: disable=import-error - from tensorflow.compat.v1 import logging - # pylint: enable=import-error - _LoggerHolder.INSTANCE = logging - _LoggerHolder.INSTANCE.set_verbosity(_LoggerHolder.INSTANCE.ERROR) - environ['TF_CPP_MIN_LOG_LEVEL'] = '3' + formatter = logging.Formatter(_FORMAT) + handler = logging.StreamHandler() + handler.setFormatter(formatter) + logger = logging.getLogger('spleeter') + logger.addHandler(handler) + logger.setLevel(logging.INFO) + _LoggerHolder.INSTANCE = logger return _LoggerHolder.INSTANCE -def enable_logging(): - """ Enable INFO level logging. """ +def enable_tensorflow_logging(): + """ Enable tensorflow logging. """ environ['TF_CPP_MIN_LOG_LEVEL'] = '1' + tf_logger = get_tensorflow_logger() + tf_logger.set_verbosity(tf_logger.INFO) logger = get_logger() - logger.set_verbosity(logger.INFO) + logger.setLevel(logging.DEBUG) -def enable_verbose_logging(): - """ Enable DEBUG level logging. """ - environ['TF_CPP_MIN_LOG_LEVEL'] = '0' - logger = get_logger() - logger.set_verbosity(logger.DEBUG) +def enable_logging(): + """ Configure default logging. """ + environ['TF_CPP_MIN_LOG_LEVEL'] = '3' + tf_logger = get_tensorflow_logger() + tf_logger.set_verbosity(tf_logger.ERROR) From 2559d52ecf579cf6a5005ad7b6336767705a1266 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20Voituret?= Date: Wed, 6 Nov 2019 20:36:31 +0100 Subject: [PATCH 11/15] fix: export directory issue --- spleeter/utils/estimator.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/spleeter/utils/estimator.py b/spleeter/utils/estimator.py index a908886..95c4219 100644 --- a/spleeter/utils/estimator.py +++ b/spleeter/utils/estimator.py @@ -4,6 +4,8 @@ """ Utility functions for creating estimator. """ from pathlib import Path +from os.path import join +from tempfile import gettempdir # pylint: disable=import-error import tensorflow as tf @@ -15,7 +17,7 @@ from ..model import model_fn from ..model.provider import get_default_model_provider # Default exporting directory for predictor. -DEFAULT_EXPORT_DIRECTORY = '/tmp/serving' +DEFAULT_EXPORT_DIRECTORY = join(gettempdir(), 'serving') def create_estimator(params, MWF): From 30cd7c6435b61a0fb8190b4317aeea3d06989137 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20Voituret?= Date: Wed, 6 Nov 2019 23:58:58 +0100 Subject: [PATCH 12/15] refactor: set musdb and museval as extras --- setup.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/setup.py b/setup.py index e39b8ef..144c87c 100644 --- a/setup.py +++ b/setup.py @@ -14,7 +14,7 @@ __license__ = 'MIT License' # Default project values. project_name = 'spleeter' -project_version = '1.4.1' +project_version = '1.4.2' device_target = 'cpu' tensorflow_dependency = 'tensorflow' tensorflow_version = '1.14.0' @@ -64,8 +64,6 @@ setup( include_package_data=True, install_requires=[ 'importlib_resources ; python_version<"3.7"', - 'musdb==0.3.1', - 'museval==0.3.0', 'norbert==0.2.1', 'pandas==0.25.1', 'requests', @@ -73,6 +71,9 @@ setup( 'ffmpeg-python', '{}=={}'.format(tensorflow_dependency, tensorflow_version), ], + extras_require={ + 'evaluation': ['musdb==0.3.1', 'museval==0.3.0'] + }, entry_points={ 'console_scripts': ['spleeter=spleeter.__main__:entrypoint'] }, From f1f3efbe9cf11d48c2bad0857f792535e32dfca6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20Voituret?= Date: Thu, 7 Nov 2019 00:04:18 +0100 Subject: [PATCH 13/15] fix: add musdb and museval check --- spleeter/commands/evaluate.py | 12 ++++++++++-- spleeter/model/functions/unet.py | 7 +++---- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/spleeter/commands/evaluate.py b/spleeter/commands/evaluate.py index dc990ad..c2fe789 100644 --- a/spleeter/commands/evaluate.py +++ b/spleeter/commands/evaluate.py @@ -13,6 +13,7 @@ --mus_dir /path/to/musdb dataset """ +import sys import json from argparse import Namespace @@ -21,8 +22,6 @@ from glob import glob from os.path import join, exists # pylint: disable=import-error -import musdb -import museval import numpy as np import pandas as pd # pylint: enable=import-error @@ -30,6 +29,15 @@ import pandas as pd from .separate import entrypoint as separate_entrypoint from ..utils.logging import get_logger +try: + import musdb + import museval +except ImportError: + logger = get_logger() + logger.error('Extra dependencies musdb and museval not found') + logger.error('Please install musdb and museval first, abort') + sys.exit(1) + __email__ = 'research@deezer.com' __author__ = 'Deezer Research' __license__ = 'MIT License' diff --git a/spleeter/model/functions/unet.py b/spleeter/model/functions/unet.py index 245a5e5..245a247 100644 --- a/spleeter/model/functions/unet.py +++ b/spleeter/model/functions/unet.py @@ -3,10 +3,9 @@ """ This module contains building functions for U-net source separation source -separation models. -Each instrument is modeled by a single U-net convolutional/deconvolutional -network that take a mix spectrogram as input and the estimated sound spectrogram -as output. +separation models. Each instrument is modeled by a single U-netconvolutional +/ deconvolutional network that take a mix spectrogram as input and the +estimated sound spectrogram as output. """ from functools import partial From a7373c11608dcc3a864dffd33ceebf01f6ded527 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20Voituret?= Date: Thu, 7 Nov 2019 00:05:40 +0100 Subject: [PATCH 14/15] fix: dep order --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 144c87c..7eb2839 100644 --- a/setup.py +++ b/setup.py @@ -63,12 +63,12 @@ setup( python_requires='>=3.6, <3.8', include_package_data=True, install_requires=[ + 'ffmpeg-python', 'importlib_resources ; python_version<"3.7"', 'norbert==0.2.1', 'pandas==0.25.1', 'requests', 'setuptools>=41.0.0', - 'ffmpeg-python', '{}=={}'.format(tensorflow_dependency, tensorflow_version), ], extras_require={ From 666bdd7fad89664ee5cc61bd9579de4454ca034d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20Voituret?= Date: Thu, 7 Nov 2019 00:11:16 +0100 Subject: [PATCH 15/15] fix: add ffmpeg-python dep --- conda/spleeter-cpu.yaml | 1 + conda/spleeter-gpu.yaml | 1 + 2 files changed, 2 insertions(+) diff --git a/conda/spleeter-cpu.yaml b/conda/spleeter-cpu.yaml index df9ed04..5137ba8 100644 --- a/conda/spleeter-cpu.yaml +++ b/conda/spleeter-cpu.yaml @@ -16,3 +16,4 @@ dependencies: - musdb==0.3.1 - norbert==0.2.1 - spleeter + - ffmpeg-python diff --git a/conda/spleeter-gpu.yaml b/conda/spleeter-gpu.yaml index b269a35..094fe7d 100644 --- a/conda/spleeter-gpu.yaml +++ b/conda/spleeter-gpu.yaml @@ -16,4 +16,5 @@ dependencies: - musdb==0.3.1 - norbert==0.2.1 - spleeter + - ffmpeg-python