Как записать wav в tfrecord, а затем прочитать его - PullRequest
0 голосов
/ 17 июня 2020

Я пытаюсь записать закодированный wav в tfrecord, а затем прочитать его. Я знаю, что могу написать wav как обычный тензор, но пытаюсь сэкономить место.

Я хотел бы сделать что-то вроде следующего, но не знаю, как заполнить эллипсы. В частности, я не знаю, следует ли мне сохранять как функцию int64 или функцию байтов.

def wav_feature(wav):
    value = tf.audio.encode_wav(wav, 44100)
    return tf.train.Feature(...)

example = tf.train.Example(features=tf.train.Features(feature={
    'foo': wav_feature(wav),
}))

with tf.io.TFRecordWriter(outpath) as writer:
    writer.write(example.SerializeToString())

# In parser

features = tf.io.parse_single_example(
            serialized=proto,
            features={'foo': tf.io.FixedLenFeature([], ...)})

decoded, sr = tf.audio.decode_wav(features['foo'])

1 Ответ

1 голос
/ 19 июня 2020

Похоже, что encode_wav возвращает тензор строки , поэтому лучше всего использовать байтовую функцию:

def _bytes_feature(value):                                                      
  """Returns a bytes_list from a string / byte."""                              
  if isinstance(value, type(tf.constant(0))):                                   
    value = value.numpy() # BytesList won't unpack a string from an EagerTensor.
  return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value]))         

# Convert to a string tensor.
wav_encoded = tf.audio.encode_wav(wav, 44100)

feature = {'foo': _bytes_feature(wav_encoded)}         
example = tf.train.Example(features=tf.train.Features(feature=feature))      

Затем в парсере:

features = tf.io.parse_single_example(
        example.SerializeToString(),                 
        features={'foo': tf.io.FixedLenFeature([], tf.string)})               
# wav_encoded will be a string tensor. 
wav_encoded = features['foo']

Определение _bytes_feature - здесь .

...