Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
c419db3
Criação dos contextos
Zanotelli May 21, 2022
6dddc6d
Merge remote-tracking branch 'origin/main'
Zanotelli May 21, 2022
138cd31
-Criação de contextos da snackbar
Zanotelli May 21, 2022
f379344
asd
Zanotelli May 21, 2022
e85c024
cria endpoint para geracao do espectrograma
pedrobahia7 May 21, 2022
45758bc
cria contexto de parametros
pedrobahia7 May 21, 2022
e5fee8f
Criação aba de parâmetros, concerto de bugs da snakbar
Zanotelli May 22, 2022
1b22a1d
generaliza parametros do popup
pedrobahia7 May 22, 2022
bf6f199
criação das listas de seleção
Zanotelli May 22, 2022
dc01191
implementa opções de parâmetro
pedrobahia7 May 22, 2022
08d7675
corrige identação
pedrobahia7 May 22, 2022
b54e7bc
reordena opções de parâmetro
pedrobahia7 May 22, 2022
032d9ca
concerto da página inicial e da seleção de parâmetros
Zanotelli May 22, 2022
e1ead3c
Merge remote-tracking branch 'origin/main'
Zanotelli May 22, 2022
95ec2fd
concerto da página inicial e da seleção de parâmetros
Zanotelli May 22, 2022
459119a
configura botão para atualizar parametros de audio
pedrobahia7 May 22, 2022
9337288
update pra vrau
Zanotelli May 22, 2022
0bfffce
Merge branch 'PostAudio' into main
Zanotelli May 22, 2022
b76db67
Merge branch 'PostAudio'
gtLara May 22, 2022
f9bf22a
concerto da página inicial e da seleção de parâmetros, carregamento d…
Zanotelli May 23, 2022
231834d
atualização da lista de musicas e alteração de parametros
Zanotelli May 23, 2022
6e7cf05
atualização da lista de musicas e alteração de parametros
Zanotelli May 23, 2022
7b1979d
commit rapidão
Zanotelli May 23, 2022
863ff85
Acerta nome de specId para specid
Saliba-san May 23, 2022
15528ee
Altera retorno de genspec para apenas imagem
gtLara May 23, 2022
46d6210
implementa zoom
pedrobahia7 May 23, 2022
aa5a2a5
Decodifica imagem b64 em uma string utf8
gtLara May 23, 2022
01c5073
Merge branch 'main' of github.com:Saliba-san/inspectrogram
gtLara May 23, 2022
719725a
pra encerar o dia
Zanotelli May 23, 2022
3914b26
Merge remote-tracking branch 'origin/main'
Zanotelli May 23, 2022
c329722
Remove contorno branco de imgeans
gtLara May 24, 2022
e0a1087
Implementa cálculo de decibéis a partir de amplitude via librosa
gtLara May 24, 2022
033fe8e
commit rapidão
Zanotelli May 24, 2022
d2f3bdf
Merge remote-tracking branch 'origin/main'
Zanotelli May 24, 2022
b166989
Remove espaços brancos em torno da imagem
gtLara May 24, 2022
c258ab6
Implementa conversão de amplitude para decibéis via liborsa
gtLara May 24, 2022
58a38ce
Conserta chamada de librosa
gtLara May 24, 2022
3dc5d04
Define borda de imagens para 0 cm
gtLara May 24, 2022
51439d9
Adiciona exceção para miss em base de dados
gtLara May 24, 2022
4334c8d
seleção de músicas
Zanotelli May 24, 2022
4f37b52
Merge remote-tracking branch 'origin/main'
Zanotelli May 24, 2022
def0b07
Modulariza exceção de miss de db
gtLara May 24, 2022
2b54bb7
Merge branch 'main' of github.com:Saliba-san/inspectrogram
gtLara May 24, 2022
c676dbd
Define bordas invisiveis
gtLara May 24, 2022
f1ac953
Define bordas invisiveis
gtLara May 24, 2022
8ffc62d
Define bordas invisiveis
gtLara May 24, 2022
26edbdb
concerto de parâmetros e melhorias estéticas
Zanotelli May 24, 2022
e2ef42e
Adiciona opcao de db ou amplitude
gtLara May 25, 2022
66481ab
Merge branch 'main' of github.com:Saliba-san/inspectrogram
gtLara May 25, 2022
4a8cecc
Modulariza exceção de miss de db
gtLara May 25, 2022
b070e46
Comit final-V1
Zanotelli May 25, 2022
fda5256
Adiciona maximo espectral
gtLara May 25, 2022
1865967
Merge branch 'main' of github.com:Saliba-san/inspectrogram
gtLara May 25, 2022
73017bb
Calcula maximo espectral
gtLara May 25, 2022
e137225
Conserta argumentos de calculo de maximo
gtLara May 25, 2022
c37b33d
método de análise
Zanotelli May 25, 2022
e918b44
Merge remote-tracking branch 'origin/main'
Zanotelli May 25, 2022
ebf7191
Adiciona plot opcional de maximo espectral
gtLara May 25, 2022
2a44ba0
Conserta nome de variavel para avancado
gtLara May 25, 2022
14c8a64
Adiciona método de remoção de músicas
gtLara May 25, 2022
b1241ed
Mudanças estéticas, deleção de parâmetros e adção de opções
Zanotelli May 25, 2022
c3d0903
Merge remote-tracking branch 'origin/main'
Zanotelli May 25, 2022
d442542
Adiciona metodos de deletar musicas
gtLara May 25, 2022
db5cd61
Merge branch 'main' of github.com:Saliba-san/inspectrogram
gtLara May 25, 2022
077c80a
Altera metodo de deletefile para POST
gtLara May 25, 2022
f61e2f4
Versão V1.1
Zanotelli May 25, 2022
17df57a
update de funções
Zanotelli May 25, 2022
b4c2a24
Versão final da apresentação
Zanotelli May 25, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
96 changes: 87 additions & 9 deletions back/src/controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,42 +7,120 @@
from audio import AudioSignal
from stft import Stft
from spectrogram import Spectrogram
from routes import musics
from routes import musics, allowed_file
from app import create_app
import os
from flask import current_app,jsonify,request,flash, redirect, url_for
from app import create_app,db, UPLOAD_FOLDER, ALLOWED_EXTENSIONS
from models import Musics,musics_schema,Images,images_schema
from werkzeug.utils import secure_filename
from tinytag import TinyTag
import numpy as np

