2013-09-05 59 views
10

tôi có mã này:Viết file wav bằng Python với wavfile.write từ scipy

import numpy as np 
import scipy.io.wavfile 
import math 

rate, data = scipy.io.wavfile.read('xenencounter_23.wav') 

data2 = [] 

for i in range(len(data)): 
    data2.append([int(round(math.sin(data[i][0])*3000)), int(round(math.sin(data[i][1])*3000))]) 

data2 = np.asarray(data2) 

print data2 

scipy.io.wavfile.write('xenencounter_23sin3.wav',rate,data2) 

in này (cắt ngắn):

[[-2524 2728] 
[ -423 -2270] 
[ 2270 423] 
..., 
[-2524  0] 
[ 2524 -2728] 
[-2270 838]] 

Các tập tin wav mở và đóng trong Windows Media Player, ít nhất là định dạng thích hợp của nó. Tuy nhiên, khi mở nó bằng Audacity và nhìn vào từng mẫu riêng lẻ, tất cả chúng đều là 0, và ngay lập tức tập tin không phát ra âm thanh nào cả.

Điều tôi không hiểu là cách mảng numpy được liệt kê ở trên trở thành tất cả 0. Nó phải dưới giá trị tối đa cho một mẫu (hoặc cao hơn, nếu nó âm).

+0

điều gì sẽ xảy ra nếu bạn tải lại bằng scipy? là 0 hoặc giá trị bạn đã lưu? –

+0

Nó trả về cùng một thứ như nó được in trước khi viết. – JVE999

+0

Bạn có thể thêm câu lệnh 'print data' sau dòng' rate, data = scipy.io.wavfile.read ('xenencounter_23.wav') '. Tôi muốn xem dữ liệu đó trông như thế nào. –

Trả lời

11

Tôi đã tìm thấy scipy.io.wavfile.write() ghi trong số nguyên 16 bit, giải thích kích thước tệp lớn hơn khi cố gắng sử dụng số nguyên 32 bit (mặc định) thay thế. Trong khi tôi không thể tìm thấy một cách để thay đổi điều này trong wavfile.write, tôi đã tìm thấy rằng bằng cách thay đổi:

data2 = np.asarray(data2) 

để

data2 = np.asarray(data2, dtype=np.int16) 

tôi có thể viết một tập tin làm việc.

+0

Điều này cũng khắc phục được sự cố của tôi. Sẽ được tốt đẹp cho scipy để lưu ý điều này trong các tài liệu mặc dù: S – TTT

0

Khi bạn phát hiện ra bằng cách in ra đầu ra tại các điểm khác nhau và lưu lại những gì bạn đã tải ban đầu, dòng data2.append([int(round(math.sin(data[i][0])*3000)), int(round(math.sin(data[i][1])*3000))]) là nguồn gốc của sự cố.

Tôi nghi ngờ rằng 3000 quá lớn so với biên độ. Hãy thử 1.

+0

Nó đã làm điều tương tự. Tôi nghĩ rằng giá trị mẫu giữa -32768 và 32767 nên được sử dụng tốt. – JVE999

+0

Thử 'data2.append ([int (dữ liệu [i] [0]), [int (dữ liệu [i] [1])])' - không may là bạn cần phải loại bỏ mọi thứ cho đến khi bạn phát hiện ra chức năng phá vỡ mã của bạn . –

+0

Điều đó cũng giống vậy. Tôi hiểu dữ liệu tệp sóng được lưu trữ dưới dạng số bổ sung của hai cho mỗi mẫu. Tôi không biết liệu điều đó có tạo nên sự khác biệt hay không. Nó không in dưới dạng số bổ sung của hai, vì vậy tôi hình dung chuyển đổi đó là trong wavefile.viết – JVE999

1

Khi tạo tệp wav thông qua scipy.io.wavfile.write(), tôi thấy rằng biên độ là rất quan trọng. nếu bạn tạo ra một làn sóng sin với biên độ 150, nó có vẻ như im lặng khi chơi trong VLC. nếu biên độ là 100, nó có vẻ giống như một làn sóng sin bị bóp méo, và nếu bạn làm cho nó 80, nó bắt đầu âm thanh như một tập tin bình thường.

Chắc chắn phải cẩn thận về biên độ khi tạo tệp sóng, nhưng không rõ ràng với tôi ngay lúc này mức tối đa là gì trước khi bắt đầu cắt hoặc biến mất.