def process(self, input_example): tf.logging.info('Splitting %s', input_example.features.feature['id'].bytes_list.value[0]) wav_data = input_example.features.feature['audio'].bytes_list.value[0] ns = music_pb2.NoteSequence.FromString( input_example.features.feature['sequence'].bytes_list.value[0]) Metrics.counter('split_wav', 'read_midi_wav_to_split').inc() if self._split == 'test': # For the 'test' split, use the full length audio and midi. split_examples = split_audio_and_label_data.process_record( wav_data, ns, ns.id, min_length=0, max_length=-1, sample_rate=self._sample_rate) for example in split_examples: Metrics.counter('split_wav', 'full_example').inc() yield example else: split_examples = split_audio_and_label_data.process_record( wav_data, ns, ns.id, self._min_length, self._max_length, self._sample_rate) for example in split_examples: Metrics.counter('split_wav', 'split_example').inc() yield example
def split_wav(input_example, min_length, max_length, sample_rate, output_directory, process_for_training, load_audio_with_librosa): """Splits wav and midi files for the dataset.""" tf.logging.info('Splitting %s', input_example.features.feature['id'].bytes_list.value[0]) wav_data = input_example.features.feature['audio'].bytes_list.value[0] ns = music_pb2.NoteSequence.FromString( input_example.features.feature['sequence'].bytes_list.value[0]) Metrics.counter('split_wav', 'read_midi_wav_to_split').inc() if not process_for_training: split_examples = split_audio_and_label_data.process_record( wav_data, ns, ns.id, min_length=0, max_length=-1, sample_rate=sample_rate, load_audio_with_librosa=load_audio_with_librosa) for example in split_examples: Metrics.counter('split_wav', 'full_example').inc() yield example else: try: split_examples = split_audio_and_label_data.process_record( wav_data, ns, ns.id, min_length=min_length, max_length=max_length, sample_rate=sample_rate, load_audio_with_librosa=load_audio_with_librosa) for example in split_examples: Metrics.counter('split_wav', 'split_example').inc() yield example except AssertionError: output_file = 'badexample-' + hashlib.md5( ns.id).hexdigest() + '.proto' output_path = os.path.join(output_directory, output_file) tf.logging.error('Exception processing %s. Writing file to %s', ns.id, output_path) with tf.gfile.Open(output_path, 'w') as f: f.write(input_example.SerializeToString()) raise
def generate_train_set(exclude_ids): """Generate the train TFRecord.""" train_file_pairs = [] for directory in train_dirs: path = os.path.join(FLAGS.input_dir, directory) path = os.path.join(path, '*.wav') wav_files = glob.glob(path) # find matching mid files for wav_file in wav_files: base_name_root, _ = os.path.splitext(wav_file) mid_file = base_name_root + '.mid' if filename_to_id(wav_file) not in exclude_ids: train_file_pairs.append((wav_file, mid_file)) train_output_name = os.path.join(FLAGS.output_dir, 'maps_config2_train.tfrecord') with tf.python_io.TFRecordWriter(train_output_name) as writer: for idx, pair in enumerate(train_file_pairs): print('{} of {}: {}'.format(idx, len(train_file_pairs), pair[0])) # load the wav data wav_data = tf.gfile.Open(pair[0], 'rb').read() # load the midi data and convert to a notesequence ns = midi_io.midi_file_to_note_sequence(pair[1]) for example in split_audio_and_label_data.process_record( wav_data, ns, pair[0], FLAGS.min_length, FLAGS.max_length, FLAGS.sample_rate): writer.write(example.SerializeToString())
def process(self, input_example): tf.logging.info('Splitting %s', input_example.features.feature['id'].bytes_list.value[0]) wav_data = input_example.features.feature['audio'].bytes_list.value[0] ns = music_pb2.NoteSequence.FromString( input_example.features.feature['sequence'].bytes_list.value[0]) Metrics.counter('split_wav', 'read_midi_wav_to_split').inc() if self._split == 'test' or self._split == 'validation': # For the 'test' and 'validation' splits, use the full length audio and # midi. split_examples = split_audio_and_label_data.process_record( wav_data, ns, ns.id, min_length=0, max_length=-1, sample_rate=self._sample_rate) for example in split_examples: Metrics.counter('split_wav', 'full_example').inc() yield example else: try: split_examples = split_audio_and_label_data.process_record( wav_data, ns, ns.id, self._min_length, self._max_length, self._sample_rate) for example in split_examples: Metrics.counter('split_wav', 'split_example').inc() yield example except AssertionError: output_file = 'badexample-' + hashlib.md5(ns.id).hexdigest() + '.proto' output_path = os.path.join(self._output_directory, output_file) tf.logging.error('Exception processing %s. Writing file to %s', ns.id, output_path) with tf.gfile.Open(output_path, 'w') as f: f.write(input_example.SerializeToString()) raise
def process(self, input_example): tf.logging.info('Splitting %s', input_example.features.feature['id'].bytes_list.value[0]) wav_data = input_example.features.feature['audio'].bytes_list.value[0] ns = music_pb2.NoteSequence.FromString( input_example.features.feature['sequence'].bytes_list.value[0]) Metrics.counter('split_wav', 'read_midi_wav_to_split').inc() if not self._chunk_files: split_examples = split_audio_and_label_data.process_record( wav_data, ns, ns.id, min_length=0, max_length=-1, sample_rate=self._sample_rate) for example in split_examples: Metrics.counter('split_wav', 'full_example').inc() yield example else: try: split_examples = split_audio_and_label_data.process_record( wav_data, ns, ns.id, self._min_length, self._max_length, self._sample_rate) for example in split_examples: Metrics.counter('split_wav', 'split_example').inc() yield example except AssertionError: output_file = 'badexample-' + hashlib.md5(ns.id).hexdigest() + '.proto' output_path = os.path.join(self._output_directory, output_file) tf.logging.error('Exception processing %s. Writing file to %s', ns.id, output_path) with tf.gfile.Open(output_path, 'w') as f: f.write(input_example.SerializeToString()) raise
def create_example(filename): """Processes an audio file into an Example proto.""" wav_data = tf.gfile.Open(filename, 'rb').read() example_list = list( split_audio_and_label_data.process_record( wav_data=wav_data, ns=music_pb2.NoteSequence(), example_id=filename, min_length=0, max_length=-1, allow_empty_notesequence=True)) assert len(example_list) == 1 return example_list[0].SerializeToString()
def create_example(filename): """Processes an audio file into an Example proto.""" wav_data = tf.gfile.Open(filename, 'rb').read() example_list = list( split_audio_and_label_data.process_record( wav_data=wav_data, ns=music_pb2.NoteSequence(), # decode to handle filenames with extended characters. example_id=filename.decode('utf-8'), min_length=0, max_length=-1, allow_empty_notesequence=True)) assert len(example_list) == 1 return example_list[0].SerializeToString()
def testSplitAudioLabelData(self): wav_data, sequence = self._CreateSyntheticExample() records = split_audio_and_label_data.process_record( wav_data, sequence, 'test', sample_rate=SAMPLE_RATE) for record in records: audio = record.features.feature['audio'].bytes_list.value[0] velocity_range = music_pb2.VelocityRange.FromString( record.features.feature['velocity_range'].bytes_list.value[0]) note_sequence = music_pb2.NoteSequence.FromString( record.features.feature['sequence'].bytes_list.value[0]) self.assertEqual( np.all( audio_io.wav_data_to_samples(audio, sample_rate=SAMPLE_RATE) == np.zeros(2 * SAMPLE_RATE)), True) self.assertEqual(velocity_range.min, 20) self.assertEqual(velocity_range.max, 80) self.assertEqual(note_sequence.notes[0].velocity, 20) self.assertEqual(note_sequence.notes[0].end_time, 5.) self.assertEqual(note_sequence.notes[1].velocity, 80) self.assertEqual(note_sequence.notes[1].end_time, 10.)