2012-03-26 23 views
5

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.

+0

Đâ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

Trả lời

6

Có lẽ bạn nên thử các module scipy io.wavefile:

http://docs.scipy.org/doc/scipy/reference/io.html

+0

Cảm ơn bạn đã đề xuất. Tôi sẽ kiểm tra. – SolarLune

+0

Tôi vừa kiểm tra và có vẻ như đã đọc âm thanh rõ ràng, điều này rất tốt. Cám ơn vì sự gợi ý. – SolarLune

+1

Liên kết đã chết, đây là liên kết mới: http://docs.scipy.org/doc/scipy/reference/io.html – Kaifei

Các vấn đề liên quan