예제 #1
0
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()
예제 #2
0
파일: peaks.py 프로젝트: tomas-jezek/Python
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é
예제 #3
0
 def __get_wav_stats(self, audio: wave.Wave_read):
     return {
         "waveform": audio,
         "frameRate": audio.getframerate(),
         "nChannels": audio.getnchannels(),
         "sampWidth": audio.getsampwidth()
     }
예제 #4
0
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')
예제 #5
0
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
예제 #6
0
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')