# app = Flask("SpectrogramAPI")
app = create_app()
api = Api(app)

app.secret_key = 'bcyiae7doqbucmopighyi'

class Generate_spectrogram(Resource):

def post(self):

json_dict = request.get_json(force=True)
parameters = StftParams().set_by_json(json_dict)

audio_id = json_dict["specId"]
audio_id = json_dict["specid"]
print(audio_id)

print("#########################")
musics = Musics.query.filter_by(id=audio_id)
audio_file_path = musics_schema.dump(musics)[0]["path"]

audio = AudioSignal(audio_file_path=audio_file_path)

stft = Stft(parameters).set_stft_from_audio(audio)
stft.set_spectral_maxima()

spectrogram = Spectrogram(stft)
b64_img = spectrogram.visualize()

data = {}
data['id'] = '1'
data['image'] = str(b64_img)

json_response = json.dumps(data)
img = str(b64_img, "utf-8")

return json_response
return img

api.add_resource(Generate_spectrogram, "/genspec")

@app.route("/uploadfile", methods=["GET","POST"], strict_slashes=False)
def musics_post():
if request.method == "POST":
print(request.files)
if 'file' not in request.files:
flash('No file part')
return redirect(request.url)

file = request.files['file']
# If the user does not select a file, the browser submits an
# empty file without a filename.
if file.filename == '':
flash('No selected file')
return redirect(request.url)

path = app.config['UPLOAD_FOLDER']+ '/' + file.filename

if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))

