Source code for nnmnkwii.preprocessing

from __future__ import division, print_function, absolute_import

from nnmnkwii.util import delta, trim_zeros_frames
import numpy as np


# TODO: Is this really needed? Isn't decorator sufficient?
class UtteranceWiseTransformer(object):
    def transform(self, X, lengths=None):
        assert X.ndim == 3
        N, T, D = X.shape
        Y = np.zeros(self.get_shape(X), dtype=X.dtype)
        for idx, x in enumerate(X):
            if lengths is None:
                x = trim_zeros_frames(x)
            else:
                x = x[:lengths[idx]]
            y = self.do_transform(x)
            Y[idx][:len(y)] = y
        return Y

    def get_shape(self, X):
        raise NotImplementedError

[docs]class DeltaAppender(UtteranceWiseTransformer): """Append delta features. Given a ``N x T x D`` array, features of multiple utterances, transform features into static + delta features for each utterance. Attributes: windows (list): A sequence of windows. See :func:`nnmnkwii.functions.mlpg` for what window means. """ def __init__(self, windows): self.windows = windows def get_shape(self, X): N, T, D = X.shape return (N, T, D * len(self.windows)) def do_transform(self, x): features = [] for _, _, window in self.windows: features.append(delta(x, window)) combined_features = np.hstack(features) return combined_features