Минимальное представление звуковой волны? - PullRequest
0 голосов
/ 06 ноября 2019

Я хотел бы извлечь одномерный вектор из саундтрека, просто представляя его «громкость» или «интенсивность» (я не уверен насчет этой терминологии) в данный момент времени.

Например,доступный образец:

wget https://freewavesamples.com/files/Ensoniq-ESQ-1-Sympy-C4.wav

И преобразование его в mono:

ffmpeg -i Ensoniq-ESQ-1-Sympy-C4.wav -acodec pcm_s16le -ac 1 -ar 44100 audio_test.wav

Я собрал из связанныхТема вопросов и ответов для визуализации звуковой волны:

from scipy.io.wavfile import read
import matplotlib.pyplot as plt

input_data = read("audio_test.wav")
audio = input_data[1]

plt.plot(audio)
plt.ylabel("Amplitude")
plt.xlabel("Time")  
plt.title("Sample Wav")
plt.show()

simple wave plot

Положительные и отрицательные стороны довольно симметричны, ноне полностью. Есть ли способ объединить их в одну «позитивную» линию? Если да, как я могу извлечь такие точки данных из переменной audio?

Большое спасибо за вашу помощь!

1 Ответ

1 голос
/ 06 ноября 2019

Следуя @ anerisgreat и советам коллеги, я пришел к этому решению (которое имеет больше смысла при увеличении аудиосэмпла):

wget https://file-examples.com/wp-content/uploads/2017/11/file_example_WAV_10MG.wav
ffmpeg -i file_example_WAV_10MG.wav -acodec pcm_s16le -ac 1 -ar 44100 audio_test.wav
from scipy.io.wavfile import read
import matplotlib.pyplot as plt

def positive_enveloppe(wav_dat):
    freq = wav_dat[0]
    pts = np.absolute(wav_dat[1])
    pos_env = np.zeros(len(pts) // freq + int(bool(len(pts) % freq)))

    env_idx, pts_idx = 0, 0
    while pts_idx < len(pts):
        sub_ar = pts[pts_idx:pts_idx+freq]
        mov_avg = np.mean(sub_ar)
        pos_env[env_idx] = mov_avg
        pts_idx += freq
        env_idx += 1

    return pos_env

input_data = read("audio_test.wav")
enveloppe_data = positive_enveloppe(input_data)
plt.plot(enveloppe_data)
plt.show()

Выход:

positive enveloppe

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...