|
- """
- @file common.py
- @brief Commonly used script
- """
-
- ########################################################################
- # import python-library
- ########################################################################
- # default
- import glob
- import argparse
- import sys
- import os
-
- # additional
- import numpy
- import librosa
- import librosa.core
- import librosa.feature
- import sklearn
- import yaml
- from sklearn.preprocessing import StandardScaler
- ########################################################################
-
-
- ########################################################################
- # setup STD I/O
- ########################################################################
- """
- Standard output is logged in "baseline.log".
- """
- import logging
-
- logging.basicConfig(level=logging.DEBUG, filename="baseline.log")
- logger = logging.getLogger(' ')
- handler = logging.StreamHandler()
- formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
- handler.setFormatter(formatter)
- logger.addHandler(handler)
-
-
- ########################################################################
-
-
-
- ########################################################################
- # argparse
- ########################################################################
- def command_line_chk():
- parser = argparse.ArgumentParser(description='Without option argument, it will not run properly.')
- parser.add_argument('-v', '--version', action='store_true', help="show application version")
- parser.add_argument('-e', '--eval', action='store_true', help="run mode Evaluation")
- parser.add_argument('-d', '--dev', action='store_true', help="run mode Development")
- #parser.add_argument('-feat', action='store_true', help="extract new features")
- parser.add_argument('--target', default=None, type=str, help="select machine type")
- args = parser.parse_args()
- if args.version:
- print("===============================")
- print("DCASE 2020 task 2 baseline\nversion {}".format(__versions__))
- print("===============================\n")
-
- if args.eval ^ args.dev:
- if args.dev:
- flag = True
- else:
- flag = False
- else:
- flag = None
- print("incorrect argument")
- print("please set option argument '--dev' or '--eval'")
-
- target = args.target
-
- return flag, target
- ########################################################################
-
-
- ########################################################################
- # load parameter.yaml
- ########################################################################
- def yaml_load():
- with open("config.yaml") as stream:
- param = yaml.safe_load(stream)
- return param
-
- ########################################################################
-
-
- ########################################################################
- # file I/O
- ########################################################################
- # wav file Input
- def file_load(wav_name, mono=False):
- """
- load .wav file.
-
- wav_name : str
- target .wav file
- sampling_rate : int
- audio file sampling_rate
- mono : boolean
- When load a multi channels file and this param True, the returned data will be merged for mono data
-
- return : numpy.array( float )
- """
- try:
- return librosa.load(wav_name, sr=None, mono=mono)
- except:
- logger.error("file_broken or not exists!! : {}".format(wav_name))
-
-
- ########################################################################
-
-
- # load dataset
- def select_dirs(param, mode, target=None):
- """
- param : dict
- baseline.yaml data
-
- return :
- if active type the development :
- dirs : list [ str ]
- load base directory list of dev_data
- if active type the evaluation :
- dirs : list [ str ]
- load base directory list of eval_data
- """
- # print(mode, target)
- if mode:
- logger.info("load_directory <- development")
- dir_path = os.path.abspath("{base}/*".format(base=param["dev_directory"]))
-
- dirs = sorted(glob.glob(dir_path))
- # print(dirs)
- else:
- logger.info("load_directory <- evaluation")
- dir_path = os.path.abspath("{base}/*".format(base=param["eval_directory"]))
- dirs = sorted(glob.glob(dir_path))
-
- if target != None: # to run model only for one machine type
- # def is_one_of_in(substrs, full_str):
- # for s in substrs:
- # if s in full_str: return True
- # return False
- # list_target = [target]
- # dirs = [d for d in dirs if is_one_of_in(list_target, str(d))]
-
- # dirs = [os.path.abspath("{base}//".format(base=param["dev_directory"]))+'\\'+target]
- dirs = ['dataset\\features\\'+target]
- # print(dirs)
- return dirs
-
- ########################################################################
-
- # def file_to_vector_array(file_name, feature_range, scaler=None,
- def file_to_vector_array(file_name, scaler=None,
- sr=16000,
- n_mels=64,
- frames=5,
- n_fft=1024,
- hop_length=512,
- power=1.0):
- """
- convert file_name to a vector array.
-
- file_name : str
- target .wav file
-
- return : numpy.array( numpy.array( float ) )
- vector array
- * dataset.shape = (dataset_size, feature_vector_length)
- """
- y, _ = file_load(file_name)
- mel_spectrogram = librosa.feature.melspectrogram(y=y,
- sr=sr,
- n_fft=n_fft,
- hop_length=hop_length,
- n_mels=n_mels,
- power=power)
-
- # convert melspectrogram to log mel energy
- log_mel_spectrogram = 20.0 / power * numpy.log10(mel_spectrogram + sys.float_info.epsilon)
- vector_array = log_mel_spectrogram.T
-
- vector_array = scaler.transform(vector_array)
-
- return vector_array
-
-
- def file_to_vector_array_origin(file_name,
- sr=16000,
- n_mels=64,
- frames=5,
- n_fft=1024,
- hop_length=512,
- power=1.0):
- """
- convert file_name to a vector array.
-
- file_name : str
- target .wav file
-
- return : numpy.array( numpy.array( float ) )
- vector array
- * dataset.shape = (dataset_size, feature_vector_length)
- """
- y, _ = file_load(file_name)
- mel_spectrogram = librosa.feature.melspectrogram(y=y,
- sr=sr,
- n_fft=n_fft,
- hop_length=hop_length,
- n_mels=n_mels,
- power=power)
-
- # convert melspectrogram to log mel energy
- log_mel_spectrogram = 20.0 / power * numpy.log10(mel_spectrogram + sys.float_info.epsilon)
- vector_array = log_mel_spectrogram.T
- # scaler = StandardScaler()
-
- # vector_array = scaler.fit_transform(vector_array)
- return vector_array
-
|