基于CNN的说话人识别代码运行报错:TypeError: ReadFile操作的输入'filename'类型为float32,与预期的string类型不匹配
解决TypeError: Input 'filename' of 'ReadFile' Op has type float32 that does not match expected type of string
这个错误的核心原因是你传入tf.io.read_file的路径不是字符串类型,而是被错误转换成了float32张量,通常是因为你的audio_paths列表中混入了非字符串的路径对象(比如Path类实例),TensorFlow无法正确解析这类对象,只能将其强制转换为数值类型。
问题定位
看你代码中构建路径的片段:
dir_path = Path(DATASET_AUDIO_PATH) / name speaker_sample_paths = [ os.path.join(dir_path, filepath) for filepath in os.listdir(dir_path) if filepath.endswith(".wav") ]
这里dir_path是Path对象,使用os.path.join拼接Path对象和字符串时,返回的结果可能还是Path实例,而非原生Python字符串。当TensorFlow将这些Path对象转换为张量时,无法识别其为字符串类型,最终被错误转为float32,导致tf.io.read_file触发类型不匹配的报错。
解决方案
修改路径构建逻辑,确保所有路径都是字符串类型:
dir_path = Path(DATASET_AUDIO_PATH) / name speaker_sample_paths = [ # 用Path的/运算符拼接后,显式转为字符串 str(dir_path / filepath) for filepath in os.listdir(dir_path) if filepath.endswith(".wav") ]
或者也可以先把dir_path转为字符串再用os.path.join:
dir_path = Path(DATASET_AUDIO_PATH) / name speaker_sample_paths = [ os.path.join(str(dir_path), filepath) for filepath in os.listdir(dir_path) if filepath.endswith(".wav") ]
额外提示(避免后续踩坑)
你的tf.audio.decode_wav调用参数存在小问题:
audio, _ = tf.audio.decode_wav(audio, 1, SAMPLING_RATE)
根据TensorFlow官方文档,tf.audio.decode_wav的第二个参数是desired_channels(目标声道数),第三个参数是desired_samples(目标样本数),不是采样率。如果需要将音频重采样到SAMPLING_RATE,需要在解码后添加重采样步骤:
audio, sample_rate = tf.audio.decode_wav(audio, desired_channels=1) audio = tf.audio.resample(audio, sample_rate, SAMPLING_RATE)
这样修改后,你的数据集构建流程就能正确处理路径,解决当前的类型错误。
内容的提问来源于stack exchange,提问作者Abdelrahman Salah
相关产品推荐
相关产品推荐

