1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
|
"""Test suite for compliance with the ITU-R BS.1770-4 recommendation"""
import zipfile
import pytest
import torch
import torchaudio
import torchaudio.functional as F
# Test files linked in https://www.itu.int/dms_pub/itu-r/opb/rep/R-REP-BS.2217-2-2016-PDF-E.pdf
@pytest.mark.parametrize(
"filename,url,expected",
[
(
"1770-2_Comp_RelGateTest",
"http://www.itu.int/dms_pub/itu-r/oth/11/02/R11020000010030ZIPM.zip",
-10.0,
),
(
"1770-2_Comp_AbsGateTest",
"http://www.itu.int/dms_pub/itu-r/oth/11/02/R11020000010029ZIPM.zip",
-69.5,
),
(
"1770-2_Comp_24LKFS_500Hz_2ch",
"http://www.itu.int/dms_pub/itu-r/oth/11/02/R11020000010018ZIPM.zip",
-24.0,
),
(
"1770-2 Conf Mono Voice+Music-24LKFS",
"http://www.itu.int/dms_pub/itu-r/oth/11/02/R11020000010038ZIPM.zip",
-24.0,
),
],
)
def test_loudness(tmp_path, filename, url, expected):
zippath = tmp_path / filename
torch.hub.download_url_to_file(url, zippath, progress=False)
with zipfile.ZipFile(zippath) as file:
file.extractall(zippath.parent)
waveform, sample_rate = torchaudio.load(zippath.with_suffix(".wav"))
loudness = F.loudness(waveform, sample_rate)
expected = torch.tensor(expected, dtype=loudness.dtype, device=loudness.device)
assert torch.allclose(loudness, expected, rtol=0.01, atol=0.1)
|