amine@157: import math amine@157: from array import array amine@157: from auditok.io import DATA_FORMAT amine@157: amine@157: amine@157: def _sample_generator(*data_buffers): amine@157: """ amine@157: Takes a list of many mono audio data buffers and makes a sample generator amine@157: of interleaved audio samples, one sample from each channel. The resulting amine@157: generator can be used to build a multichannel audio buffer. amine@157: >>> gen = _sample_generator("abcd", "ABCD") amine@157: >>> list(gen) amine@157: ["a", "A", "b", "B", "c", "C", "d", "D"] amine@157: """ amine@157: frame_gen = zip(*data_buffers) amine@157: return (sample for frame in frame_gen for sample in frame) amine@157: amine@157: amine@157: def _generate_pure_tone( amine@157: frequency, duration_sec=1, sampling_rate=16000, sample_width=2, volume=1e4 amine@157: ): amine@157: """ amine@157: Generates a pure tone with the given frequency. amine@157: """ amine@157: assert frequency <= sampling_rate / 2 amine@157: max_value = (2 ** (sample_width * 8) // 2) - 1 amine@157: if volume > max_value: amine@157: volume = max_value amine@157: fmt = DATA_FORMAT[sample_width] amine@157: total_samples = int(sampling_rate * duration_sec) amine@157: step = frequency / sampling_rate amine@157: two_pi_step = 2 * math.pi * step amine@157: data = array( amine@157: fmt, amine@157: ( amine@157: int(math.sin(two_pi_step * i) * volume) amine@157: for i in range(total_samples) amine@157: ), amine@157: ) amine@157: return data amine@157: amine@157: amine@157: PURE_TONE_DICT = { amine@157: freq: _generate_pure_tone(freq, 1, 16000, 2) for freq in (400, 800, 1600) amine@157: } amine@157: PURE_TONE_DICT.update( amine@157: { amine@157: freq: _generate_pure_tone(freq, 0.1, 16000, 2) amine@157: for freq in (600, 1150, 2400, 7220) amine@157: } amine@157: )