Я хочу сделать вывод спектра аудио файла по его hz, с помощью librosa я смог получить спектр и преобразовать его (возможно не правильно) в цифровые значения, но возникла проблема что вывод не успевает выводить семплы из цикла for поэтому он зачастую опаздывает и выводит позже, как можно это реализовать и синхронизировать звук с выводом спектра?
Код:
import librosa
import numpy as np
import matplotlib.pyplot as plt
import librosa.display
import time
print("load")
def rotate(arr):
out = []
for i in range(len(arr[0])):
new = []
for b in arr:
new.append(b[i])
out.append(new)
return out
# arr = [[1,2,3],[1,2,3]]
# print(rotate(arr)) # [[1,1],[2,2],[3,3]]
y, sr = librosa.load('41_1.wav', sr=8000, mono=True) # sr - частота аудио
melspec = librosa.feature.melspectrogram(y=y, sr=sr)
melspec = librosa.power_to_db(melspec).astype(np.float32)
nmelspec = np.array(rotate(melspec))
print(len(nmelspec))
print(len(nmelspec[0]))
for i in range(len(nmelspec)):
oneTime = time.time()
hz20_100 = max(nmelspec[i][:20])
hz100_300 = max(nmelspec[i][20:50])
hz300_1000 = max(nmelspec[i][50:90])
hz1000_5000 = max(nmelspec[i][90:110])
hz5000_20000 = max(nmelspec[i][110:127])
if hz20_100 < 0: print(0)
else: print("0"*(int(hz20_100/4)+1))
if hz100_300 < 0: print(0)
else: print("0"*(int(hz100_300/4)+1))
if hz300_1000 < 0: print(0)
else: print("0"*(int(hz300_1000/4)+1))
if hz1000_5000 < 0: print(0)
else: print("0"*(int(hz1000_5000/4)+1))
if hz5000_20000 < 0: print(0)
else: print("0"*(int(hz5000_20000/4)+1))
print("---------------------")
time.sleep(70/len(nmelspec)-(time.time()-oneTime)) # 70 секунд длится запись в аудио файле