music_file = TinyTag.get(path)
name = file.filename
if music_file.title:
name = music_file.title
artist = music_file.artist
new_music = Musics(music=name, artist=artist, path=path)
db.session.add(new_music)
db.session.commit()

musics = Musics.query.all()
results = musics_schema.dump(musics)
return jsonify(results)

@app.route("/deletefile", methods=["GET", "POST"], strict_slashes=False)
def music_delete():

if 'id' not in request.form:
flash('Without id')
return redirect(request.url)

json_dict = request.get_json(force=True)

deleting_id = json_dict["specid"]

music = Musics.query.filter_by(id=deleting_id).first()

if os.path.exists(music.path):
os.remove(music.path)

db.session.delete(music)
db.session.commit()

@app.route("/deleteall", methods=["GET", "DELETE"], strict_slashes=False)
def music_delete_all():

musics = Musics.query.all()

results = musics_schema.dump(musics)

print(results)

paths = [res["path"] for res in results]

for path in paths:
if os.path.exists(path):
print("##########")
print(f"os.remove({path})")

db.session.delete(musics)
db.session.commit()

if __name__ == "__main__":
app.run(port=8080, debug=True)
Binary file modified back/src/data/database.db
Binary file not shown.
Binary file modified back/src/files/audio.wav
Binary file not shown.
4 changes: 4 additions & 0 deletions back/src/parameters.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ class StftParams:

def __init__(self, frame_size=1024, hop_length=512, window="hann",
mode="power", cmap="prism", sr=None, db=True, freq_slice=None):

self.mode = mode
self.window = window
self.frame_size = frame_size
Expand All @@ -13,9 +14,12 @@ def __init__(self, frame_size=1024, hop_length=512, window="hann",
self.freq_slice = freq_slice

def set_by_json(self, json_dict):
self.db = json_dict["intensity"]
self.analysis = json_dict["analysis"]
self.mode = json_dict["mode"]
self.window = json_dict["window"]
self.frame_size = json_dict["framelength"]
self.hop_length = json_dict["hoplength"]
self.cmap = json_dict["cmap"]

return self
3 changes: 2 additions & 1 deletion back/src/routes.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,10 @@ def musics():
#path = np.array(results)[idxs]['path']
return (jsonify(results))

@app.route("/musics-post", methods=["GET","POST"], strict_slashes=False)
@app.route("/uploadfile", methods=["GET","POST"], strict_slashes=False)
def musics_post():
if request.method == "POST":
print(request)
if 'file' not in request.files:
flash('No file part')
return redirect(request.url)
Expand Down
17 changes: 11 additions & 6 deletions back/src/spectrogram.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import numpy as np
import matplotlib.pyplot as plt
from librosa import display as ld
import librosa as rosa
from abc import ABC, abstractmethod
import copy
import io
import base64


class VisualizationStrategy(ABC):

@abstractmethod
Expand All @@ -25,34 +25,40 @@ def visualize(self, stft, cmap=None):
y_axis="linear")

bytes_string = io.BytesIO()
plt.savefig(bytes_string, format='png', dpi=1800)
plt.savefig(bytes_string, format='png', dpi=1800, bbox_inches="tight",
pad_inches=0)

bytes_string.seek(0)
b64_img = base64.b64encode(bytes_string.read())

plt.close()

return b64_img


class MatplotVisualizationStrategy(VisualizationStrategy):

def visualize(self, stft, cmap):

plt.imshow(stft.fft_frames, cmap=cmap)

if stft.analysis == "complex":
plt.plot(stft.spectral_maxima, color="red", linewidth=0.1)

plt.xlabel("")
plt.ylabel("")
plt.xticks([])
plt.yticks([])

bytes_string = io.BytesIO()
plt.savefig(bytes_string, format='png', dpi=1800)
plt.savefig(bytes_string, format='png', dpi=1800, bbox_inches="tight",
pad_inches=0, transparent=True)

bytes_string.seek(0)
b64_img = base64.b64encode(bytes_string.read())

plt.close()
return b64_img


class Spectrogram():

