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()
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()
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()
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()
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()
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()
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()
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)
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()
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()