def play_audio(wf:wave.Wave_read): CHUNK = 1024 # instantiate PyAudio (1) p = pyaudio.PyAudio() # open stream (2) stream = p.open(format=p.get_format_from_width(wf.getsampwidth()), channels=wf.getnchannels(), rate=wf.getframerate(), output=True) # read data data = wf.readframes(CHUNK) # play stream (3) while len(data) > 0: stream.write(data) data = wf.readframes(CHUNK) stream.stop_stream() stream.close() p.terminate()
def fourier(audio: wave.Wave_read) -> Tuple[Optional[int], Optional[int]]: """Fourierova analýza vstupních dat, vracející (nejnižší, nejvyšší) frekvenci.""" # data length = audio.getnframes() sample_rate = audio.getframerate() windows_count = length // sample_rate channels = 1 if audio.getnchannels() == 1 else 2 # Stereo (2) vs. Mono (1) frames = sample_rate * windows_count data = np.array(unpack(f"{channels * frames}h", audio.readframes(frames))) if channels == 2: data = merge_channels(data) # amplitudy low, high = None, None for i in range(windows_count): bounds = (i * sample_rate, i * sample_rate + sample_rate) window = data[bounds[0]:bounds[1]] amplitudes = np.abs(np.fft.rfft(window)) average = np.average(amplitudes) # peaks peak = lambda amp: amp >= 20 * average # ze zadání for j in range(len(amplitudes)): amplitude = amplitudes[j] if not peak(amplitude): continue if not low: low = j high = j else: high = j if not any((low, high)): return None, None return (high, low) if high < low else (low, high) # Může být totiž prohozené
def __get_wav_stats(self, audio: wave.Wave_read): return { "waveform": audio, "frameRate": audio.getframerate(), "nChannels": audio.getnchannels(), "sampWidth": audio.getsampwidth() }
def filter_lowpass(wav: Wave_read, cutoff: int): signal = wav.data signal = np.fromstring(signal, "Int16") index = -1 frames = [] for frame in signal: index += 1 if abs(frame) < cutoff: frames.append(10) pass else: frames.append(frame) wav.close() filtered: wave.Wave_write = wave.open(join(const.AUDIO_DIR, 'temp.wav'), 'w') filtered.setframerate(wav.getframerate()) filtered.setsampwidth(wav.getsampwidth()) filtered.setnchannels(wav.getnchannels()) for frame in frames: data = struct.pack('<h', frame) filtered.writeframesraw(data) filtered.close() return wave.open(join(const.AUDIO_DIR, 'temp.wav'), 'r')
def get_bitrate(wave_obj:wave.Wave_read): framerate = wave_obj.getframerate() num_channels = wave_obj.getnchannels() sample_width = wave_obj.getsampwidth() bitrate = (framerate * num_channels * sample_width) / 1000 return bitrate
def filter_lowpassTest(wav: Wave_read, cutoff: int): signal = wav.readframes(-1) signal = np.fromstring(signal, "Int16") filtered: wave.Wave_write = wave.open(join(const.AUDIO_DIR, 'temp.wav'), 'w') filtered.setframerate(wav.getframerate()) filtered.setsampwidth(wav.getsampwidth()) filtered.setnchannels(wav.getnchannels()) for frame in frames: data = struct.pack('<h', frame) filtered.writeframesraw(data) filtered.close() return wave.open(join(const.AUDIO_DIR, 'temp.wav'), 'r')