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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 20:22:35