Skip to content
This repository was archived by the owner on Aug 18, 2020. It is now read-only.

Commit 69cffd1

Browse files
author
karllab41
authored
Merge pull request #87 from aganeshLab41/prod
made changes to nmf and plotting
2 parents bd9b95b + 204fc8f commit 69cffd1

6 files changed

Lines changed: 137 additions & 60 deletions

File tree

Dockerfile

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -14,21 +14,5 @@ WORKDIR /magnoliaWork
1414
RUN pip install .
1515
WORKDIR /magnoliaWork/src/demo
1616

17-
RUN mkdir /magnoliaWork/src/demo/app/static/models && \
18-
echo "Now getting Deep Clustering code" && \
19-
wget "https://www.dropbox.com/s/01f1jrss5leqarq/deep_clustering.ckpt.data-00000-of-00001?dl=0" -O \
20-
/magnoliaWork/src/demo/app/static/models/deep_clustering.ckpt.data-00000-of-00001 && \
21-
wget "https://www.dropbox.com/s/jeyjsgo4eg1e7uz/deep_clustering.ckpt.index?dl=0" -O \
22-
/magnoliaWork/src/demo/app/static/models/deep_clustering.ckpt.index && \
23-
wget "https://www.dropbox.com/s/w56skx9k5plz316/deep_clustering.ckpt.meta?dl=0" -O \
24-
/magnoliaWork/src/demo/app/static/models/deep_clustering.ckpt.meta && \
25-
echo "Now getting Lab41 Model" && \
26-
wget "https://www.dropbox.com/s/yrct5fmtxh9xisv/lab41_nonorm-final.ckpt.data-00000-of-00001?dl=0" -O \
27-
/magnoliaWork/src/demo/app/static/models/lab41_nonorm-final.ckpt.data-00000-of-00001 && \
28-
wget "https://www.dropbox.com/s/oa05j8mrfenmohf/lab41_nonorm-final.ckpt.index?dl=0" -O \
29-
/magnoliaWork/src/demo/app/static/models/lab41_nonorm-final.ckpt.index && \
30-
wget "https://www.dropbox.com/s/xka5emn0fbfzvq7/lab41_nonorm-final.ckpt.meta?dl=0" -O \
31-
/magnoliaWork/src/demo/app/static/models/lab41_nonorm-final.ckpt.meta
3217

33-
RUN mkdir /magnoliaWork/src/demo/app/resources
3418

Dockerfile_copy

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
FROM continuumio/anaconda3:4.2.0
2+
3+
RUN conda install -y flask
4+
RUN pip install --upgrade pip
5+
RUN apt-get install -y libsndfile1 && \
6+
pip install h5py
7+
8+
EXPOSE 5000
9+
RUN pip install --upgrade matplotlib && pip install https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-1.1.0-cp35-cp35m-linux_x86_64.whl
10+
RUN pip install --upgrade scipy
11+
12+
ADD . /magnoliaWork
13+
WORKDIR /magnoliaWork
14+
RUN pip install .
15+
WORKDIR /magnoliaWork/src/demo
16+
17+
RUN mkdir /magnoliaWork/src/demo/app/static/models && \
18+
echo "Now getting Deep Clustering code" && \
19+
wget "https://www.dropbox.com/s/01f1jrss5leqarq/deep_clustering.ckpt.data-00000-of-00001?dl=0" -O \
20+
/magnoliaWork/src/demo/app/static/models/deep_clustering.ckpt.data-00000-of-00001 && \
21+
wget "https://www.dropbox.com/s/jeyjsgo4eg1e7uz/deep_clustering.ckpt.index?dl=0" -O \
22+
/magnoliaWork/src/demo/app/static/models/deep_clustering.ckpt.index && \
23+
wget "https://www.dropbox.com/s/w56skx9k5plz316/deep_clustering.ckpt.meta?dl=0" -O \
24+
/magnoliaWork/src/demo/app/static/models/deep_clustering.ckpt.meta && \
25+
echo "Now getting Lab41 Model" && \
26+
wget "https://www.dropbox.com/s/yrct5fmtxh9xisv/lab41_nonorm-final.ckpt.data-00000-of-00001?dl=0" -O \
27+
/magnoliaWork/src/demo/app/static/models/lab41_nonorm-final.ckpt.data-00000-of-00001 && \
28+
wget "https://www.dropbox.com/s/oa05j8mrfenmohf/lab41_nonorm-final.ckpt.index?dl=0" -O \
29+
/magnoliaWork/src/demo/app/static/models/lab41_nonorm-final.ckpt.index && \
30+
wget "https://www.dropbox.com/s/xka5emn0fbfzvq7/lab41_nonorm-final.ckpt.meta?dl=0" -O \
31+
/magnoliaWork/src/demo/app/static/models/lab41_nonorm-final.ckpt.meta
32+
33+
RUN mkdir /magnoliaWork/src/demo/app/resources
34+

src/demo/app/tflow_functions.py

Lines changed: 77 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -9,70 +9,117 @@
99
#from .model_functions import separate_sources
1010

