diff --git a/tools/audio_utils.py b/audio.py similarity index 69% rename from tools/audio_utils.py rename to audio.py index 75278314..9ab80817 100644 --- a/tools/audio_utils.py +++ b/audio.py @@ -1,9 +1,5 @@ # -*- coding: utf-8 -*- #!/usr/bin/env python -''' -By Dabi Ahn. andabi412@gmail.com. -https://www.github.com/andabi -''' from pydub import AudioSegment import os @@ -34,29 +30,7 @@ def rewrite_mp3_to_wav(source_path, target_path): AudioSegment.from_mp3(source_path).export(target_path, format='wav') -def split_path(path): - ''' - 'a/b/c.wav' => ('a/b', 'c', 'wav') - :param path: filepath = 'a/b/c.wav' - :return: basename, filename, and extension = ('a/b', 'c', 'wav') - ''' - basepath, filename = os.path.split(path) - filename, extension = os.path.splitext(filename) - return basepath, filename, extension - - def spectrogram2wav(mag, n_fft, win_length, hop_length, num_iters, phase_angle=None, length=None): - ''' - - :param mag: [f, t] - :param n_fft: n_fft - :param win_length: window length - :param hop_length: hop length - :param num_iters: num of iteration when griffin-lim reconstruction - :param phase_angle: phase angle - :param length: length of wav - :return: - ''' assert (num_iters > 0) if phase_angle is None: phase_angle = np.pi * np.random.rand(*mag.shape) @@ -77,3 +51,9 @@ def preemphasis(x, coeff=0.97): def inv_preemphasis(x, coeff=0.97): return signal.lfilter([1], [1, -coeff], x) + + +def split(wav, top_db): + intervals = librosa.effects.split(wav, top_db=top_db) + wavs = map(lambda i: wav[i[0]: i[1]], intervals) + return wavs \ No newline at end of file diff --git a/convert.py b/convert.py index b56ae103..0a9209c4 100644 --- a/convert.py +++ b/convert.py @@ -9,7 +9,7 @@ from data_load import get_wav_batch, get_batch from models import Model import numpy as np -from utils import spectrogram2wav, inv_preemphasis +from audio import spectrogram2wav, inv_preemphasis from hparam import logdir_path import datetime import tensorflow as tf diff --git a/data_load.py b/data_load.py index 37b6ad19..dbe937f5 100644 --- a/data_load.py +++ b/data_load.py @@ -11,12 +11,26 @@ from tensorflow.python.platform import tf_logging as logging from hparam import Hparam -from utils import preemphasis, wav_random_crop +from audio import preemphasis import numpy as np import librosa from hparam import data_path_base +def wav_random_crop(wav, sr, duration): + assert (wav.ndim <= 2) + + target_len = sr * duration + wav_len = wav.shape[-1] + start = np.random.choice(range(np.maximum(1, wav_len - target_len)), 1)[0] + end = start + target_len + if wav.ndim == 1: + wav = wav[start:end] + else: + wav = wav[:, start:end] + return wav + + def get_mfccs_and_phones(wav_file, sr, length, trim=False, random_crop=True): hp = Hparam.get_global_hparam() diff --git a/hparam.py b/hparam.py index 570d0dbe..310e0637 100644 --- a/hparam.py +++ b/hparam.py @@ -7,11 +7,11 @@ # path ## local data_path_base = './datasets' -logdir_path = './logdir' +# logdir_path = './logdir' ## remote # data_path_base = '/data/private/vc/datasets' -# logdir_path = '/data/private/vc/logdir' +logdir_path = '/data/private/vc/logdir' @@ -73,6 +73,7 @@ def __call__(self): def set_as_global_hparam(self): Hparam.global_hparam = self.hparam + return Hparam.global_hparam @staticmethod def get_global_hparam(): diff --git a/hparams/hparams.yaml b/hparams/hparams.yaml deleted file mode 100644 index 2b4d60b7..00000000 --- a/hparams/hparams.yaml +++ /dev/null @@ -1,15 +0,0 @@ ---- -default_iu3: - train2: - data_path: 'IU/*_split/*.wav' - convert: - one_full_wav: False - batch_size: 4 ---- -iu: - train2: - data_path: 'IU/*_split/*.wav' - batch_size: 64 - convert: - one_full_wav: False - batch_size: 4 \ No newline at end of file diff --git a/models.py b/models.py index 35e54e3f..58635f64 100644 --- a/models.py +++ b/models.py @@ -108,6 +108,7 @@ def _net2(self): # CBHG1: mel-scale pred_mel = cbhg(prenet_out, self.hp.train2.num_banks, self.hp.train2.hidden_units // 2, self.hp.train2.num_highway_blocks, self.hp.train2.norm_type, self.is_training, scope="cbhg1") pred_mel = tf.layers.dense(pred_mel, self.y_mel.shape[-1]) # log magnitude: (N, T, n_mels) + # pred_mel = prenet_out # CBHG2: linear-scale pred_spec = tf.layers.dense(pred_mel, self.hp.train2.hidden_units // 2) # log magnitude: (N, T, n_mels) @@ -119,6 +120,7 @@ def _net2(self): def loss_net2(self): loss_spec = tf.reduce_mean(tf.squared_difference(self.pred_spec, self.y_spec)) loss_mel = tf.reduce_mean(tf.squared_difference(self.pred_mel, self.y_mel)) + # loss_mel = 0 loss = loss_spec + loss_mel return loss diff --git a/scripts/tensorboard_start.sh b/scripts/tensorboard.sh similarity index 100% rename from scripts/tensorboard_start.sh rename to scripts/tensorboard.sh diff --git a/tools/comparison_wavs.py b/tools/comparison_wavs.py deleted file mode 100644 index effc81db..00000000 --- a/tools/comparison_wavs.py +++ /dev/null @@ -1,55 +0,0 @@ -# -*- coding: utf-8 -*- -#!/usr/bin/env python - -import librosa.display -import utils -import numpy as np -import matplotlib.pyplot as plt - -filename_a = '/Users/avin/git/vc/a.wav' -filename_b = '/Users/avin/git/vc/b.wav' - -n_fft = 4096 -len_hop = n_fft / 4 -plot_wav = True -plot_spec = True - -# Waveforms -wav_a, sr = librosa.load(filename_a, mono=True) -wav_b, _ = librosa.load(filename_b, mono=True) - -# Spectrogram -spec_a = librosa.stft(wav_a, n_fft=n_fft, hop_length=len_hop) -spec_b = librosa.stft(wav_b, n_fft=n_fft, hop_length=len_hop) - -# Plot waveforms -if plot_wav: - plt.figure(1) - - plt.subplot(2, 1, 1) - librosa.display.waveplot(wav_a, sr=sr, color='b') - plt.title('A') - - plt.subplot(2, 1, 2) - librosa.display.waveplot(wav_b, sr=sr, color='r') - plt.title('B') - - plt.tight_layout() - plt.show() - -# Plot spectrogram -if plot_spec: - plt.figure(2) - - plt.subplot(2, 1, 1) - librosa.display.specshow(librosa.amplitude_to_db(spec_a, ref=np.max), sr=sr, hop_length=len_hop, y_axis='log', x_axis='time') - plt.title('A') - plt.colorbar(format='%+2.0f dB') - - plt.subplot(2, 1, 2) - librosa.display.specshow(librosa.amplitude_to_db(spec_b, ref=np.max), sr=sr, hop_length=len_hop, y_axis='log', x_axis='time') - plt.title('B') - plt.colorbar(format='%+2.0f dB') - - plt.tight_layout() - plt.show() \ No newline at end of file diff --git a/tools/convert_amp.py b/tools/convert_amp.py deleted file mode 100644 index c15d88ec..00000000 --- a/tools/convert_amp.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- -#!/usr/bin/env python - -from pydub import AudioSegment -import glob -from audio_utils import split_path -import os - -src_path = '/Users/avin/git/vc/datasets/IU/v_app_split' -target_path = '{}_amp'.format(src_path) -target_amp_in_db = -20 - - -def match_target_amplitude(sound, target_dBFS): - change_in_dBFS = target_dBFS - sound.dBFS - return sound.apply_gain(change_in_dBFS) - -if not os.path.exists(target_path): - os.mkdir(target_path) - -for filepath in glob.glob('{}/*.wav'.format(src_path)): - basepath, filename, _ = split_path(filepath) - sound = AudioSegment.from_wav(filepath) - normalized_sound = match_target_amplitude(sound, target_amp_in_db) - normalized_sound.export('{}/{}.wav'.format(target_path, filename), 'wav') \ No newline at end of file diff --git a/tools/griffin_lim_recon_test.py b/tools/griffin_lim_recon_test.py deleted file mode 100644 index 46e55217..00000000 --- a/tools/griffin_lim_recon_test.py +++ /dev/null @@ -1,31 +0,0 @@ -# -*- coding: utf-8 -*- -#!/usr/bin/env python -''' -By Dabi Ahn. andabi412@gmail.com. -https://www.github.com/andabi -''' - -import librosa -import numpy as np -from audio_utils import spectrogram2wav as griffin_lim - -file_path = '/Users/avin/git/vc/datasets/kate/sense_and_sensibility/1-1-001.wav' -sr = 22050 -n_fft = 512 -win_length = 400 -hop_length = win_length / 4 -num_iters = 30 - -wav, sr = librosa.load(file_path, sr=sr, mono=True) -spec = librosa.stft(wav, n_fft=n_fft, hop_length=hop_length) -mag, phase = np.abs(spec), np.angle(spec) - -# Griffin Lim reconstruction -wav_recon = griffin_lim(mag, n_fft=n_fft, win_length=win_length, hop_length=hop_length, num_iters=num_iters, length=wav.shape[0]) -# sum_wav = np.sum(np.abs(wav)) -# sum_wav_recon = np.sum(np.abs(wav_recon)) -# print(sum_wav, sum_wav_recon, (sum_wav - sum_wav_recon) / sum_wav * 100) - -# Write -librosa.output.write_wav('wav_orig.wav', wav, sr) -librosa.output.write_wav('wav_recon_{}.wav'.format(num_iters), wav_recon, sr) \ No newline at end of file diff --git a/tools/librosa_load_test.py b/tools/librosa_load_test.py deleted file mode 100644 index aef99a83..00000000 --- a/tools/librosa_load_test.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -#!/usr/bin/env python - -import librosa -import datetime - -filename = '/Users/avin/git/vc/datasets/timit/TIMIT/TRAIN/DR1/FCJF0/SA1.wav' # sample rate = 16,000 Hz - -# same sample rate -s = datetime.datetime.now() -wav, _ = librosa.load(filename, mono=True, sr=16000) -e = datetime.datetime.now() -diff = e - s -print(diff.microseconds) - -# different sample rate (22,050 Hz) -s = datetime.datetime.now() -wav, _ = librosa.load(filename, mono=True) -e = datetime.datetime.now() -diff = e - s -print(diff.microseconds) diff --git a/tools/librosa_split_test.py b/tools/librosa_split_test.py deleted file mode 100644 index 902c6d0d..00000000 --- a/tools/librosa_split_test.py +++ /dev/null @@ -1,14 +0,0 @@ -# -*- coding: utf-8 -*- -#!/usr/bin/env python - -import librosa -import datetime - -filename = '/Users/avin/git/vc/datasets/kate/sense_and_sensibility/1-1-003.wav' - -wav, sr = librosa.load(filename, mono=True, sr=22050) -intervals = librosa.effects.split(wav, top_db=30) -for i, interval in enumerate(intervals): - s, e = interval[0], interval[1] - w = wav[s:e] - librosa.output.write_wav('/Users/avin/git/vc/{}.wav'.format(i), w, sr) diff --git a/tools/mfcc_amp_normalization_test.py b/tools/mfcc_amp_normalization_test.py deleted file mode 100644 index a6099fdf..00000000 --- a/tools/mfcc_amp_normalization_test.py +++ /dev/null @@ -1,49 +0,0 @@ -# -*- coding: utf-8 -*- -#!/usr/bin/env python - -import librosa -import numpy as np - -filename = '/Users/avin/git/vc/datasets/timit/TIMIT/TRAIN/DR1/FCJF0/SA1.wav' # sample rate = 16,000 Hz - -sr = 16000 -n_fft = 512 -win_length = 400 -hop_length = 80 -n_mels = 128 -n_mfcc = 40 - -# Load waveforms -y, _ = librosa.load(filename, mono=True, sr=sr) - -# Get spectrogram -D = librosa.stft(y=y, - n_fft=n_fft, - hop_length=hop_length, - win_length=win_length) -mag = np.abs(D) # (1+n_fft//2, t) -scaled_mag = mag * 200 - -# Get mel-spectrogram -mel_basis = librosa.filters.mel(sr, n_fft, n_mels) # (n_mels, 1+n_fft//2) -mel = np.dot(mel_basis, mag) # (n_mels, t) # mel spectrogram -scaled_mel = np.dot(mel_basis, scaled_mag) - -# Get mfccs -db = librosa.amplitude_to_db(mel) -scaled_db = librosa.amplitude_to_db(scaled_mel) - -print(db) -print(scaled_db) - -mfccs = np.dot(librosa.filters.dct(n_mfcc, db.shape[0]), db) -scaled_mfccs = np.dot(librosa.filters.dct(n_mfcc, db.shape[0]), scaled_db) - -mfccs = mfccs.T # (t, n_mfccs) -scaled_mfccs = scaled_mfccs.T - -# assert(np.all(mfccs * 2 == scaled_mfccs)) - -print(mfccs / scaled_mfccs) -print(mfccs) -print(scaled_mfccs) \ No newline at end of file diff --git a/tools/mp3_to_wav.py b/tools/mp3_to_wav.py deleted file mode 100644 index 21f94261..00000000 --- a/tools/mp3_to_wav.py +++ /dev/null @@ -1,14 +0,0 @@ -# -*- coding: utf-8 -*- -#!/usr/bin/env python - -import glob -import audio_utils - -SOURCE_PATH = 'datasets/test/godfather2' -TARGET_PATH = 'datasets/test/godfather2' - -# Write mp3 to wav -search_path = '{}/*.mp3'.format(SOURCE_PATH) -for source_path in glob.glob(search_path): - target_path = '{}/{}.wav'.format(SOURCE_PATH, 'a') - audio_utils.rewrite_mp3_to_wav(TARGET_PATH, target_path) diff --git a/tools/plot_spectrogram.py b/tools/plot_spectrogram.py deleted file mode 100644 index ca3d5b46..00000000 --- a/tools/plot_spectrogram.py +++ /dev/null @@ -1,45 +0,0 @@ -# -*- coding: utf-8 -*- -#!/usr/bin/env python - -import librosa.display -import utils -import numpy as np -import matplotlib.pyplot as plt -from audio_utils import read, write - -filename = '/Users/avin/git/vc/outputs/male.wav' -sr = 22050 -n_fft = 1024 -len_hop = n_fft / 4 -plot_wav = False -plot_spec = True - -# Waveforms -wav = read(filename, sr, mono=True) -# wav = np.where(wav == 0, 1000, wav) -# wav = np.zeros_like(wav) -# wav[0] = np.ones_like(wav[0]) - -# Spectrogram -spec = librosa.stft(wav, n_fft=n_fft, hop_length=len_hop) - -# Plot waveforms -if plot_wav: - plt.figure(1) - - librosa.display.waveplot(wav, sr=sr, color='b') - plt.title('waveform') - - plt.tight_layout() - plt.show() - -# Plot spectrogram -if plot_spec: - plt.figure(2) - - librosa.display.specshow(librosa.amplitude_to_db(spec, ref=np.max), sr=sr, hop_length=len_hop, y_axis='linear', x_axis='time') - plt.title('spectrogram') - plt.colorbar(format='%+2.0f dB') - - plt.tight_layout() - plt.show() \ No newline at end of file diff --git a/tools/preemphasis_test.py b/tools/preemphasis_test.py deleted file mode 100644 index f52066fd..00000000 --- a/tools/preemphasis_test.py +++ /dev/null @@ -1,63 +0,0 @@ -# -*- coding: utf-8 -*- -#!/usr/bin/env python - -import librosa.display -import numpy as np -import matplotlib.pyplot as plt -from audio_utils import read, write, preemphasis, inv_preemphasis -import sys - -filename = '/Users/avin/git/vc/datasets/timit/TIMIT/TEST/DR1/FAKS0/SA1.wav' -sr = 22050 -n_fft = 4096 -len_hop = n_fft / 4 -write_wav = True -plot_wav = True -plot_spec = True - -# Waveforms -wav = read(filename, sr, mono=True) -wav_empha = preemphasis(wav) -diff = wav - inv_preemphasis(wav_empha) -assert(np.all(np.less(diff, sys.float_info.epsilon))) - -# Spectrogram -spec = librosa.stft(wav, n_fft=n_fft, hop_length=len_hop) -spec_empha = librosa.stft(wav_empha, n_fft=n_fft, hop_length=len_hop) - -# Write wav -if write_wav: - write(wav, sr, 'original2.wav') - write(wav_empha, sr, 'preemphasized2.wav') - -# Plot waveforms -if plot_wav: - plt.figure(1) - - plt.subplot(2, 1, 1) - librosa.display.waveplot(wav, sr=sr, color='b') - plt.title('before preemphasis') - - plt.subplot(2, 1, 2) - librosa.display.waveplot(wav_empha, sr=sr, color='r') - plt.title('after preemphasis') - - plt.tight_layout() - plt.show() - -# Plot spectrogram -if plot_spec: - plt.figure(2) - - plt.subplot(2, 1, 1) - librosa.display.specshow(librosa.amplitude_to_db(spec, ref=np.max), sr=sr, hop_length=len_hop, y_axis='log', x_axis='time') - plt.title('before preemphasis') - plt.colorbar(format='%+2.0f dB') - - plt.subplot(2, 1, 2) - librosa.display.specshow(librosa.amplitude_to_db(spec_empha, ref=np.max), sr=sr, hop_length=len_hop, y_axis='log', x_axis='time') - plt.title('after preemphasis') - plt.colorbar(format='%+2.0f dB') - - plt.tight_layout() - plt.show() \ No newline at end of file diff --git a/tools/preprocess_wav.py b/tools/preprocess_wav.py deleted file mode 100644 index a9e7e88c..00000000 --- a/tools/preprocess_wav.py +++ /dev/null @@ -1,57 +0,0 @@ -# -*- coding: utf-8 -*- -#!/usr/bin/env python - -import librosa -import glob -import os -from audio_utils import read, write, split_path - - -# src_path = '/Users/avin/git/vc/datasets/arctic/bdl' -src_path = '/Users/avin/git/vc/datasets/IU/melon_radio_season1' -top_db = 30 -target_path = '{}_split_{}'.format(src_path, top_db) -sr = 16000 -min_limit_len = sr / 2 # 0.5s - -# Preprocessing -# 1. split wav by silence -# 2. convert sample rate - - -def split(wav, top_db): - intervals = librosa.effects.split(wav, top_db=top_db) - wavs = map(lambda i: wav[i[0]: i[1]], intervals) - return wavs - - -num_files = num_files_split = 0 -max_len = max_len_split = 0 -min_len = min_len_split = float('inf') -for filepath in glob.glob('{}/*.wav'.format(src_path)): - wav = read(filepath, sr, mono=True) - split_wavs = split(wav, top_db) - if not os.path.exists(target_path): - os.mkdir(target_path) - _, filename, _ = split_path(filepath) - - # Statistics - # num_files += 1 - # num_files_split += len(split_wavs) - # - # max_len = max(max_len, len(wav)) - # max_len_split = max(max_len_split, max(map(lambda w: len(w), split_wavs))) - # - # min_len = min(min_len, len(wav)) - # min_len_split = min(min_len_split, min(map(lambda w: len(w), split_wavs))) - - split_wavs = filter(lambda w: len(w) >= min_limit_len, split_wavs) - map(lambda (i, w): write(w, sr, '{}/{}_{}.wav'.format(target_path, filename, i)), enumerate(split_wavs)) - - -# print('num_files: {}, num_files_split: {}'.format(num_files, num_files_split)) -# print('max_len: {}, max_len_split: {}'.format(max_len, max_len_split)) -# print('min_len: {}, min_len_split: {}'.format(min_len, min_len_split)) -print('done') - -# range of arctic/bdl: 20000~120000 \ No newline at end of file diff --git a/tools/split_wav.py b/tools/split_wav.py deleted file mode 100644 index f6181158..00000000 --- a/tools/split_wav.py +++ /dev/null @@ -1,53 +0,0 @@ -# -*- coding: utf-8 -*- -#!/usr/bin/env python - -import librosa -import glob -import os -from audio_utils import read, write, split_path - - -# src_path = '/Users/avin/git/vc/datasets/arctic/bdl' -src_path = '/Users/avin/git/vc/datasets/IU' -target_path = '{}_split'.format(src_path) -sr = 16000 -top_db = 25 -min_limit_len = sr # 1s - - -def split(wav, top_db): - intervals = librosa.effects.split(wav, top_db=top_db) - wavs = map(lambda i: wav[i[0]: i[1]], intervals) - return wavs - - -num_files = num_files_split = 0 -max_len = max_len_split = 0 -min_len = min_len_split = float('inf') -for filepath in glob.glob('{}/**/*.wav'.format(src_path)): - wav = read(filepath, sr, mono=True) - split_wavs = split(wav, top_db) - if not os.path.exists(target_path): - os.mkdir(target_path) - _, filename, _ = split_path(filepath) - - # Statistics - # num_files += 1 - # num_files_split += len(split_wavs) - # - # max_len = max(max_len, len(wav)) - # max_len_split = max(max_len_split, max(map(lambda w: len(w), split_wavs))) - # - # min_len = min(min_len, len(wav)) - # min_len_split = min(min_len_split, min(map(lambda w: len(w), split_wavs))) - - split_wavs = filter(lambda w: len(w) >= min_limit_len, split_wavs) - map(lambda (i, w): write(w, sr, '{}/{}_{}.wav'.format(target_path, filename, i)), enumerate(split_wavs)) - - -# print('num_files: {}, num_files_split: {}'.format(num_files, num_files_split)) -# print('max_len: {}, max_len_split: {}'.format(max_len, max_len_split)) -# print('min_len: {}, min_len_split: {}'.format(min_len, min_len_split)) -print('done') - -# range of arctic/bdl: 20000~120000 \ No newline at end of file diff --git a/tools/statistics_amp.py b/tools/statistics_amp.py deleted file mode 100644 index 7ce70a20..00000000 --- a/tools/statistics_amp.py +++ /dev/null @@ -1,64 +0,0 @@ -# -*- coding: utf-8 -*- -#!/usr/bin/env python - -import glob -from audio_utils import read -import librosa -import numpy as np - -src_path = '/Users/avin/git/vc/datasets/IU/v_app_split' -# src_path = '/Users/avin/git/vc/datasets/IU/melon_radio_season1_split' -# src_path = '/Users/avin/git/vc/datasets/IU/melon_radio_season2_split' -# src_path = '/Users/avin/git/vc/datasets/timit/TIMIT/TRAIN/*/*' -# src_path = '/Users/avin/git/vc/datasets/kate/sense_and_sensibility_split' -# src_path = '/Users/avin/git/vc/datasets/arctic/bdl' -# src_path = '/Users/avin/git/vc/datasets/arctic/slt' -# src_path = '/Users/avin/git/vc/datasets/kate/therese_raquin_split' -sr = 16000 -n_fft = 512 -win_length = 400 -hop_length = 80 -n_sample = 200 - -amps = [] -log_amps = [] -dbs = [] -for filepath in glob.glob('{}/*.wav'.format(src_path))[:n_sample]: - wav = read(filepath, sr, mono=True) - spec = librosa.stft(wav, n_fft=n_fft, win_length=win_length, hop_length=hop_length) # (n_fft/2+1, t) - amp = np.abs(spec) - amps.extend(amp.flatten()) - - log_amp = np.log(amp) - log_amps.extend(log_amp.flatten()) - - db = librosa.amplitude_to_db(amp) - dbs.extend(db.flatten()) - -amps = np.array(amps) -log_amps = np.array(log_amps) -dbs = np.array(dbs) - - -mean_amps = np.mean(amps) -std_amps = np.std(amps) -max_amps = np.max(amps) -min_amps = np.min(amps) - -mean_dbs = np.mean(dbs) -std_dbs = np.std(dbs) -max_dbs = np.max(dbs) -min_dbs = np.min(dbs) - -mean_log_amps = np.mean(log_amps) -std_log_amps = np.std(log_amps) -max_log_amps = np.max(log_amps) -min_log_amps = np.min(log_amps) - -# normalized = (values - mean) / std -# normalized = (log_amps - min) / (max - min) - -print("[amps] max: {}, min: {}, mean: {}, std: {}".format(max_amps, min_amps, mean_amps, std_amps)) -print("[log_amps] max: {}, min: {}, mean: {}, std: {}".format(max_log_amps, min_log_amps, mean_log_amps, std_log_amps)) -print("[decibels] max: {}, min: {}, mean: {}, std: {}".format(max_dbs, min_dbs, mean_dbs, std_dbs)) -# print(normalized) \ No newline at end of file