如何将.wav文件转换为tfrecord文件?TensorFlow新手求助
WAV转分片TFRecord及
tf.audio.decode_wav报错修正 一、先解决tf.audio.decode_wav的报错问题
tf.audio.decode_wav的contents参数要求传入文件二进制内容,不是文件路径,直接传路径肯定报错。正确用法:
import tensorflow as tf # 先读取WAV文件的二进制数据 wav_bin = tf.io.read_file("你的WAV文件路径.wav") # 再解码得到音频张量和采样率 audio_tensor, sample_rate = tf.audio.decode_wav(wav_bin, desired_channels=-1, desired_samples=-1)
二、将WAV文件转为分片TFRecord(格式如.tfrecord-00000-of-00008)
下面提供两种可行方法:
方法1:用tf.data.experimental.save自动生成分片
这是最省心的方式,自动按指定分片数生成目标格式文件:
- 第一步:收集所有WAV文件路径
import glob # 替换成你的WAV文件所在目录 wav_paths = glob.glob("/path/to/your/wavs/*.wav") - 第二步:定义WAV文件处理函数,转成TFRecord的Example格式
def wav_to_example(file_path): # 读取并解码WAV wav_bin = tf.io.read_file(file_path) audio, sr = tf.audio.decode_wav(wav_bin) # 构造Example特征 feature_dict = { "audio": tf.train.Feature(float_list=tf.train.FloatList(value=audio.numpy().flatten())), "sample_rate": tf.train.Feature(int64_list=tf.train.Int64List(value=[sr.numpy()])) } example = tf.train.Example(features=tf.train.Features(feature=feature_dict)) return example.SerializeToString() - 第三步:创建数据集并保存为分片TFRecord
执行后,保存目录下会自动生成# 创建数据集 dataset = tf.data.Dataset.from_tensor_slices(wav_paths) # 并行处理每个WAV文件 dataset = dataset.map( lambda path: tf.py_function(wav_to_example, [path], tf.string), num_parallel_calls=tf.data.AUTOTUNE ) # 保存为8个分片,替换成你的保存目录 tf.data.experimental.save( dataset, path="/path/to/save/tfrecords", shard_func=lambda _, idx: idx % 8 # 按索引取模分配分片 )tfrecord-00000-of-00008到tfrecord-00007-of-00008的分片文件。
方法2:手动写入分片TFRecord
如果需要更灵活的分片逻辑(比如按文件大小分配),可以手动创建多个写入器:
- 第一步:初始化8个分片写入器
num_shards = 8 writers = [] for shard_id in range(num_shards): # 生成目标格式的文件名 shard_filename = f"output.tfrecord-{shard_id:05d}-of-{num_shards:05d}" writers.append(tf.io.TFRecordWriter(shard_filename)) - 第二步:遍历WAV文件,写入对应分片
for idx, path in enumerate(wav_paths): # 处理WAV为Example(同方法1的逻辑) wav_bin = tf.io.read_file(path) audio, sr = tf.audio.decode_wav(wav_bin) feature_dict = { "audio": tf.train.Feature(float_list=tf.train.FloatList(value=audio.numpy().flatten())), "sample_rate": tf.train.Feature(int64_list=tf.train.Int64List(value=[sr.numpy()])) } example = tf.train.Example(features=tf.train.Features(feature=feature_dict)) # 按文件索引取模分配分片 target_shard = idx % num_shards writers[target_shard].write(example.SerializeToString()) - 第三步:关闭所有写入器
for writer in writers: writer.close()
内容的提问来源于stack exchange,提问作者Megan
相关产品推荐
相关产品推荐