def __init__(self, stft):
Expand Down Expand Up @@ -81,4 +87,3 @@ def set_strategy(self, strategy="rosa"):
def visualize(self):
img = self.visualizer.visualize(self.stft, self.cmap)
return img

30 changes: 26 additions & 4 deletions back/src/stft.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,13 @@ def __init__(self, parameters):
self.sr = parameters.sr
self.db = parameters.db
self.freq_slice = parameters.freq_slice
self.analysis = parameters.analysis
self.spectral_maxima = None

def set_stft(self, signal):

assert self.frame_size > self.hop_length, "Tamanho de salto inferior a tamanho de quadro de FFT"

mode_transform = {
"power": np.abs,
"abs": np.abs,
Expand All @@ -36,9 +40,9 @@ def set_stft(self, signal):
nperseg=self.frame_size,
noverlap=self.hop_length)

fft_frames = rosa.stft(signal, n_fft=self.frame_size,
hop_length=self.hop_length,
window=self.window)
# fft_frames = rosa.stft(signal, n_fft=self.frame_size,
# hop_length=self.hop_length,
# window=self.window)

if self.freq_slice is not None:
fft_frames = fft_frames[self.freq_slice]
Expand All @@ -48,7 +52,10 @@ def set_stft(self, signal):
if self.mode == "power":
fft_frames = np.square(fft_frames)

if self.db:
if self.db == "db":
fft_frames = rosa.amplitude_to_db(fft_frames, ref=np.max)
else:
fft_frames[np.where(fft_frames <= 0)] = 1e-12
fft_frames = 10*np.log10(fft_frames)

fft_frames = np.flip(fft_frames, axis=0)
Expand All @@ -60,9 +67,24 @@ def set_stft_from_audio(self, audio_signal):
self.sr = audio_signal.sr

self.set_stft(audio_signal.signal)

return self

def get_stft(self):

assert self.fft_frames is not None, "SFTF data not defined"

return self.fft_frames

# def get_frame_maxima(self, fft_frame, n=1):

# return np.mean(np.argpartition(fft_frame, -n)[-n:])

def set_spectral_maxima(self, stft_params=1, n=1):

maxima = np.zeros(self.fft_frames.shape[1])

for f, frame in enumerate(self.fft_frames.T):
maxima[f] = np.argpartition(frame, -1)[-1]

self.spectral_maxima = maxima
12 changes: 8 additions & 4 deletions back/test/spectrogram.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
import io
import base64

mpl.rcParams['savefig.pad_inches'] = 0

class VisualizationStrategy(ABC):

@abstractmethod
Expand All @@ -24,15 +26,15 @@ def visualize(self, stft, cmap=None):
y_axis="linear")

bytes_string = io.BytesIO()
plt.savefig(bytes_string, format='png')
plt.autoscale(tight=True)
plt.savefig(bytes_string, format='png', bbox_inches="tight")
bytes_string.seek(0)
b64_img = base64.b64encode(bytes_string.read())

plt.close()

return b64_img


class MatplotVisualizationStrategy(VisualizationStrategy):

def visualize(self, stft, cmap):
Expand All @@ -44,14 +46,16 @@ def visualize(self, stft, cmap):
plt.yticks([])

bytes_string = io.BytesIO()
plt.savefig(bytes_string, format='png')
plt.autoscale(tight=True)
plt.margins(x=0)
plt.margins(y=0)
plt.savefig(bytes_string, format='png', bbox_inches="tight")
bytes_string.seek(0)
b64_img = base64.b64encode(bytes_string.read())

plt.close()
return b64_img


class Spectrogram():

def __init__(self, stft):
Expand Down
2 changes: 1 addition & 1 deletion back/test/stft.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ def set_stft(self, signal):
fft_frames = np.square(fft_frames)

if self.db:
fft_frames = 10*np.log10(fft_frames)
fft_frames = librosa.amplitude_to_db(fft_frames, ref=np.max)

fft_frames = np.flip(fft_frames, axis=0)

Expand Down
Loading