Spaces:
Running
Running
| # 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}" | |