You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
84 lines
2.4 KiB
84 lines
2.4 KiB
"""Defines utilities for switching audio backends"""
|
|
#code is from: https://github.com/pytorch/audio/blob/main/torchaudio/backend/utils.py
|
|
import warnings
|
|
from typing import List
|
|
from typing import Optional
|
|
|
|
import paddleaudio
|
|
from paddleaudio._internal import module_utils as _mod_utils
|
|
|
|
from . import no_backend
|
|
from . import soundfile_backend
|
|
from . import sox_io_backend
|
|
|
|
__all__ = [
|
|
"list_audio_backends",
|
|
"get_audio_backend",
|
|
"set_audio_backend",
|
|
]
|
|
|
|
|
|
def list_audio_backends() -> List[str]:
|
|
"""List available backends
|
|
|
|
Returns:
|
|
List[str]: The list of available backends.
|
|
"""
|
|
backends = []
|
|
if _mod_utils.is_module_available("soundfile"):
|
|
backends.append("soundfile")
|
|
if _mod_utils.is_sox_available():
|
|
backends.append("sox_io")
|
|
return backends
|
|
|
|
|
|
def set_audio_backend(backend: Optional[str]):
|
|
"""Set the backend for I/O operation
|
|
|
|
Args:
|
|
backend (str or None): Name of the backend.
|
|
One of ``"sox_io"`` or ``"soundfile"`` based on availability
|
|
of the system. If ``None`` is provided the current backend is unassigned.
|
|
"""
|
|
if backend is not None and backend not in list_audio_backends():
|
|
raise RuntimeError(f'Backend "{backend}" is not one of '
|
|
f"available backends: {list_audio_backends()}.")
|
|
|
|
if backend is None:
|
|
module = no_backend
|
|
elif backend == "sox_io":
|
|
module = sox_io_backend
|
|
elif backend == "soundfile":
|
|
module = soundfile_backend
|
|
else:
|
|
raise NotImplementedError(f'Unexpected backend "{backend}"')
|
|
|
|
for func in ["save", "load", "info"]:
|
|
setattr(paddleaudio, func, getattr(module, func))
|
|
|
|
|
|
def _init_audio_backend():
|
|
backends = list_audio_backends()
|
|
if "soundfile" in backends:
|
|
set_audio_backend("soundfile")
|
|
elif "sox_io" in backends:
|
|
set_audio_backend("sox_io")
|
|
else:
|
|
warnings.warn("No audio backend is available.")
|
|
set_audio_backend(None)
|
|
|
|
|
|
def get_audio_backend() -> Optional[str]:
|
|
"""Get the name of the current backend
|
|
|
|
Returns:
|
|
Optional[str]: The name of the current backend or ``None`` if no backend is assigned.
|
|
"""
|
|
if paddleaudio.load == no_backend.load:
|
|
return None
|
|
if paddleaudio.load == sox_io_backend.load:
|
|
return "sox_io"
|
|
if paddleaudio.load == soundfile_backend.load:
|
|
return "soundfile"
|
|
raise ValueError("Unknown backend.")
|