import inspect import numpy as np import pytest from audio_cleanup import AudioCleaner def test_enhance_batch_without_lengths_typeerror(): c = AudioCleaner(mode="force") assert c.backend == "model" import torch w = torch.zeros(1, 8000) with pytest.raises(TypeError): c._enhancer.enhance_batch(w) def test_process_uses_relative_lengths_one(): src = inspect.getsource(AudioCleaner.process) assert "tensor([1.0])" in src def test_process_preserves_length_and_int16(): c = AudioCleaner(mode="force") n = 16000 pcm = (np.sin(2 * np.pi * 440 * np.arange(n) / 16000) * 8000).astype(np.int16) out = c.process(pcm) assert out.dtype == np.int16 assert out.shape == pcm.shape def test_overlap_process_emits_hop_length(): c = AudioCleaner(mode="force", chunk_s=1.0, hop_s=0.2) hop = 3200 pcm = (np.random.randn(hop) * 500).astype(np.int16) out = c.process(pcm) assert out.shape == (hop,) def test_overlap_runs_model_after_enough_context(): c = AudioCleaner(mode="force", chunk_s=0.5, hop_s=0.25) hop = 4000 for _ in range(4): pcm = (np.sin(2 * np.pi * 440 * np.arange(hop) / 16000) * 8000).astype( np.int16 ) out = c.process(pcm) assert out.shape == (hop,) assert out.dtype == np.int16