- Timestamp:
- Jan 12, 2014, 5:54:42 AM (11 years ago)
- Branches:
- feature/autosink, feature/cnn, feature/cnn_org, feature/constantq, feature/crepe, feature/crepe_org, feature/pitchshift, feature/pydocstrings, feature/timestretch, fix/ffmpeg5, master, pitchshift, sampler, timestretch, yinfft+
- Children:
- 4320679
- Parents:
- d945976
- Location:
- python
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
python/lib/aubio/slicing.py
rd945976 rf36ecea 1 1 from aubio import source, sink 2 2 import os 3 4 max_timestamp = 1e120 3 5 4 6 def slice_source_at_stamps(source_file, timestamps, timestamps_end = None, … … 10 12 raise ValueError ("no timestamps given") 11 13 14 if timestamps[0] != 0: 15 timestamps = [0] + timestamps 16 12 17 if timestamps_end != None and len(timestamps_end) != len(timestamps): 13 18 raise ValueError ("len(timestamps_end) != len(timestamps)") 19 else: 20 timestamps_end = [t - 1 for t in timestamps[1:] ] + [ max_timestamp ] 14 21 15 22 source_base_name, source_ext = os.path.splitext(os.path.basename(source_file)) … … 19 26 source_base_name = os.path.join(output_dir, source_base_name) 20 27 21 def new_sink_name(source_base_name, timestamp): 22 return source_base_name + '_%02.3f' % (timestamp) + '.wav' 28 def new_sink_name(source_base_name, timestamp, samplerate): 29 timestamp_seconds = timestamp / float(samplerate) 30 #print source_base_name + '_%02.3f' % (timestamp_seconds) + '.wav' 31 return source_base_name + '_%02.3f' % (timestamp_seconds) + '.wav' 23 32 24 33 # reopen source file 25 34 s = source(source_file, samplerate, hopsize) 26 35 if samplerate == 0: samplerate = s.get_samplerate() 27 # create first sink at 028 g = sink(new_sink_name(source_base_name, 0.), samplerate)29 36 total_frames = 0 30 37 # get next region 31 next_stamp = int(timestamps.pop(0)) 38 start_stamp = int(timestamps.pop(0)) 39 end_stamp = int(timestamps_end.pop(0)) 40 41 # create first sink 42 new_sink_path = new_sink_name(source_base_name, start_stamp, samplerate) 43 #print "new slice", total_frames, "+", remaining, "=", end_stamp 44 g = sink(new_sink_path, samplerate) 32 45 33 46 while True: 34 47 # get hopsize new samples from source 35 48 vec, read = s() 36 remaining = next_stamp - total_frames 49 # number of samples until end of region 50 remaining = end_stamp - total_frames 37 51 # not enough frames remaining, time to split 38 52 if remaining < read: … … 42 56 # close this file 43 57 del g 58 # get the next region 59 start_stamp = int(timestamps.pop(0)) 60 end_stamp = int(timestamps_end.pop(0)) 44 61 # create a new file for the new region 45 new_sink_path = new_sink_name(source_base_name, next_stamp / float(samplerate))46 #print "new slice", total_frames, "+", remaining, "=", next_stamp62 new_sink_path = new_sink_name(source_base_name, start_stamp, samplerate) 63 #print "new slice", total_frames, "+", remaining, "=", end_stamp 47 64 g = sink(new_sink_path, samplerate) 48 65 # write the remaining samples in the new file 49 66 g(vec[remaining:read], read - remaining) 50 if len(timestamps): 51 next_stamp = int(timestamps.pop(0)) 52 else: 53 next_stamp = 1e120 54 else: 67 elif read > 0: 68 # write all the samples 55 69 g(vec[0:read], read) 56 70 total_frames += read -
python/tests/test_slicing.py
rd945976 rf36ecea 5 5 6 6 from aubio import slice_source_at_stamps 7 from utils import count_samples_in_file, count_samples_in_directory 8 from utils import get_default_test_sound 7 from utils import * 9 8 10 9 import tempfile … … 29 28 def test_slice_start_beyond_end(self): 30 29 regions_start = [i*1000 for i in range(1, n_slices)] 31 regions_start += [count_samples_in_file(self.source_file)]32 30 regions_start += [count_samples_in_file(self.source_file) + 1000] 33 31 slice_source_at_stamps(self.source_file, regions_start, output_dir = self.output_dir) 32 33 def test_slice_start_every_blocksize(self): 34 hopsize = 200 35 regions_start = [i*hopsize for i in range(1, n_slices)] 36 regions_start += [count_samples_in_file(self.source_file) + 1000] 37 slice_source_at_stamps(self.source_file, regions_start, output_dir = self.output_dir, 38 hopsize = 200) 34 39 35 40 def tearDown(self): 36 41 original_samples = count_samples_in_file(self.source_file) 37 42 written_samples = count_samples_in_directory(self.output_dir) 43 total_files = count_files_in_directory(self.output_dir) 44 assert_equal(n_slices, total_files, 45 "number of slices created different from expected") 38 46 assert_equal(written_samples, original_samples, 39 47 "number of samples written different from number of original samples") … … 68 76 69 77 def test_slice_wrong_ends(self): 70 regions_start = [i*1000 for i in range(1, 100)]78 regions_start = [i*1000 for i in range(1, n_slices)] 71 79 regions_end = [] 72 80 self.assertRaises (ValueError, … … 75 83 76 84 def test_slice_no_ends(self): 77 regions_start = [i*1000 for i in range(1, 100)]85 regions_start = [i*1000 for i in range(1, n_slices)] 78 86 regions_end = None 79 87 slice_source_at_stamps (self.source_file, regions_start, regions_end, -
python/tests/utils.py
rd945976 rf36ecea 48 48 total_frames += count_samples_in_file(file_path) 49 49 return total_frames 50 51 def count_files_in_directory(samples_dir): 52 import os 53 total_files = 0 54 for f in os.walk(samples_dir): 55 if len(f[2]): 56 for each in f[2]: 57 file_path = os.path.join(f[0], each) 58 if file_path: 59 total_files += 1 60 return total_files
Note: See TracChangeset
for help on using the changeset viewer.