-
Notifications
You must be signed in to change notification settings - Fork 0
/
audio_utils.py
86 lines (67 loc) · 2.3 KB
/
audio_utils.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import librosa
from IPython.display import Audio, display
import numpy as np
import matplotlib.pyplot as plt
# import style_transfer_2d_signal
# every spectrogram is truncated to a certain num of frames
N_FRAMES = 400
N_RECONSTRUCTION_ITER = 100
def read_audio(filename):
signal, fs = librosa.load(filename)
return signal, fs
def _spectrum(signal):
return np.log1p(np.abs(librosa.stft(signal)))
def _trim(signal):
return signal[:, :N_FRAMES]
def get_spectrum(signal):
return _trim(_spectrum(signal))
def reconstruct(spectrogram, waveform_shape):
reconstructed_waveform = np.random.random_sample(waveform_shape)
for i in range(N_RECONSTRUCTION_ITER):
reconstructed_waveform = librosa.istft(spectrogram * np.exp(1j *
np.angle(librosa.stft(reconstructed_waveform)[:, :N_FRAMES])))
if i%10 == 0:
print('iteration {}: reconstructed_waveform is {}'.format(i, reconstructed_waveform))
return reconstructed_waveform
def write_to_file(filename, signal, fs):
"""
saves an audio signal to a wav file
:param filename: path to output file
:param signal:
:param fs: sample rate
:return:
"""
librosa.output.write_wav(filename, signal, fs)
def show(spectrograms):
"""
Plots a list of spectrograms
:param spectrograms: a dict of spetrograms with their names, e.g.
{'content': content_spectrogram,
'style': style_spectrogram,
'out': out_spectrogram}
:return:
"""
plt.figure(figsize=(10, 5))
n_spectrograms = len(spectrograms)
i = 1
for name, spectrogram in spectrograms.items():
plt.subplot(1, n_spectrograms, i)
plt.title(name)
plt.imshow(spectrogram)
i = i + 1
plt.show()
#
# content_waveform, fs = read_audio(CONTENT_FILENAME)
# style_waveform, _ = read_audio(STYLE_FILENAME)
#
# content_spectrogram = trim(spectrum(content_waveform))
# style_spectrogram = trim(spectrum(style_waveform))
#
# out_waveform = reconstruct(style_spectrogram, style_waveform.shape)
# write_to_file(OUTPUT_FILENAME, out_waveform, fs)
#
# spectrograms = {'content': content_spectrogram,
# 'style': style_spectrogram,
# 'out': style_spectrogram}
# show(spectrograms)
#