Esempio n. 1
0
class GMMRec(object):
    def __init__(self):
        self.features = []
        self.gmmset = GMMSet()
        self.classes = []
        self.models = []

    def delete_speaker(self, name):
        if name in self.classes:
            ind = self.classes.index(name)
            del self.classes[ind]
            del self.models[ind]
            self.classes.remove(name)
            ind = self.gmmset.y.index(name)
            del self.gmmset.gmms[ind]
            self.gmmset.y.remove(name)
        else:
            print name, "not in the list!"

    def enroll_model(self, name, model):
        if name not in self.classes:
            self.classes.append(name)
            self.models.append(model)
            self.features.append(None)
            gmm = self.load(model)
            self.gmmset.add_new(gmm, name)

    def enroll(self, name, mfcc_vecs, model=None):
        if name not in self.classes:
            feature = mfcc_vecs.astype(np.float32)
            self.features.append(feature)
            self.classes.append(name)
            self.models.append(model)
        else:
            print name + " already enrolled, please delete the old one first!"

    def get_mfcc(self, audio_path):
        (sr, sig) = wav.read(audio_path)
        if len(sig.shape) > 1:
            sig = sig[:, 0]
        cleansig = remove_silence(sr, sig)
        mfcc_vecs = mfcc(cleansig, sr, numcep=19)
        mfcc_delta = librosa.feature.delta(mfcc_vecs.T)
        mfcc_delta2 = librosa.feature.delta(mfcc_vecs.T, order=2)
        feats = np.vstack([mfcc_vecs.T, mfcc_delta, mfcc_delta2])
        return feats.T

    def enroll_file(self, name, fn, model=None):
        if name not in self.classes:
            fn_mfcc = np.array(self.get_mfcc(fn))
            self.enroll(name, fn_mfcc, model=model)
        else:
            print name + " already enrolled, please delete the old one first!"

    def _get_gmm_set(self):
        return GMMSet()

    def train(self, gmm_order=None):
        for name, feats, model in zip(self.classes, self.features,
                                      self.models):
            if (name not in self.gmmset.y) and (name is not None):
                gmm = self.gmmset.fit_new(feats, name, gmm_order)
                if model is not None:
                    self.dump(model, part=gmm)
            else:
                print name + " already trained, skip!"

    def predict(self, mfcc_vecs):
        feature = mfcc_vecs.astype(np.float32)
        return self.gmmset.predict_one(feature)

    def dump(self, fname, part=None):
        with open(fname, 'w') as f:
            if part is None:
                pickle.dump(self, f, -1)
            else:
                pickle.dump(part, f, -1)

    @staticmethod
    def load(fname):
        with open(fname, 'r') as f:
            R = pickle.load(f)
            return R