TensorFlow使用tfio播放音频触发ushort format requires错误如何解决
问题原因
tf.squeeze参数设置错误:你传入了axis=[],相当于没有删除任何长度为1的维度,加载的单声道音频张量形状为(采样点数, 1),多出来的最后一维会导致音频处理时采样位深计算异常。- 张量数值范围不匹配:
tfio.audio.AudioIOTensor加载MP3返回的张量默认是tf.int32类型,取值范围远超IPython.display.Audio对整数输入要求的16位整型范围[-32768, 32767],导致wave模块计算采样位宽时超出ushort类型的数值上限。
修复后的代码
# 安装依赖(首次运行执行即可) !pip install tensorflow-io import tensorflow as tf import tensorflow_io as tfio from IPython.display import Audio # 加载音频 audio = tfio.audio.AudioIOTensor('/content/dataset/TrainAudioFiles/0.mp3') print(audio) # 裁剪音频 audio_slice = audio[100:] # 修复1:删除多余的通道维度(单声道场景下) audio_tensor = tf.squeeze(audio_slice) print(audio_tensor) # 修复2:将int32张量归一化到[-1, 1]的浮点范围,适配Audio组件要求 audio_numpy = audio_tensor.numpy() / 32768.0 # 播放音频 Audio(audio_numpy, rate=audio.rate.numpy())
可选方案
如果要保留整数输入,也可以直接将张量强制转换为16位整型,同样可以解决位宽超出问题:
audio_tensor = tf.cast(tf.squeeze(audio_slice), tf.int16) Audio(audio_tensor.numpy(), rate=audio.rate.numpy())
内容的提问来源于stack exchange,提问作者Shivam Tawari
相关产品推荐
相关产品推荐

