Beispiel #1
0
    def relocate_audio_to_single_container(self, target_path):
        """
        Copies every track to a single container.
        Afterwards all tracks in the container are linked against
        this single container.
        """

        cont = containers.AudioContainer(target_path)
        cont.open()

        new_tracks = {}

        # First create a new container track for all existing tracks
        for track in self.tracks.values():
            sr = track.sampling_rate
            samples = track.read_samples()

            cont.set(track.idx, samples, sr)
            new_track = tracks.ContainerTrack(track.idx, cont)

            new_tracks[track.idx] = new_track

        # Update track list of corpus
        self._tracks = new_tracks

        # Update utterances to point to new tracks
        for utterance in self.utterances.values():
            new_track = self.tracks[utterance.track.idx]
            utterance.track = new_track

        cont.close()
Beispiel #2
0
    def test_relocate_audio_to_single_container(self, tmpdir):
        corpus = audiomate.Corpus.load(resources.sample_corpus_path('default'))

        target_container_path = os.path.join(tmpdir.strpath, 'audio')
        corpus.relocate_audio_to_single_container(target_container_path)

        assert os.path.isfile(target_container_path)

        cont = containers.AudioContainer(target_container_path)
        cont.open()

        assert cont.keys() == [
            'file-1',
            'file-2',
            'file-3',
            'file-4',
            'file-5',
            'file-6',
        ]

        assert corpus.tracks['file-1'].idx == 'file-1'
        assert corpus.tracks['file-1'].container.path == cont.path

        assert corpus.utterances['utt-1'].track.idx == 'file-1'
        assert corpus.utterances['utt-1'].track.container.path == cont.path

        cont.close()
Beispiel #3
0
def sample_container():
    container_path = resources.get_resource_path(
        ['sample_files', 'audio_container'])
    sample_container = containers.AudioContainer(container_path)
    sample_container.open()
    yield sample_container
    sample_container.close()
Beispiel #4
0
    def test_set_raises_error_on_invalid_data_type(self, tmpdir):
        path = os.path.join(tmpdir.strpath, 'audio')
        cnt = containers.AudioContainer(path)
        cnt.open()

        with pytest.raises(ValueError):
            cnt.set('track1', np.arange(5).astype(np.int16), 16000)

        cnt.close()
Beispiel #5
0
    def test_set_raises_error_on_multi_dim_data(self, tmpdir):
        path = os.path.join(tmpdir.strpath, 'audio')
        cnt = containers.AudioContainer(path)
        cnt.open()

        with pytest.raises(ValueError):
            cnt.set('track1',
                    np.random.random((4, 5)).astype(np.float32), 16000)

        cnt.close()
Beispiel #6
0
    def test_set(self, tmpdir):
        path = os.path.join(tmpdir.strpath, 'audio')
        cnt = containers.AudioContainer(path)
        cnt.open()

        data = np.random.random(10)
        cnt.set('track1', data, 16000)

        assert cnt.keys() == ['track1']

        samples, sr = cnt.get('track1')

        assert np.allclose(samples, data, atol=1.e-4)
        assert sr == 16000

        cnt.close()
Beispiel #7
0
    def test_read_frames_matches_length(self, tmpdir):
        cont_path = os.path.join(tmpdir.strpath, 'audio.hdf5')
        cont = containers.AudioContainer(cont_path)
        cont.open()

        content = np.random.random(7)
        cont.set('track', content, 16000)
        track = tracks.ContainerTrack('some_idx', cont, 'track')

        data = list(track.read_frames(frame_size=2, hop_size=1))
        frames = np.array([x[0] for x in data])
        last = [x[1] for x in data]

        assert frames.shape == (6, 2)
        assert frames.dtype == np.float32

        assert last[:-1] == [False] * (len(data) - 1)
        assert last[-1]

        cont.close()
Beispiel #8
0
    def read_tracks_from_audio_containers(audio_path, corpus):
        if os.path.isfile(audio_path):
            base_path = os.path.dirname(audio_path)
            audio_tracks = textfile.read_separated_lines(audio_path,
                                                         separator=' ',
                                                         max_columns=3)

            audio_containers = {}

            for entry in audio_tracks:
                track_idx = entry[0]
                container_path = entry[1]
                key = entry[2]

                if container_path in audio_containers.keys():
                    container = audio_containers[key]
                else:
                    abs_path = os.path.abspath(os.path.join(base_path, container_path))
                    container = containers.AudioContainer(abs_path)

                track = tracks.ContainerTrack(track_idx, container, key)
                corpus.import_tracks(track)
Beispiel #9
0
    def test_append(self, tmpdir):
        path = os.path.join(tmpdir.strpath, 'audio')
        cnt = containers.AudioContainer(path)
        cnt.open()

        chunk_a = np.random.random(10).astype(np.float32)
        cnt.append('track1', np.array(chunk_a), 16000)
        samples, sr = cnt.get('track1')

        assert np.allclose(samples, chunk_a, atol=1.e-4)
        assert sr == 16000

        chunk_b = np.random.random(5).astype(np.float32)
        cnt.append('track1', np.array(chunk_b), 16000)
        samples, sr = cnt.get('track1')

        assert np.allclose(samples,
                           np.concatenate([chunk_a, chunk_b]),
                           atol=1.e-4)
        assert sr == 16000

        cnt.close()
Beispiel #10
0
    def test_read_frames(self, tmpdir):
        cont_path = os.path.join(tmpdir.strpath, 'audio.hdf5')
        cont = containers.AudioContainer(cont_path)
        cont.open()

        content = np.random.random(10044)
        cont.set('track', content, 16000)
        track = tracks.ContainerTrack('some_idx', cont, 'track')

        data = list(track.read_frames(frame_size=400, hop_size=160))
        frames = np.array([x[0] for x in data])
        last = [x[1] for x in data]

        assert frames.shape == (62, 400)
        assert frames.dtype == np.float32
        assert np.allclose(frames[0], content[:400], atol=0.0001)
        expect = np.pad(content[9760:], (0, 116), mode='constant')
        assert np.allclose(frames[61], expect, atol=0.0001)

        assert last[:-1] == [False] * (len(data) - 1)
        assert last[-1]

        cont.close()