Vì vậy, tôi đang cố gắng sử dụng mô-đun Python Wave để lấy tệp âm thanh và về cơ bản có được tất cả các khung từ đó, kiểm tra chúng và ghi chúng trở lại tệp khác . Tôi cố gắng phát ra âm thanh mà tôi đang đọc sang một tệp khác ngay bây giờ, nhưng nó phát ra âm thanh hoặc không có âm thanh gì cả. Vì vậy, tôi khá chắc chắn rằng tôi không phân tích các tập tin và nhận được các khung hình chính xác ...? Tôi đang xử lý tập tin âm thanh nổi 16 bit. Mặc dù tôi có thể sử dụng một tệp đơn giản hơn để chỉ hiểu quy trình, nhưng cuối cùng tôi muốn có thể chấp nhận bất kỳ loại tệp âm thanh nào để làm việc, vì vậy tôi cần phải hiểu vấn đề là gì.Sử dụng mô-đun sóng Python để nhận và viết âm thanh
Tôi cũng lưu ý rằng các tệp âm thanh 32 bit sẽ không được đọc bởi mô-đun Wave - nó đã cho tôi lỗi "Định dạng không xác định". Bất kỳ ý tưởng về điều đó? Có điều gì đó tôi có thể bỏ qua để tôi có thể ít nhất, ví dụ, đọc các tập tin âm thanh 32-bit, ngay cả khi tôi chỉ có thể 'render' các tập tin 16-bit?
Tôi biết rằng các tệp sóng được xen kẽ giữa các kênh trái và phải (mẫu đầu tiên cho kênh bên trái, thứ hai cho bên phải, v.v.), nhưng làm cách nào để tách các kênh? Đây là mã của tôi. Tôi cắt mã đầu ra để chỉ xem tôi có đang đọc các tệp một cách chính xác hay không. Tôi đang sử dụng Python 2.7.2:
import scipy
import wave
import struct
import numpy
import pylab
fp = wave.open('./sinewave16.wav', 'rb') # Problem loading certain kinds of wave files in binary?
samplerate = fp.getframerate()
totalsamples = fp.getnframes()
fft_length = 2048 # Guess
num_fft = (totalsamples/fft_length) - 2
temp = numpy.zeros((num_fft, fft_length), float)
leftchannel = numpy.zeros((num_fft, fft_length), float)
rightchannel = numpy.zeros((num_fft, fft_length), float)
for i in range(num_fft):
tempb = fp.readframes(fft_length/fp.getnchannels()/fp.getsampwidth());
#tempb = fp.readframes(fft_length)
up = (struct.unpack("%dB"%(fft_length), tempb))
#up = (struct.unpack("%dB"%(fft_length * fp.getnchannels() * fp.getsampwidth()), tempb))
#print (len(up))
temp[i,:] = numpy.array(up, float) - 128.0
temp = temp * numpy.hamming(fft_length)
temp.shape = (-1, fp.getnchannels())
fftd = numpy.fft.rfft(temp)
pylab.plot(abs(fftd[:,1]))
pylab.show()
#Frequency of an FFT should be as follows:
#The first bin in the FFT is DC (0 Hz), the second bin is Fs/N, where Fs is the sample rate and N is the size of the FFT. The next bin is 2 * Fs/N. To express this in general terms, the nth bin is n * Fs/N.
# (It would appear to me that n * Fs/N gives you the hertz, and you can use sqrt(real portion of number*r + imaginary portion*i) to find the magnitude of the signal
Hiện tại, tệp này sẽ tải tệp âm thanh để tôi có thể xem, nhưng tôi không nghĩ nó nhận được tất cả các tập tin âm thanh, hoặc nó không nhận được nó một cách chính xác. Tôi có đọc tệp sóng vào cấu trúc chính xác không? Có bất kỳ tài nguyên cập nhật nào về việc sử dụng Python để đọc và phân tích các tệp sóng/âm thanh không? Mọi sự trợ giúp sẽ rất được trân trọng.
Đây là một [nhỏ hướng dẫn] (http://soledadpenades.com/2009/10/29/fastest-way-to -generate-wav-files-in-python-sử dụng-the-wave-module /) về gói sóng. – Trilarion