1111
import soundfile as sf
12-
12+
import numpy as np
1313
from magnolia.dnnseparate.L41model import L41Model
1414
from magnolia.dnnseparate.deep_clustering_model import DeepClusteringModel
1515
#from .deep_clustering_models import DeepClusteringModel
1616
#from .clustering_utils import clustering_separate
17-
from magnolia.utils.clustering_utils import clustering_separate
17+
from magnolia.utils.clustering_utils import clustering_separate,preprocess_signal
1818
#from .l41_models import L41Model
19-
19+
from magnolia.factorization.nmf import easy_nmf_separate
20+
from magnolia.features.preprocessing import undo_preemphasis,make_stft_features
21+
from magnolia.features.spectral_features import istft
22+
from magnolia.utils.postprocessing import reconstruct
2023
'''
2124
Input: noisy signal path
2225
Output: list of separated speakers (in numpy form)
2326
'''
2427

2528
'''def tflow_separate(input_path):
26-
27-
rate = 10000
29+
30+
rate = 10000
2831
29-
wav_list = []
32+
wav_list = []
3033
31-
model = Conv1DModel([None,None,251,1],[None,None,251,2],20,600,50)
32-
model.load(app.root_path + '/static/models/better_cnn-mask-model.ckpt')
34+
model = Conv1DModel([None,None,251,1],[None,None,251,2],20,600,50)
35+
model.load(app.root_path + '/static/models/better_cnn-mask-model.ckpt')
3336
34-
outputs = separate_sources(input_path,model)
35-
for row in outputs:
36-
wav_list.append(row)
37+
outputs = separate_sources(input_path,model)
38+
for row in outputs:
39+
wav_list.append(row)
3740
38-
return wav_list
41+
return wav_list
3942
'''
4043
'''
4144
Input: noisy signal path
4245
Output: list of separated speakers (in numpy form)
4346
'''
4447
def deep_cluster_separate(input_path):
4548

46-
47-
wav_list = []
48-
49-
input_signal,sample_rate = sf.read(input_path)
49+
50+
wav_list = []
5051

51-
model = DeepClusteringModel()
52-
model.load(app.root_path + '/static/models/deep_clustering.ckpt')
52+
input_signal,sample_rate = sf.read(input_path)
5353

54-
outputs = clustering_separate(input_signal,sample_rate,model,2)
55-
for row in outputs:
56-
wav_list.append(row)
54+
model = DeepClusteringModel()
55+
model.load(app.root_path + '/static/models/deep_clustering.ckpt')
5756

58-
return wav_list
57+
outputs = clustering_separate(input_signal,sample_rate,model,2)
58+
for row in outputs:
59+
wav_list.append(row)
5960

61+
return wav_list
6062

6163

6264
'''
6365
Input: noisy signal path
6466
Output: list of separated speakers (in numpy form)
6567
'''
6668
def l41_separate(input_path):
67-
wav_list = []
69+
wav_list = []
70+
71+
input_signal,sample_rate = sf.read(input_path)
72+
73+
model = L41Model(nonlinearity='tanh', normalize=False)
74+
model.load(app.root_path + '/static/models/lab41_nonorm-final.ckpt')
75+
76+
outputs = clustering_separate(input_signal,sample_rate,model,2)
77+
for row in outputs:
78+
wav_list.append(row)
79+
80+
return wav_list
81+
82+
def nmf_sep(input_path):
83+
84+
wav_list = []
85+
86+
input_signal,sample_rate = sf.read(input_path)
87+
88+
# Preprocess the signal into an input feature
89+
#spectrogram, X_in = preprocess_signal(input_signal, sample_rate)
90+
spectrogram = make_stft_features(input_signal,sample_rate)
91+
92+
print("Shape of spect", spectrogram.shape)
93+
94+
easy_sep = easy_nmf_separate(spectrogram)
95+
print("easy sep", easy_sep[:10])
96+
97+
98+
separated_speakers = np.square(easy_sep)
99+
phases = np.unwrap(np.angle(spectrogram))
100+
101+
print("Shape of sep speakers", separated_speakers.shape)
102+
103+
# Invert the STFT to recover the output waveforms, remembering to undo the
104+
# preemphasis
105+
print("Lil phase's", phases[:10])
106+
'''waveforms = []
107+
for i in range(2):
108+
waveform = istft(separated_speakers[i]*np.exp(phases*1.0j), 1e4, None, 0.0256, two_sided=False,fft_size=512)
109+
unemphasized = undo_preemphasis(waveform)
110+
waveforms.append(unemphasized)
111+
112+
sources = np.stack(waveforms)
68113
69-
input_signal,sample_rate = sf.read(input_path)
114+
for row in sources:
115+
wav_list.append(row)
116+
'''
117+
for i in range(2):
118+
recon = reconstruct(separated_speakers[i],phases,fs=10000, window_size=None, step_size=0.0256, square=True, preemphasis=0)
119+
print("Type of stuffs",type(recon))
120+
print("Recon shape",recon.shape)
121+
wav_list.append(recon)
70122

71-
model = L41Model(nonlinearity='tanh', normalize=False)
72-
model.load(app.root_path + '/static/models/lab41_nonorm-final.ckpt')
123+
return wav_list
73124

