2010-01-13 47 views
46

Tôi cần phân tích âm thanh được ghi trong tệp .wav. Vì vậy, tôi cần chuyển đổi tệp này thành tập hợp các số (ví dụ: mảng). Tôi nghĩ tôi cần sử dụng gói sóng. Tuy nhiên, tôi không biết chính xác nó hoạt động như thế nào. Ví dụ: tôi đã làm như sau:Đọc các tệp * .wav bằng Python

import wave 
w = wave.open('/usr/share/sounds/ekiga/voicemail.wav', 'r') 
for i in range(w.getnframes()): 
    frame = w.readframes(i) 
    print frame 

Kết quả của mã này tôi mong đợi sẽ thấy áp lực âm thanh như hàm của thời gian. Ngược lại, tôi thấy rất nhiều biểu tượng kỳ lạ, bí ẩn (không phải là số thập lục phân). Ai có thể, cầu xin, giúp tôi với điều đó?

+12

Nó thực sự khó hiểu khi một người khác với tên của tôi gửi một câu hỏi mà tôi đang yêu cầu, nhưng tôi không có bộ nhớ làm như vậy bản thân mình :) – Roman

+1

Điều gì trên trái đất là số lục giác? – glglgl

+1

@glglgl Có lẽ không phải điều có nghĩa là: https://en.wikipedia.org/wiki/Hexagonal_number :-) – JakeD

Trả lời

46

Mỗi the sources, scipy.io.wavfile.read(somefile) trả về một bộ gồm hai mục: thứ nhất là tỷ lệ lấy mẫu theo mẫu trên giây, thứ hai là một mảng numpy với tất cả dữ liệu được đọc từ tệp. Có vẻ khá dễ sử dụng!

+0

Bạn có thể kết hợp điều này với các công cụ chuyển đổi dòng lệnh để mở các định dạng khác. – endolith

+7

Mặc dù nó thiếu số kênh. Làm thế nào bạn có nghĩa vụ phải làm việc với âm thanh mà không biết số lượng các kênh? – bastibe

+0

