deezer/spleeter · error · SpleeterError

{adapter_class_name} is not a valid AudioAdapter class

Error message

{adapter_class_name} is not a valid AudioAdapter class

What it means

`AudioAdapter.get(descriptor)` resolves a dotted descriptor like `spleeter.audio.ffmpeg.FFMPEGAudioAdapter` by importing the module and fetching the class. If the resolved class is not a subclass of `AudioAdapter`, a `SpleeterError` is raised. This guards against descriptors pointing at arbitrary non-adapter classes.

Source

Thrown at spleeter/audio/adapter.py:197

        Load dynamically an AudioAdapter from given class descriptor.

        Parameters:
            descriptor (str):
                Adapter class descriptor (module.Class)

        Returns:
            AudioAdapter:
                Created adapter instance.
        """
        if not descriptor:
            return cls.default()
        module_desc: List[str] = descriptor.split(".")
        adapter_class_name: str = module_desc[-1]
        module_path: str = ".".join(module_desc[:-1])
        adapter_module = import_module(module_path)
        adapter_class = getattr(adapter_module, adapter_class_name)
        if not issubclass(adapter_class, AudioAdapter):
            raise SpleeterError(
                f"{adapter_class_name} is not a valid AudioAdapter class"
            )
        return adapter_class()

View on GitHub (pinned to c8854001ac)

Solutions

  1. Use the correct descriptor, e.g. `AudioAdapter.get('spleeter.audio.ffmpeg.FFMPEGAudioAdapter')`
  2. If writing a custom adapter, make it inherit from `spleeter.audio.adapter.AudioAdapter` and implement its abstract methods
  3. Check for typos or swapped module/class parts in the dotted descriptor

Example fix

// before
AudioAdapter.get('spleeter.audio.ffmpeg.FFMPEG')  # not an AudioAdapter
// after
AudioAdapter.get('spleeter.audio.ffmpeg.FFMPEGAudioAdapter')
Defensive patterns

Strategy: validation

Validate before calling

from spleeter.audio.adapter import AudioAdapter
descriptor = 'spleeter.audio.ffmpeg.FFMPEGAudioAdapter'
module_name, _, class_name = descriptor.rpartition('.')
cls = getattr(__import__(module_name, fromlist=[class_name]), class_name)
assert issubclass(cls, AudioAdapter), f'{class_name} is not an AudioAdapter'
adapter = AudioAdapter.get(descriptor)

Type guard

from spleeter.audio.adapter import AudioAdapter
def is_audio_adapter(obj) -> bool:
    return isinstance(obj, type) and issubclass(obj, AudioAdapter)

Try / catch

from spleeter.audio.adapter import AudioAdapter
from spleeter.utils.logging import SpleeterError  # or spleeter SpleeterError location
try:
    adapter = AudioAdapter.get(descriptor)
except Exception as e:
    if 'is not a valid AudioAdapter class' in str(e):
        adapter = AudioAdapter.default()
    else:
        raise

Prevention

When it happens

Trigger: Calling `AudioAdapter.get('some.module.SomeClass')` where SomeClass exists but does not inherit from `AudioAdapter` (e.g. pointing at a module, a function, or an unrelated class).

Common situations: Typos in the class-name portion of the descriptor, passing a custom adapter that forgot to subclass `AudioAdapter`, or config-driven adapter strings built dynamically.

Related errors


AI-assisted analysis of deezer/spleeter@c8854001ac (2026-08-28). Data as JSON: /api/errors/cf4ba4b6f410008a. Report an issue: GitHub.