Spaces:
Running
on
Zero
Running
on
Zero
# Copyright (c) Meta Platforms, Inc. and affiliates. | |
# All rights reserved. | |
# | |
# This source code is licensed under the license found in the | |
# LICENSE file in the root directory of this source tree. | |
import pytest | |
from omegaconf import OmegaConf | |
from audiocraft.utils.audio_effects import AudioEffects, get_audio_effects, select_audio_effects | |
from ..common_utils import get_batch_white_noise | |
class TestAudioEffect: | |
SR = 16_000 | |
def audio_effects(self): | |
cfg = { | |
"audio_effects": { | |
"speed": { | |
"sample_rate": self.SR, | |
"speed_range": [0.8, 1.2] | |
}, | |
"updownresample": { | |
"sample_rate": self.SR, | |
"intermediate_freq": 32_000, | |
}, | |
"echo": { | |
"sample_rate": self.SR, | |
"volume_range": [0.1, 0.5], | |
}, | |
"random_noise": { | |
"noise_std": 0.001, | |
}, | |
"pink_noise": { | |
"noise_std": 0.01, | |
}, | |
"lowpass_filter": { | |
"sample_rate": self.SR, | |
"cutoff_freq": 5_000, | |
}, | |
"highpass_filter": { | |
"sample_rate": self.SR, | |
"cutoff_freq": 500, | |
}, | |
"bandpass_filter": { | |
"sample_rate": self.SR, | |
"cutoff_freq_low": 300, | |
"cutoff_freq_high": 8_000, | |
}, | |
"smooth": { | |
"window_size_range": [2, 10], | |
}, | |
"boost_audio": { | |
"amount": 20, | |
}, | |
"duck_audio": { | |
"amount": 20, | |
}, | |
"mp3_compression": { | |
"sample_rate": self.SR, | |
"bitrate": "128k", | |
}, | |
"aac_compression": { | |
"sample_rate": self.SR, | |
"bitrate": "128k", | |
"lowpass_freq": None, | |
} | |
} | |
} | |
weights = { | |
"speed": 2.0, | |
"updownresample": 0.4, | |
"echo": 1.0, | |
"random_noise": 3.0, | |
"pink_noise": 0.5, | |
"lowpass_filter": 4.0, | |
"highpass_filter": 5.0, | |
"bandpass_filter": 6.0, | |
"smooth": 1.0, | |
} | |
return get_audio_effects(OmegaConf.structured(cfg)), weights | |
def test_select_empty_effects(self): | |
effects = select_audio_effects({}) | |
assert "identity" in effects and effects["identity"] == AudioEffects.identity | |
def test_select_wrong_strategy(self): | |
with pytest.raises(ValueError): | |
_ = select_audio_effects( | |
audio_effects={}, | |
mode="some invalid mode" | |
) | |
def test_selection(self, audio_effects): | |
effect_cfg, weights = audio_effects | |
effects = select_audio_effects( | |
audio_effects=effect_cfg, | |
weights=weights, | |
mode="weighted" | |
) | |
b, c, t = 2, 4, 32000 | |
audio = get_batch_white_noise(b, c, t) | |
for effect_name, effect_func in effects.items(): | |
modified_audio = effect_func(audio) | |
# It is quite hard to unit test the content of the modified_audio though | |
if effect_name == "speed": # Speeding up audio should return in more frames | |
assert modified_audio.size()[-1] > audio.size()[-1] | |
else: | |
assert modified_audio.size() == audio.size(), f"Wrong dimension in {effect_name}" | |