Mercurial > hg > auditok
comparison tests/test_AudioSource.py @ 240:173ffca58d23
Read data from all available channels in AudioSource
author | Amine Sehili <amine.sehili@gmail.com> |
---|---|
date | Thu, 25 Jul 2019 20:50:52 +0100 |
parents | f16fc2c3d12b |
children | 10b725735637 |
comparison
equal
deleted
inserted
replaced
239:6c3b56eb8052 | 240:173ffca58d23 |
---|---|
10 DATA_FORMAT, | 10 DATA_FORMAT, |
11 BufferAudioSource, | 11 BufferAudioSource, |
12 RawAudioSource, | 12 RawAudioSource, |
13 WaveAudioSource, | 13 WaveAudioSource, |
14 ) | 14 ) |
15 from test_util import PURE_TONE_DICT | 15 from test_util import PURE_TONE_DICT, _sample_generator |
16 | 16 |
17 | 17 |
18 def audio_source_read_all_gen(audio_source, size=None): | 18 def audio_source_read_all_gen(audio_source, size=None): |
19 if size is None: | 19 if size is None: |
20 size = int(audio_source.sr * 0.1) # 100ms | 20 size = int(audio_source.sr * 0.1) # 100ms |
29 class TestAudioSource(unittest.TestCase): | 29 class TestAudioSource(unittest.TestCase): |
30 | 30 |
31 # TODO when use_channel is None, return samples from all channels | 31 # TODO when use_channel is None, return samples from all channels |
32 | 32 |
33 @genty_dataset( | 33 @genty_dataset( |
34 mono_default=("mono_400Hz", 1, None, 400), | 34 mono=("mono_400Hz", (400,)), |
35 mono_mix=("mono_400Hz", 1, "mix", 400), | 35 multichannel=("3channel_400-800-1600Hz", (400, 800, 1600)), |
36 mono_channel_selection=("mono_400Hz", 1, 2, 400), | |
37 multichannel_default=("3channel_400-800-1600Hz", 3, None, 400), | |
38 multichannel_channel_select_1st=("3channel_400-800-1600Hz", 3, 1, 400), | |
39 multichannel_channel_select_2nd=("3channel_400-800-1600Hz", 3, 2, 800), | |
40 multichannel_channel_select_3rd=( | |
41 "3channel_400-800-1600Hz", | |
42 3, | |
43 3, | |
44 1600, | |
45 ), | |
46 ) | 36 ) |
47 def test_BufferAudioSource_read_all( | 37 def test_BufferAudioSource_read_all(self, file_suffix, frequencies): |
48 self, file_suffix, channels, use_channel, frequency | |
49 ): | |
50 file = "tests/data/test_16KHZ_{}.raw".format(file_suffix) | 38 file = "tests/data/test_16KHZ_{}.raw".format(file_suffix) |
51 with open(file, "rb") as fp: | 39 with open(file, "rb") as fp: |
52 expected = fp.read() | 40 expected = fp.read() |
53 audio_source = BufferAudioSource(expected, 16000, 2, channels) | 41 channels = len(frequencies) |
54 audio_source.open() | 42 audio_source = BufferAudioSource(expected, 16000, 2, channels) |
55 data = audio_source.read(None) | 43 audio_source.open() |
56 self.assertEqual(data, expected) | 44 data = audio_source.read(None) |
57 audio_source.rewind() | 45 self.assertEqual(data, expected) |
58 data = audio_source.read(-10) | 46 audio_source.rewind() |
59 self.assertEqual(data, expected) | 47 data = audio_source.read(-10) |
60 audio_source.close() | 48 self.assertEqual(data, expected) |
61 | 49 audio_source.close() |
62 | 50 |
63 @genty_dataset( | 51 @genty_dataset( |
64 mono_default=("mono_400Hz", 1, None, 400), | 52 mono=("mono_400Hz", (400,)), |
65 mono_mix=("mono_400Hz", 1, "mix", 400), | 53 multichannel=("3channel_400-800-1600Hz", (400, 800, 1600)), |
66 mono_channel_selection=("mono_400Hz", 1, 2, 400), | |
67 multichannel_default=("3channel_400-800-1600Hz", 3, None, 400), | |
68 multichannel_channel_select_1st=("3channel_400-800-1600Hz", 3, 1, 400), | |
69 multichannel_channel_select_2nd=("3channel_400-800-1600Hz", 3, 2, 800), | |
70 multichannel_channel_select_3rd=( | |
71 "3channel_400-800-1600Hz", | |
72 3, | |
73 3, | |
74 1600, | |
75 ), | |
76 ) | 54 ) |
77 def test_RawAudioSource( | 55 def test_RawAudioSource(self, file_suffix, frequencies): |
78 self, file_suffix, channels, use_channel, frequency | |
79 ): | |
80 file = "tests/data/test_16KHZ_{}.raw".format(file_suffix) | 56 file = "tests/data/test_16KHZ_{}.raw".format(file_suffix) |
81 audio_source = RawAudioSource(file, 16000, 2, channels, use_channel) | 57 channels = len(frequencies) |
58 audio_source = RawAudioSource(file, 16000, 2, channels) | |
82 audio_source.open() | 59 audio_source.open() |
83 data = b"".join(audio_source_read_all_gen(audio_source)) | 60 data_read_all = b"".join(audio_source_read_all_gen(audio_source)) |
84 audio_source.close() | 61 audio_source.close() |
85 expected = _array_to_bytes(PURE_TONE_DICT[frequency]) | 62 mono_channels = [PURE_TONE_DICT[freq] for freq in frequencies] |
86 self.assertEqual(data, expected) | 63 fmt = DATA_FORMAT[audio_source.sample_width] |
64 expected = _array_to_bytes( | |
65 array(fmt, _sample_generator(*mono_channels)) | |
66 ) | |
67 | |
68 self.assertEqual(data_read_all, expected) | |
87 | 69 |
88 # assert read all data with None | 70 # assert read all data with None |
89 audio_source = RawAudioSource(file, 16000, 2, channels, use_channel) | 71 audio_source = RawAudioSource(file, 16000, 2, channels) |
90 audio_source.open() | 72 audio_source.open() |
91 data_read_all = audio_source.read(None) | 73 data_read_all = audio_source.read(None) |
92 audio_source.close() | 74 audio_source.close() |
93 self.assertEqual(data_read_all, expected) | 75 self.assertEqual(data_read_all, expected) |
94 | 76 |
95 # assert read all data with a negative size | 77 # assert read all data with a negative size |
96 audio_source = RawAudioSource(file, 16000, 2, channels, use_channel) | 78 audio_source = RawAudioSource(file, 16000, 2, channels) |
97 audio_source.open() | 79 audio_source.open() |
98 data_read_all = audio_source.read(-10) | 80 data_read_all = audio_source.read(-10) |
99 audio_source.close() | 81 audio_source.close() |
100 self.assertEqual(data_read_all, expected) | 82 self.assertEqual(data_read_all, expected) |
101 | 83 |
102 | 84 @genty_dataset( |
103 def test_RawAudioSource_mix(self): | 85 mono=("mono_400Hz", (400,)), |
104 file = "tests/data/test_16KHZ_3channel_400-800-1600Hz.raw" | 86 multichannel=("3channel_400-800-1600Hz", (400, 800, 1600)), |
105 audio_source = RawAudioSource(file, 16000, 2, 3, use_channel="mix") | 87 ) |
88 def test_WaveAudioSource(self, file_suffix, frequencies): | |
89 file = "tests/data/test_16KHZ_{}.wav".format(file_suffix) | |
90 audio_source = WaveAudioSource(file) | |
106 audio_source.open() | 91 audio_source.open() |
107 data = b"".join(audio_source_read_all_gen(audio_source)) | 92 data = b"".join(audio_source_read_all_gen(audio_source)) |
108 audio_source.close() | 93 audio_source.close() |
109 | 94 mono_channels = [PURE_TONE_DICT[freq] for freq in frequencies] |
110 mono_channels = [PURE_TONE_DICT[freq] for freq in [400, 800, 1600]] | 95 fmt = DATA_FORMAT[audio_source.sample_width] |
111 fmt = DATA_FORMAT[2] | |
112 expected = _array_to_bytes( | 96 expected = _array_to_bytes( |
113 array(fmt, (sum(samples) // 3 for samples in zip(*mono_channels))) | 97 array(fmt, _sample_generator(*mono_channels)) |
114 ) | 98 ) |
115 expected = expected | 99 |
116 self.assertEqual(data, expected) | 100 self.assertEqual(data, expected) |
117 | 101 |
118 @genty_dataset( | |
119 mono_default=("mono_400Hz", 1, None, 400), | |
120 mono_mix=("mono_400Hz", 1, "mix", 400), | |
121 mono_channel_selection=("mono_400Hz", 1, 2, 400), | |
122 multichannel_default=("3channel_400-800-1600Hz", 3, None, 400), | |
123 multichannel_channel_select_1st=("3channel_400-800-1600Hz", 3, 1, 400), | |
124 multichannel_channel_select_2nd=("3channel_400-800-1600Hz", 3, 2, 800), | |
125 multichannel_channel_select_3rd=( | |
126 "3channel_400-800-1600Hz", | |
127 3, | |
128 3, | |
129 1600, | |
130 ), | |
131 ) | |
132 def test_WaveAudioSource( | |
133 self, file_suffix, channels, use_channel, frequency | |
134 ): | |
135 file = "tests/data/test_16KHZ_{}.wav".format(file_suffix) | |
136 audio_source = WaveAudioSource(file, use_channel) | |
137 audio_source.open() | |
138 data = b"".join(audio_source_read_all_gen(audio_source)) | |
139 audio_source.close() | |
140 expected = _array_to_bytes(PURE_TONE_DICT[frequency]) | |
141 self.assertEqual(data, expected) | |
142 | |
143 # assert read all data with None | 102 # assert read all data with None |
144 audio_source = WaveAudioSource(file, use_channel) | 103 audio_source = WaveAudioSource(file) |
145 audio_source.open() | 104 audio_source.open() |
146 data_read_all = audio_source.read(None) | 105 data_read_all = audio_source.read(None) |
147 audio_source.close() | 106 audio_source.close() |
148 self.assertEqual(data_read_all, expected) | 107 self.assertEqual(data_read_all, expected) |
149 | 108 |
150 # assert read all data with a negative size | 109 # assert read all data with a negative size |
151 audio_source = WaveAudioSource(file, use_channel) | 110 audio_source = WaveAudioSource(file) |
152 audio_source.open() | 111 audio_source.open() |
153 data_read_all = audio_source.read(-10) | 112 data_read_all = audio_source.read(-10) |
154 audio_source.close() | 113 audio_source.close() |
155 self.assertEqual(data_read_all, expected) | 114 self.assertEqual(data_read_all, expected) |
156 | |
157 def test_WaveAudioSource_mix(self): | |
158 file = "tests/data/test_16KHZ_3channel_400-800-1600Hz.wav" | |
159 audio_source = WaveAudioSource(file, use_channel="mix") | |
160 audio_source.open() | |
161 data = b"".join(audio_source_read_all_gen(audio_source)) | |
162 audio_source.close() | |
163 | |
164 mono_channels = [PURE_TONE_DICT[freq] for freq in [400, 800, 1600]] | |
165 fmt = DATA_FORMAT[2] | |
166 expected = _array_to_bytes( | |
167 array(fmt, (sum(samples) // 3 for samples in zip(*mono_channels))) | |
168 ) | |
169 self.assertEqual(data, expected) | |
170 | 115 |
171 | 116 |
172 @genty | 117 @genty |
173 class TestBufferAudioSource_SR10_SW1_CH1(unittest.TestCase): | 118 class TestBufferAudioSource_SR10_SW1_CH1(unittest.TestCase): |
174 def setUp(self): | 119 def setUp(self): |