Пример #1
0
 def test_time_to_frame_ind(self):
     sample_rate = 22050
     win_size = 256
     hop_size = 128
     fc = feature_container.FeatureContainer("fake_audio_path", sample_rate,
                                             win_size, hop_size)
     assert fc.time_to_frame_ind(0.015) == 2
Пример #2
0
 def test_features_empty_features(self):
     features = ["feat1", "feat2"]
     configs = ["config1", "config2"]
     fc = feature_container.FeatureContainer("fake_audio_path", 22050, 256,
                                             128)
     fc.features["feat1"]["data"] = np.random.sample(10)
     fc.features["feat1"]["config"] = "config1"
     fc.features["feat2"]["config"] = "config2"
     assert not all(fc.has_features(list(zip(features, configs))))
Пример #3
0
    def execute(self, audio_path):
        """ Executes the feature extractors.

        Args:
            audio_path (tuple of str): path of the audio file to process, as a
            tuple (audio root, audio path relative to audio root).
            Example: ('/some/path', 'somefile.wav')

        Returns:
            A tuple (Featurecontainer, boolean) containing, respectively, the
            feature container and whether it has been created or not.
        """

        if not isinstance(audio_path, tuple):
            raise exceptions.ParameterError(
                'The first argument must be a tuple' +
                '<audio path root>, <audio relative path>)')

        fc = None
        has_features = [False for fe in self._feature_extractors]

        if self._feature_container_root:
            feature_container_path = os.path.join(
                self._feature_container_root,
                os.path.splitext(audio_path[1])[0] +
                feature_container.FC_EXTENSION)
            fc = feature_container.FeatureContainer.load(
                feature_container_path)

            # check if feature container exists and has all required features
            if fc:
                has_features = fc.has_features([(fe.name, fe.config) \
                        for fe in self._feature_extractors])
                if all(has_features):
                    logger.debug(
                        'Feature container %s with all required features found!',
                        feature_container_path)
                    return fc, False

        info = audio.info(os.path.join(*audio_path))
        n_samples = int((info.frames - self._audio_frame_gen._win_size) /
                        self._audio_frame_gen._hop_size) + 1

        if not fc or not any(has_features):
            # if fc has none of the desired features, create a new one
            fc = feature_container.FeatureContainer(
                audio_path[1], info.samplerate,
                self._audio_frame_gen._win_size,
                self._audio_frame_gen._hop_size)

        compute_spectrum = False
        compute_power_spectrum = False

        for fe in self._feature_extractors:
            # allocate memory for features
            fc.features[fe.name]["data"] = np.empty((n_samples, fe.size),
                                                    dtype="float32")
            fc.features[fe.name]["config"] = fe.config

            # check what to compute
            if isinstance(fe, ffe.SpectrumFrameFeatureExtractor):
                compute_spectrum = True
            elif isinstance(fe, ffe.PowerSpectrumFrameFeatureExtractor):
                compute_spectrum = True
                compute_power_spectrum = True

        frame_gen = self._audio_frame_gen.execute(os.path.join(*audio_path))
        for i, frame in enumerate(frame_gen):
            if compute_spectrum:
                spectrum = np.abs(np.fft.rfft(frame))
            if compute_power_spectrum:
                power_spectrum = spectrum**2

            for fe in compress(self._feature_extractors,
                               [not hf for hf in has_features]):
                if isinstance(fe, ffe.AudioFrameFeatureExtractor):
                    fc.features[fe.name]["data"][i] = \
                        fe.execute(frame)
                elif isinstance(fe, ffe.SpectrumFrameFeatureExtractor):
                    fc.features[fe.name]["data"][i] = \
                        fe.execute(spectrum)
                elif isinstance(fe, ffe.PowerSpectrumFrameFeatureExtractor):
                    fc.features[fe.name]["data"][i] = \
                        fe.execute(power_spectrum)

        # if feature_container_root is set, write feature container
        if self._feature_container_root:
            fc.save(self._feature_container_root)

        return fc, True
Пример #4
0
 def test_init(self):
     try:
         feature_container.FeatureContainer("fake_audio_path", 22050, 256,
                                            128)
     except:
         pytest.fail("Unexpected Error")