193 lines
6.3 KiB
Python
193 lines
6.3 KiB
Python
# Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
from __future__ import annotations
|
|
|
|
import sys
|
|
import warnings
|
|
|
|
import paddle
|
|
|
|
from . import backend, wave_backend
|
|
|
|
|
|
def _check_version(version: str) -> bool:
|
|
# require paddleaudio >= 1.0.2
|
|
ver_arr = version.split('.')
|
|
v0 = int(ver_arr[0])
|
|
v1 = int(ver_arr[1])
|
|
v2 = int(ver_arr[2])
|
|
if v0 < 1:
|
|
return False
|
|
if v0 == 1 and v1 == 0 and v2 <= 1:
|
|
return False
|
|
return True
|
|
|
|
|
|
def list_available_backends() -> list[str]:
|
|
"""List available backends, the backends in paddleaudio and the default backend.
|
|
|
|
Returns:
|
|
list[str]: The list of available backends.
|
|
|
|
Examples:
|
|
.. code-block:: pycon
|
|
|
|
>>> import paddle
|
|
|
|
>>> sample_rate = 16000
|
|
>>> wav_duration = 0.5
|
|
>>> num_channels = 1
|
|
>>> num_frames = sample_rate * wav_duration
|
|
>>> wav_data = paddle.linspace(-1.0, 1.0, int(num_frames)) * 0.1
|
|
>>> waveform = wav_data.tile([num_channels, 1])
|
|
>>> wav_path = "./test.wav"
|
|
|
|
>>> current_backend = paddle.audio.backends.get_current_backend()
|
|
>>> print(current_backend)
|
|
wave_backend
|
|
|
|
>>> backends = paddle.audio.backends.list_available_backends()
|
|
>>> # default backends is ['wave_backend']
|
|
>>> # backends is ['wave_backend', 'soundfile'], if have installed paddleaudio >= 1.0.2
|
|
>>> if 'soundfile' in backends:
|
|
... paddle.audio.backends.set_backend('soundfile')
|
|
>>> paddle.audio.save(wav_path, waveform, sample_rate)
|
|
|
|
"""
|
|
backends = []
|
|
try:
|
|
import paddleaudio
|
|
except ImportError:
|
|
package = "paddleaudio"
|
|
warn_msg = (
|
|
f"Failed importing {package}. \n"
|
|
"only wave_backend(only can deal with PCM16 WAV) supported.\n"
|
|
"if want soundfile_backend(more audio type supported),\n"
|
|
f"please manually installed (usually with `pip install {package} >= 1.0.2`). "
|
|
)
|
|
warnings.warn(warn_msg)
|
|
|
|
if "paddleaudio" in sys.modules:
|
|
version = paddleaudio.__version__
|
|
if not _check_version(version):
|
|
err_msg = (
|
|
f"the version of paddleaudio installed is {version},\n"
|
|
"please ensure the paddleaudio >= 1.0.2."
|
|
)
|
|
raise ImportError(err_msg)
|
|
backends = paddleaudio.backends.list_audio_backends()
|
|
backends.append("wave_backend")
|
|
return backends
|
|
|
|
|
|
def get_current_backend() -> str:
|
|
"""Get the name of the current audio backend
|
|
|
|
Returns:
|
|
str: The name of the current backend,
|
|
the wave_backend or backend imported from paddleaudio
|
|
|
|
Examples:
|
|
.. code-block:: pycon
|
|
|
|
>>> import paddle
|
|
|
|
>>> sample_rate = 16000
|
|
>>> wav_duration = 0.5
|
|
>>> num_channels = 1
|
|
>>> num_frames = sample_rate * wav_duration
|
|
>>> wav_data = paddle.linspace(-1.0, 1.0, int(num_frames)) * 0.1
|
|
>>> waveform = wav_data.tile([num_channels, 1])
|
|
>>> wav_path = "./test.wav"
|
|
|
|
>>> current_backend = paddle.audio.backends.get_current_backend()
|
|
>>> print(current_backend)
|
|
wave_backend
|
|
|
|
>>> backends = paddle.audio.backends.list_available_backends()
|
|
>>> # default backends is ['wave_backend']
|
|
>>> # backends is ['wave_backend', 'soundfile'], if have installed paddleaudio >= 1.0.2
|
|
|
|
>>> if 'soundfile' in backends:
|
|
... paddle.audio.backends.set_backend('soundfile')
|
|
>>> paddle.audio.save(wav_path, waveform, sample_rate)
|
|
|
|
"""
|
|
current_backend = None
|
|
if "paddleaudio" in sys.modules:
|
|
import paddleaudio
|
|
|
|
current_backend = paddleaudio.backends.get_audio_backend()
|
|
if paddle.audio.load == paddleaudio.load:
|
|
return current_backend
|
|
return "wave_backend"
|
|
|
|
|
|
def set_backend(backend_name: str) -> None:
|
|
"""Set the backend by one of the list_audio_backend return.
|
|
|
|
Args:
|
|
backend (str): one of the list_audio_backend. "wave_backend" is the default. "soundfile" imported from paddleaudio.
|
|
|
|
Returns:
|
|
None
|
|
|
|
Examples:
|
|
.. code-block:: pycon
|
|
|
|
>>> import paddle
|
|
|
|
>>> sample_rate = 16000
|
|
>>> wav_duration = 0.5
|
|
>>> num_channels = 1
|
|
>>> num_frames = sample_rate * wav_duration
|
|
>>> wav_data = paddle.linspace(-1.0, 1.0, int(num_frames)) * 0.1
|
|
>>> waveform = wav_data.tile([num_channels, 1])
|
|
>>> wav_path = "./test.wav"
|
|
|
|
>>> current_backend = paddle.audio.backends.get_current_backend()
|
|
>>> print(current_backend)
|
|
wave_backend
|
|
|
|
>>> backends = paddle.audio.backends.list_available_backends()
|
|
>>> # default backends is ['wave_backend']
|
|
>>> # backends is ['wave_backend', 'soundfile'], if have installed paddleaudio >= 1.0.2
|
|
|
|
>>> if 'soundfile' in backends:
|
|
... paddle.audio.backends.set_backend('soundfile')
|
|
>>> paddle.audio.save(wav_path, waveform, sample_rate)
|
|
|
|
"""
|
|
if backend_name not in list_available_backends():
|
|
raise NotImplementedError
|
|
|
|
if backend_name == "wave_backend":
|
|
module = wave_backend
|
|
else:
|
|
import paddleaudio
|
|
|
|
paddleaudio.backends.set_audio_backend(backend_name)
|
|
module = paddleaudio
|
|
|
|
for func in ["save", "load", "info"]:
|
|
setattr(backend, func, getattr(module, func))
|
|
setattr(paddle.audio, func, getattr(module, func))
|
|
|
|
|
|
def _init_set_audio_backend() -> None:
|
|
# init the default wave_backend.
|
|
for func in ["save", "load", "info"]:
|
|
setattr(backend, func, getattr(wave_backend, func))
|