You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 17:06:23