Nhập tệp wav trong Tensorflow 2


9

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'

Với mục đích thử nghiệm, bạn đã thử xóa tiêu đề "rác" theo cách thủ công khỏi dữ liệu (từ junklê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.
Matthieu

Có tôi đã thử nó nhưng tôi vẫn không thể làm cho nó hoạt động.
Alex

Và bạn đã thay đổi độ dài tiêu đề cho phù hợp (Phần hb\x05\x00)?
Matthieu

Không, tôi không có. Tôi sẽ phải thay đổi nó thành gì?
Alex

1
Tôi nghĩ lý do điều này dường như hoạt động trong tenorflow 1.14 là vì tf1 sử dụng thực thi lười biếng, vì vậy bạn có thể chạy âm thanh, sample_rate = tf.audio.decode_wav (input_data) mà không gặp lỗi, nhưng dường như chỉ vì nó không thực sự thực thi mã chưa.
Alex

Câu trả lời:


6

Có vẻ như lỗi của bạn đã xảy ra với TensorFlow mong đợi phần fmt là phần đầu.

Mã của TensorFlow để xử lý có thể được tìm thấy ở đây: https://github.com/tensorflow/tensorflow/blob/c9cd1784bf287543d89593ca1432170cdbf694de/tensorflow/core/lib/wav/wav_

Ngoài ra còn có một vấn đề mở, đang chờ phản hồi từ nhóm của TensorFlow, trong đó bao gồm cả lỗi tương tự bạn đã cung cấp. https://github.com/tensorflow/tensorflow/issues/32382

Các thư viện khác chỉ cần bỏ qua phần Rác, vì vậy nó hoạt động với chúng.


Câu trả lời của bạn là đây là một lỗi, và thật không may là bạn có vẻ đúng. Các liên kết là hữu ích.
Alex

4

Có vẻ như mã của bạn không thành công cho tệp âm thanh kênh đôi. Mã này hoạt động cho tập tin wav kênh đơn. Trong trường hợp của bạn, bạn có thể thử sử dụng scipy.

from scipy.io import wavfile as wav
sampling_rate, data =  wav.read('101415-3-0-2.wav')

Điều này rất hữu ích vì nó cung cấp một giải pháp thay thế, nhưng nó không trả lời câu hỏi theo nghĩa có lẽ có một cách để làm điều này hoàn toàn trong thư viện tenorflow.
Alex

@Alex nhưng tệp .wav có vấn đề không thành công với tenorflow hoạt động với scipy?
Matthieu

1
@Matthieu Tệp wav có vấn đề hoạt động với các thư viện khác nhưng không phải với toán tử decode_wav của TensorFlow. @ravikt Bạn có chắc chắn rằng tiêu đề của tệp wav mono mà bạn đã kiểm tra có chứa junktrong phần tiêu đề không chứfmt ?
Kautham Krishna
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.