forked from librosa/librosa
-
Notifications
You must be signed in to change notification settings - Fork 0
/
test_output.py
133 lines (95 loc) · 3.74 KB
/
test_output.py
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''Tests for output functions'''
# Disable cache
import os
try:
os.environ.pop('LIBROSA_CACHE_DIR')
except:
pass
import six
import librosa
import numpy as np
import tempfile
import pytest
from test_core import srand
def test_write_wav():
def __test(mono, norm):
fpath = os.path.join('tests', 'data', 'test1_22050.wav')
y, sr = librosa.load(fpath, sr=None, mono=mono)
_, tfname = tempfile.mkstemp()
os.close(_)
librosa.output.write_wav(tfname, y, sr, norm=norm)
y_2, sr2 = librosa.load(tfname, sr=None, mono=mono)
os.unlink(tfname)
librosa.util.valid_audio(y_2, mono=mono)
assert np.allclose(sr2, sr)
if norm:
assert np.allclose(librosa.util.normalize(y, axis=-1),
librosa.util.normalize(y_2, axis=-1),
rtol=1e-3, atol=1e-4)
else:
assert np.allclose(y, y_2, rtol=1e-3, atol=1e-4)
for mono in [False, True]:
for norm in [False, True]:
yield __test, mono, norm
def test_times_csv():
def __test(times, annotations, sep):
_, tfname = tempfile.mkstemp()
os.close(_)
# Dump to disk
librosa.output.times_csv(tfname, times, annotations=annotations,
delimiter=sep)
kwargs = dict()
if six.PY3:
kwargs['newline'] = '\n'
# Load it back
with open(tfname, 'r', **kwargs) as fdesc:
for i, line in enumerate(fdesc):
row = line.strip().split(sep)
assert np.allclose(float(row[0]), times[i], atol=1e-3, rtol=1e-3), (row, times)
if annotations is not None:
assert row[1] == annotations[i]
# Remove the file
os.unlink(tfname)
__test_fail = pytest.mark.xfail(__test, raises=librosa.ParameterError)
srand()
for times in [[], np.linspace(0, 10, 20)]:
for annotations in [None, ['abcde'[q] for q in np.random.randint(0, 5,
size=len(times))], list('abcde')]:
for sep in [',', '\t', ' ']:
if annotations is not None and len(annotations) != len(times):
yield __test_fail, times, annotations, sep
else:
yield __test, times, annotations, sep
def test_annotation():
def __test(times, annotations, sep):
_, tfname = tempfile.mkstemp()
os.close(_)
# Dump to disk
librosa.output.annotation(tfname, times, annotations=annotations,
delimiter=sep)
# Load it back
kwargs = dict()
if six.PY3:
kwargs['newline'] = '\n'
with open(tfname, 'r', **kwargs) as fdesc:
for i, line in enumerate(fdesc):
row = line.strip().split(sep)
assert np.allclose([float(row[0]), float(row[1])], times[i], atol=1e-3, rtol=1e-3), (row, times)
if annotations is not None:
assert row[2] == annotations[i]
# Remove the file
os.unlink(tfname)
__test_fail = pytest.mark.xfail(__test, raises=librosa.ParameterError)
srand()
# Make times and durations strictly non-negative
times = np.random.randn(20, 2)**2
times = np.cumsum(times, axis=1)
for annotations in [None, ['abcde'[q]
for q in np.random.randint(0, 5, size=len(times))], list('abcde')]:
for sep in [',', '\t', ' ']:
if annotations is not None and len(annotations) != len(times):
yield __test_fail, times, annotations, sep
else:
yield __test, times, annotations, sep