74-
outputs = clustering_separate(input_signal,sample_rate,model,2)
75-
for row in outputs:
76-
wav_list.append(row)
77125

78-
return wav_list

src/demo/app/views.py

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@
1313
import pylab
1414
import collections
1515
import os
16-
from .tflow_functions import deep_cluster_separate,l41_separate
16+
from .tflow_functions import deep_cluster_separate,l41_separate,nmf_sep
17+
from magnolia.utils.clustering_utils import clustering_separate,preprocess_signal
1718
import soundfile as sf
1819
#from .keras_functions import keras_separate
1920
#from .keras_functions import keras_spec
@@ -60,17 +61,22 @@ def index():
6061

6162
state['wav_list'][:] = []
6263

63-
if(input_signal_filename == 'mixed_signal'):
64-
state['wav_list'].append('b_pit_mf_source_1.wav')
65-
state['wav_list'].append('b_pit_mf_source_0.wav')
64+
#if(input_signal_filename == 'mixed_signal'):
65+
# state['wav_list'].append('b_pit_mf_source_1.wav')
66+
# state['wav_list'].append('b_pit_mf_source_0.wav')
6667

6768

6869
elif request.method == 'POST' and request.form['btn'] == 'NMF' and state['input_signal_url'] != None:
6970
state['wav_list'][:] = []
7071

71-
if(input_signal_filename == 'mixed_signal'):
72-
state['wav_list'].append('nmf_mf_source_0.wav')
73-
state['wav_list'].append('nmf_mf_source_1.wav')
72+
signals = nmf_sep(project_root + state['input_signal_url'])
73+
for index,speaker in enumerate(signals):
74+
sf.write(project_root + '/resources/' + input_signal_filename + 'nmfsplit'+str(index)+'.wav',speaker/speaker.max(),10000)
75+
state['wav_list'].append(input_signal_filename + 'nmfsplit'+str(index)+'.wav')
76+
77+
#if(input_signal_filename == 'mixed_signal'):
78+
# state['wav_list'].append('nmf_mf_source_0.wav')
79+
# state['wav_list'].append('nmf_mf_source_1.wav')
7480

7581

7682
return render_template('index.html',
@@ -107,9 +113,10 @@ def allowed_file(filename):
107113
#Plot spectogram with uploaded input file
108114
input_signal_filename = os.path.splitext(os.path.basename(state['input_signal_url']))[0]
109115

110-
f,t,Sxx = calc_spec(project_root + state['input_signal_url'])
116+
#f,t,Sxx = calc_spec(project_root + state['input_signal_url'])
111117

112-
plot_spectogram(f,t,Sxx,project_root + '/resources/spec_'+ input_signal_filename + '.png')
118+
#plot_spectogram(f,t,Sxx,project_root + '/resources/spec_'+ input_signal_filename + '.png')
119+
plot_spectogram(project_root + state['input_signal_url'],project_root + '/resources/spec_'+ input_signal_filename + '.png')
113120

114121
state['spec_file'] = 'spec_' + input_signal_filename + '.png'
115122

@@ -127,8 +134,13 @@ def resources(file_name):
127134
app.logger.info('In the resources')
128135
return send_file(project_root + '/resources/'+ file_name)
129136

137+
def plot_spectogram(input_path,output_path):
138+
sample_rate,signal = wav.read(input_path)
139+
spectrogram, _ = preprocess_signal(signal, sample_rate)
140+
plt.matshow(np.sqrt(np.abs(spectrogram)).T, origin='lower', cmap='bone')
141+
plt.savefig(output_path)
130142

131-
def plot_spectogram(f,t,Sxx,file_path):
143+
'''def plot_spectogram(f,t,Sxx,file_path):
132144
plt.clf()
133145
plt.pcolormesh(t, f, Sxx, cmap='bone_r')
134146
plt.ylabel('Frequency [Hz]')
@@ -147,6 +159,6 @@ def calc_spec(signal_path):
147159
148160
fs,noisy_signal = wav.read(signal_path)
149161
150-
f,t,Sxx = signal.spectrogram(noisy_signal,fs)
162+
f,t,Sxx = signal.spectrogram(noisy_signal,fs,nperseg=nfft,noverlap=256)
151163
return [f,t,np.log(Sxx)]
152-
164+
'''

src/utils/postprocessing.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ def reconstruct(spec_mag, spec_full, fs, window_size, step_size, square=False,
2020
preemphasis: if not None, float: undo preemphasis at this level
2121
'''
2222
mag = np.absolute(spec_mag)
23-
if spec_phase is None:
23+
if spec_full is None:
2424
phase = np.random.randn(*spec_mag.shape)
2525
else:
2626
phase = np.exp(1.0j*np.unwrap(np.angle(spec_full)))

src/utils/tf_utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ def scope_decorator(function):
1717
@functools.wraps(function)
1818
def decorator(self):
1919
if not hasattr(self,attribute):
20-
with tf.device("/gpu:0"):
20+
with tf.device("/cpu:0"):
2121
with tf.variable_scope(name):
2222
setattr(self,attribute,function(self))
2323
return getattr(self,attribute)

0 commit comments

Comments
 (0)