annotate tests/test_util.py @ 321:903b5e1e8af9

Clean up tests
author Amine Sehili <amine.sehili@gmail.com>
date Sat, 19 Oct 2019 15:01:38 +0100
parents 18a9f0dcdaae
children 9f17aa9a4018
rev   line source
amine@317 1 from unittest import TestCase
amine@157 2 import math
amine@157 3 from array import array
amine@317 4 from genty import genty, genty_dataset
amine@317 5 from auditok.util import AudioEnergyValidator
amine@321 6 from auditok.signal import FORMAT
amine@157 7
amine@157 8
amine@157 9 def _sample_generator(*data_buffers):
amine@157 10 """
amine@157 11 Takes a list of many mono audio data buffers and makes a sample generator
amine@157 12 of interleaved audio samples, one sample from each channel. The resulting
amine@157 13 generator can be used to build a multichannel audio buffer.
amine@157 14 >>> gen = _sample_generator("abcd", "ABCD")
amine@157 15 >>> list(gen)
amine@157 16 ["a", "A", "b", "B", "c", "C", "d", "D"]
amine@157 17 """
amine@157 18 frame_gen = zip(*data_buffers)
amine@157 19 return (sample for frame in frame_gen for sample in frame)
amine@157 20
amine@157 21
amine@157 22 def _generate_pure_tone(
amine@157 23 frequency, duration_sec=1, sampling_rate=16000, sample_width=2, volume=1e4
amine@157 24 ):
amine@157 25 """
amine@157 26 Generates a pure tone with the given frequency.
amine@157 27 """
amine@157 28 assert frequency <= sampling_rate / 2
amine@157 29 max_value = (2 ** (sample_width * 8) // 2) - 1
amine@157 30 if volume > max_value:
amine@157 31 volume = max_value
amine@321 32 fmt = FORMAT[sample_width]
amine@157 33 total_samples = int(sampling_rate * duration_sec)
amine@157 34 step = frequency / sampling_rate
amine@157 35 two_pi_step = 2 * math.pi * step
amine@157 36 data = array(
amine@157 37 fmt,
amine@157 38 (
amine@157 39 int(math.sin(two_pi_step * i) * volume)
amine@157 40 for i in range(total_samples)
amine@157 41 ),
amine@157 42 )
amine@157 43 return data
amine@157 44
amine@157 45
amine@157 46 PURE_TONE_DICT = {
amine@157 47 freq: _generate_pure_tone(freq, 1, 16000, 2) for freq in (400, 800, 1600)
amine@157 48 }
amine@157 49 PURE_TONE_DICT.update(
amine@157 50 {
amine@157 51 freq: _generate_pure_tone(freq, 0.1, 16000, 2)
amine@157 52 for freq in (600, 1150, 2400, 7220)
amine@157 53 }
amine@157 54 )
amine@317 55
amine@317 56
amine@317 57 @genty
amine@317 58 class TestAudioEnergyValidator(TestCase):
amine@317 59 @genty_dataset(
amine@317 60 mono_valid_uc_None=([350, 400], 1, None, True),
amine@317 61 mono_valid_uc_any=([350, 400], 1, "any", True),
amine@317 62 mono_valid_uc_0=([350, 400], 1, 0, True),
amine@317 63 mono_valid_uc_mix=([350, 400], 1, "mix", True),
amine@317 64 # previous cases are all the same since we have mono audio
amine@317 65 mono_invalid_uc_None=([300, 300], 1, None, False),
amine@317 66 stereo_valid_uc_None=([300, 400, 350, 300], 2, None, True),
amine@317 67 stereo_valid_uc_any=([300, 400, 350, 300], 2, "any", True),
amine@317 68 stereo_valid_uc_mix=([300, 400, 350, 300], 2, "mix", True),
amine@317 69 stereo_valid_uc_avg=([300, 400, 350, 300], 2, "avg", True),
amine@317 70 stereo_valid_uc_average=([300, 400, 300, 300], 2, "average", True),
amine@317 71 stereo_valid_uc_mix_with_null_channel=(
amine@317 72 [634, 0, 634, 0],
amine@317 73 2,
amine@317 74 "mix",
amine@317 75 True,
amine@317 76 ),
amine@317 77 stereo_valid_uc_0=([320, 100, 320, 100], 2, 0, True),
amine@317 78 stereo_valid_uc_1=([100, 320, 100, 320], 2, 1, True),
amine@317 79 stereo_invalid_uc_None=([280, 100, 280, 100], 2, None, False),
amine@317 80 stereo_invalid_uc_any=([280, 100, 280, 100], 2, "any", False),
amine@317 81 stereo_invalid_uc_mix=([400, 200, 400, 200], 2, "mix", False),
amine@317 82 stereo_invalid_uc_0=([300, 400, 300, 400], 2, 0, False),
amine@317 83 stereo_invalid_uc_1=([400, 300, 400, 300], 2, 1, False),
amine@317 84 zeros=([0, 0, 0, 0], 2, None, False),
amine@317 85 )
amine@317 86 def test_audio_energy_validator(
amine@317 87 self, data, channels, use_channel, expected
amine@317 88 ):
amine@317 89
amine@317 90 data = array("h", data)
amine@317 91 sample_width = 2
amine@317 92 energy_threshold = 50
amine@317 93 validator = AudioEnergyValidator(
amine@317 94 energy_threshold, sample_width, channels, use_channel
amine@317 95 )
amine@317 96
amine@317 97 if expected:
amine@317 98 self.assertTrue(validator.is_valid(data))
amine@317 99 else:
amine@317 100 self.assertFalse(validator.is_valid(data))