Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from pydub import AudioSegment
- import numpy as np
- from scipy.signal import find_peaks
- import matplotlib.pyplot as plt
- audio = AudioSegment.from_file('file_example_MP3_2MG.mp3', format='mp3')
- # audio = AudioSegment.from_file('heartbeat-03.mp3', format='mp3')
- samples = np.array(audio.get_array_of_samples())
- """
- Семплите са дискретни измервания на амплитудата на аудио сигнал, направени на равни интервали във времето. Те
- представляват цифровото "превод" на аналоговия звук. Честотата на семплиране определя колко семпла се вземат за
- секунда (например 44100 Hz). Всеки семпъл е числова стойност, представяща силата на звука в конкретен момент. В
- цифровата обработка на аудио, семплите са основните градивни елементи, позволяващи манипулация,
- анализ и възпроизвеждане на звук в компютърните системи.
- """
- # Ако аудиото е стерео, раздели на два канала
- if audio.channels == 2:
- samples = samples.reshape((-1, 2))
- # Конвертиране на стерео аудио към моно ако е нужно
- if samples.ndim == 2:
- samples = samples.mean(axis=1)
- # Намиране на пикове
- peaks, _ = find_peaks(samples, height=0.6 * np.max(samples), distance=audio.frame_rate / 2)
- """"
- find_peaks() е функция, която открива локални максимуми (пикове) в едномерен масив
- В контекста на аудио сигнал, тези пикове могат да представляват ударите на сърцето
- Параметърът height определя минималната амплитуда = 60% или 0.6, която се счита за пик
- Параметърът distance (не се прилага в секунди, а в брой семпли.)
- Гарантира, че пиковете са разделени от минимално разстояние, което помага да се избегнат фалшиви детекции
- """
- # Конвертиране на пиковете в секунди
- times = peaks / audio.frame_rate
- print('Ритъм (в секунди):\n', times)
- # Ако numpy array е бил моно, конвертирай обратно към стерео
- if samples.ndim == 1:
- samples = np.column_stack([samples, samples])
- # Получаване на sample_width от оригиналния аудио файл
- sample_width = audio.sample_width
- # Конвертиране на numpy array към pydub аудио сегмент
- new_audio = AudioSegment(
- samples.tobytes(),
- frame_rate=audio.frame_rate,
- sample_width=sample_width,
- channels=samples.shape[1]
- )
- # Запис на аудио сегмента като WAV файл
- new_audio.export('output_audio.wav', format='wav')
- # конвертирай WAV към MP3
- # !ffmpeg -i output_audio.wav output_audio.mp3
- # графика амплитудата на сигнала във времето с маркирани пикове
- plt.plot(samples)
- plt.plot(peaks, samples[peaks], "x",color = 'blue')
- for peak in peaks:
- plt.axvline(x=peak,
- color='green')
- plt.show()
- print()
- average_time_between_beats = np.mean(np.diff(times))
- bpm = 60 / average_time_between_beats
- print(f"Средно BPM: {bpm}")
- # Изчислете стандартното отклонение на времето между ударите.
- beat_variation = np.std(np.diff(times))
- print(f"Вариация в ритъма: {beat_variation} секунди")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement