def _normalize(x): return dict( x, **{ key: features.window_normalization(x[key], **config.get("kwargs", {})) })
def extract_features(signals, sample_rates, feattype, spec_kwargs, melspec_kwargs, mfcc_kwargs, db_spec_kwargs, feat_scale_kwargs, window_norm_kwargs): tf.debugging.assert_rank(signals, 2, message="Input signals for feature extraction must be batches of mono signals without channels, i.e. of shape [B, N] where B is batch size and N number of samples.") tf.debugging.assert_equal(sample_rates, [sample_rates[0]], message="Different sample rates in a single batch not supported, all signals in the same batch should have the same sample rate.") #TODO batches with different sample rates (probably not worth the effort) sample_rate = sample_rates[0] X = audio_features.spectrograms(signals, sample_rate, **spec_kwargs) tf.debugging.assert_all_finite(X, "spectrogram failed") if feattype in ("melspectrogram", "logmelspectrogram", "mfcc"): X = audio_features.melspectrograms(X, sample_rate=sample_rate, **melspec_kwargs) tf.debugging.assert_all_finite(X, "melspectrogram failed") if feattype in ("logmelspectrogram", "mfcc"): X = tf.math.log(X + 1e-6) tf.debugging.assert_all_finite(X, "logmelspectrogram failed") if feattype == "mfcc": coef_begin = mfcc_kwargs.get("coef_begin", 1) coef_end = mfcc_kwargs.get("coef_end", 13) mfccs = tf.signal.mfccs_from_log_mel_spectrograms(X) X = mfccs[..., coef_begin:coef_end] tf.debugging.assert_all_finite(X, "mfcc failed") elif feattype in ("db_spectrogram",): X = audio_features.power_to_db(X, **db_spec_kwargs) tf.debugging.assert_all_finite(X, "db_spectrogram failed") if feat_scale_kwargs: X = features.feature_scaling(X, **feat_scale_kwargs) tf.debugging.assert_all_finite(X, "feature scaling failed") if window_norm_kwargs: X = features.window_normalization(X, **window_norm_kwargs) tf.debugging.assert_all_finite(X, "window normalization failed") return X
def test_window_normalization(self): rank = 3 for _ in range(50): delta = np.random.uniform(1, 1e3) x = np.random.uniform(-delta, delta, size=np.random.randint(1, 20, size=rank)) axis = 1 assert axis == 1, "TODO: test windows on arbitrary axis" for window_len in [-1] + list(range(2, x.shape[0] + 1)): for normalize_variance in (True, False): kwargs = dict(axis=axis, window_len=window_len, normalize_variance=normalize_variance) y = features.window_normalization(x, **kwargs).numpy() assert not np.isnan(y).any() assert y.shape == x.shape