Sử dụng Python 3.7 và Tensorflow 2.0, tôi gặp khó khăn khi đọc các tệp wav từ bộ dữ liệu UrbanSound. Câu hỏi và câu trả lời này rất hữu ích vì chúng giải thích rằng đầu vào phải là một chuỗi căng, nhưng dường như rất khó để vượt qua siêu dữ liệu ban đầu được mã hóa trong tệp và truy cập dữ liệu thực. Tôi có phải xử lý trước chuỗi trước khi có thể tải nó dưới dạng tenxơ float32 không? Tôi đã phải xử lý trước dữ liệu bằng cách lấy mẫu dữ liệu từ wav 24 bit xuống wav 16 bit, do đó, đường ống nhập dữ liệu đang trở nên cồng kềnh hơn nhiều so với tôi dự kiến. Downsampling cần thiết là đặc biệt bực bội. Đây là những gì tôi đang cố gắng cho đến nay:
import tensorflow as tf # this is TensorFlow 2.0
path_to_wav_file = '/mnt/d/Code/UrbanSounds/audio/fold1/101415-3-0-2.wav'
# Turn the wav file into a string tensor
input_data = tf.io.read_file(path_to_wav_file)
# Convert the string tensor to a float32 tensor
audio, sampling_rate = tf.audio.decode_wav(input_data)
Đây là lỗi tôi nhận được ở bước cuối cùng:
2019-10-08 20:56:09.124254: W tensorflow/core/framework/op_kernel.cc:1546] OP_REQUIRES failed at decode_wav_op.cc:55 : Invalid argument: Header mismatch: Expected fmt but found junk
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/anaconda3/envs/tf2/lib/python3.7/site-packages/tensorflow/python/ops/gen_audio_ops.py", line 216, in decode_wav
_six.raise_from(_core._status_to_exception(e.code, message), None)
File "<string>", line 3, in raise_from
tensorflow.python.framework.errors_impl.InvalidArgumentError: Header mismatch: Expected fmt but found junk [Op:DecodeWav]
Và đây là sự khởi đầu của chuỗi tenor đó. Tôi không phải là chuyên gia về các tệp wav, nhưng tôi nghĩ phần sau "fmt" là nơi dữ liệu âm thanh thực tế bắt đầu. Trước đó tôi nghĩ đó là tất cả siêu dữ liệu về tệp.
data.numpy()[:70]
b'RIFFhb\x05\x00WAVEjunk\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00fmt \x10\x00\x00\x00\x01\x00\x01\x00D\xac\x00\x00\x88X\x01\x00\x02\x00'
hb\x05\x00
)?
junk
lên đến byte trước đófmt
) để xem nó có hoạt động không? Tôi đoán là bộ giải mã của chúng khá cơ bản và không thể xử lý hoàn toàn định dạng RIFF / WAVE.