đã ném một số lỗi giải mã cấu trúc lạ trên máy tính của tôi. Tôi nghĩ rằng nó sử dụng struct.unpack ('

1

Nếu bạn định thực hiện truyền trên dữ liệu dạng sóng thì có lẽ bạn nên sử dụng SciPy, cụ thể là scipy.io.wavfile.

+1

OK. Tôi chỉ cần cài đặt SciPy nhưng tôi không thể tìm thấy bất kỳ ví dụ về việc sử dụng scipy.io.wavfile. – Roman

+4

Không có gì giống như thông dịch viên tương tác để tìm ra cách mọi thứ hoạt động! Hãy tham vọng! –

44

tôi đã làm một số nghiên cứu tối nay và figured này ra:

import wave, struct 

waveFile = wave.open('sine.wav', 'r') 

length = waveFile.getnframes() 
for i in range(0,length): 
    waveData = waveFile.readframes(1) 
    data = struct.unpack("<h", waveData) 
    print(int(data[0])) 

Hy vọng rằng đoạn mã này giúp ai đó. Chi tiết: bằng cách sử dụng struct module, bạn có thể chụp các khung sóng (trong nhị phân bổ sung 2 giây giữa -32768; 0x8000 và 32767; 0x7FFF) Điều này đọc tệp MONO, 16-BIT, WAVE. Tôi thấy this webpage khá hữu ích trong việc xây dựng điều này.

+1

cách xử lý các tệp âm thanh nổi 24 bit? – Basj

+7

điều này cho tôi lỗi: "struct.error: unpack yêu cầu đối số chuỗi có độ dài 2" – Coder404

+0

Nếu bạn chạy đoạn mã này với tệp âm thanh rất lớn. Máy tính của bạn sẽ bị chết do bộ nhớ cần bởi chương trình này. Cần xử lý tệp âm thanh theo khối cho tệp âm thanh lớn – ArthurLambert

8

Bạn có thể thực hiện việc này bằng mô-đun scikits.audiolab. Nó đòi hỏi NumPy và SciPy hoạt động, và cũng libsndfile.

Lưu ý, tôi chỉ có thể làm cho nó hoạt động trên Ubunutu chứ không phải trên OSX.

from scikits.audiolab import wavread 

filename = "testfile.wav" 

data, sample_frequency,encoding = wavread(filename) 

Bây giờ bạn có dữ liệu wav

0

nếu chỉ hai của tập tin và tỷ lệ mẫu là cao đáng kể, bạn có thể chỉ interleave họ.

from scipy.io import wavfile 
rate1,dat1 = wavfile.read(File1) 
rate2,dat2 = wavfile.read(File2) 

if len(dat2) > len(dat1):#swap shortest 
    temp = dat2 
    dat2 = dat1 
    dat1 = temp 

output = dat1 
for i in range(len(dat2)/2): output[i*2]=dat2[i*2] 

wavfile.write(OUTPUT,rate,dat) 
3

Nếu bạn muốn mua một khối âm thanh theo khối, một số giải pháp được cho là khá khủng khiếp khi chúng tải toàn bộ âm thanh vào bộ nhớ tạo nhiều bộ nhớ cache và làm chậm chương trình của bạn. python-wavefile cung cấp một số cấu trúc pythonic để làm NumPy block-by-block xử lý bằng cách sử dụng quản lý khối hiệu quả và minh bạch bằng phương tiện của máy phát điện. Các niceties pythonic khác là trình quản lý ngữ cảnh cho các tệp, siêu dữ liệu là thuộc tính ... và nếu bạn muốn toàn bộ giao diện tệp, bởi vì bạn đang phát triển một mẫu thử nghiệm nhanh và bạn không quan tâm về hiệu quả, toàn bộ giao diện tệp vẫn ở đó.

Một ví dụ đơn giản về chế biến sẽ là:

import sys 
from wavefile import WaveReader, WaveWriter 

with WaveReader(sys.argv[1]) as r : 
    with WaveWriter(
      'output.wav', 
      channels=r.channels, 
      samplerate=r.samplerate, 
      ) as w : 

     # Just to set the metadata 
     w.metadata.title = r.metadata.title + " II" 
     w.metadata.artist = r.metadata.artist 

     # This is the prodessing loop 
     for data in r.read_iter(size=512) : 
      data[1] *= .8  # lower volume on the second channel 
      w.write(data) 

Ví dụ tái sử dụng cùng một khối để đọc toàn bộ tập tin, ngay cả trong trường hợp của các khối cuối cùng thường là nhỏ hơn kích thước yêu cầu. Trong trường hợp này, bạn nhận được một lát của khối. Vì vậy, hãy tin tưởng độ dài khối được trả về thay vì sử dụng kích thước 512 được mã hóa cứng để xử lý thêm.

14

module python khác nhau để đọc wav:

Có ít nhất các thư viện sau đây để đọc tập tin âm thanh sóng:

Ví dụ đơn giản nhất:

Đây là một cách đơn giản ví dụ với Pysoundfile:

import soundfile as sf 
data, samplerate = sf.read('existing_file.wav') 

Format của đầu ra:

Cảnh báo, các dữ liệu không phải lúc nào trong các định dạng tương tự, mà phụ thuộc vào thư viện. Ví dụ:

from scikits import audiolab 
from scipy.io import wavfile 
from sys import argv 
for filetest in argv[1:]: 
    [x, fs, nbBits] = audiolab.wavread(filePath) 
    print '\nReading with scikits.audiolab.wavread: ', x 
    [fs, x] = wavfile.read(filetest) 
    print '\nReading with scipy.io.wavfile.read: ', x 

Reading với scikits.audiolab.wavread: [0. 0. 0. ..., -0,00097656 -0,00079346 -0,00097656] Reading với scipy.io.wavfile.read: [0 0 0 ..., -32 -26 -32]

PySoundFile và Audiolab trả về float giữa -1 và 1 (như matab, đó là quy ước cho tín hiệu âm thanh). Scipy và các số nguyên trả về sóng, có thể được chuyển đổi theo phao theo số bit mã hóa.

Ví dụ:

from scipy.io.wavfile import read as wavread 
[samplerate, x] = wavread(audiofilename) # x is a numpy array of integer, representing the samples 
# scale to -1.0 -- 1.0 
if x.dtype == 'int16': 
    nb_bits = 16 # -> 16-bit wav files 
elif x.dtype == 'int32': 
    nb_bits = 32 # -> 32-bit wav files 
max_nb_bit = float(2 ** (nb_bits - 1)) 
samples = x/(max_nb_bit + 1.0) # samples is a numpy array of float representing the samples 
0

tôi cần phải đọc một 1-kênh tập tin WAV 24-bit. Bài đăng trên bằng Nak rất hữu ích. Tuy nhiên, như đã đề cập ở trên bởi basj 24-bit không đơn giản. Cuối cùng, tôi đã làm việc này bằng cách sử dụng đoạn mã sau:

from scipy.io import wavfile 
TheFile = 'example24bit1channelFile.wav' 
[fs, x] = wavfile.read(TheFile) 

# convert the loaded data into a 24bit signal 

nx = len(x) 
ny = nx/3*4 # four 3-byte samples are contained in three int32 words 

y = np.zeros((ny,), dtype=np.int32) # initialise array 

# build the data left aligned in order to keep the sign bit operational. 
# result will be factor 256 too high 

y[0:ny:4] = ((x[0:nx:3] & 0x000000FF) << 8) | \ 
    ((x[0:nx:3] & 0x0000FF00) << 8) | ((x[0:nx:3] & 0x00FF0000) << 8) 
y[1:ny:4] = ((x[0:nx:3] & 0xFF000000) >> 16) | \ 
    ((x[1:nx:3] & 0x000000FF) << 16) | ((x[1:nx:3] & 0x0000FF00) << 16) 
y[2:ny:4] = ((x[1:nx:3] & 0x00FF0000) >> 8) | \ 
    ((x[1:nx:3] & 0xFF000000) >> 8) | ((x[2:nx:3] & 0x000000FF) << 24) 
y[3:ny:4] = (x[2:nx:3] & 0x0000FF00) | \ 
    (x[2:nx:3] & 0x00FF0000) | (x[2:nx:3] & 0xFF000000) 

y = y/256 # correct for building 24 bit data left aligned in 32bit words 

Một số quy mô bổ sung là bắt buộc nếu bạn cần kết quả từ -1 đến +1. Có lẽ một số bạn trên mạng có thể thấy hữu ích

10

IMHO này, cách dễ nhất để có được dữ liệu âm thanh từ một tập tin âm thanh vào một mảng NumPy là PySoundFile:

import soundfile as sf 
data, fs = sf.read('/usr/share/sounds/ekiga/voicemail.wav') 

này cũng hỗ trợ các file 24-bit ra khỏi cái hộp.

Có nhiều thư viện tệp âm thanh có sẵn, tôi đã viết an overview nơi bạn có thể thấy một số ưu và khuyết điểm. Nó cũng có một trang giải thích how to read a 24-bit wav file with the wave module.

+0

Lưu ý: soundfile.read() bình thường hóa bởi 2^(n_bits - 1) như trong ví dụ scipy.io.wavfile của sandoval – Quetzalcoatl

0

u cũng có thể sử dụng thư viện đơn giản import wavio u cũng cần có một số kiến ​​thức cơ bản về âm thanh.

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