2013-09-05 21 views
10

mam ten kod:Zapisywanie pliku wav w Pythonie z wavfile.write od 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) 

Drukuje (obcięty):

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

Plik wav otwiera się i odtwarza w programie Windows Media Player więc przynajmniej jego właściwy format. Jednak po otwarciu z Audacity i przejrzeniu poszczególnych próbek, wszystkie mają wartość 0, a plik nie odtwarza w ogóle żadnego dźwięku.

To, czego nie rozumiem, to to, jak powyższa tablica numpy jest wymieniona powyżej. Powinien być poniżej maksymalnej wartości dla próbki (lub powyżej, jeśli jest ujemny).

+0

co się stanie, jeśli załadujesz go ponownie scipy? to są zera lub zapisane wartości? –

+0

Powraca to samo, co wydrukowano przed zapisaniem. – JVE999

+0

Czy możesz dodać instrukcję 'print data' po linii' rate, data = scipy.io.wavfile.read ('xenencounter_23.wav') '. Chcę zobaczyć, jak wyglądają te dane. –

Odpowiedz

11

Znalazłem, że scipy.io.wavfile.write() zapisuje w 16-bitowej liczbie całkowitej, co wyjaśnia większe rozmiary plików, próbując zamiast tego używać 32-bitowej liczby całkowitej (domyślnie). Chociaż nie mogłem znaleźć sposób, aby to zmienić w wavfile.write, znalazłem, że zmiana:

data2 = np.asarray(data2) 

do

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

mógłbym napisać plik roboczy.

+0

Naprawiłem również mój problem. Byłoby miło, gdyby Scipy zauważył to w dokumentach: S – TTT

0

Jak odkryłeś, drukując dane wyjściowe w różnych punktach i ponownie zapisując to, co pierwotnie załadowano, przyczyną problemu jest linia data2.append([int(round(math.sin(data[i][0])*3000)), int(round(math.sin(data[i][1])*3000))]).

Podejrzewam, że 3000 jest za duży z amplitudy. Wypróbuj 1.

+0

Zrobiło to samo. Myślę, że wartości przykładowe od -32768 do 32767 powinny być w porządku. – JVE999

+0

Wypróbuj 'data2.append ([int (data [i] [0]), [int (data [i] [1])])' - niestety musisz ciągle eliminować rzeczy, dopóki nie odkryjesz funkcji, która łamie twój kod . –

+0

To samo. Rozumiem, że dane pliku wave są przechowywane jako liczba uzupełniająca dla dwóch próbek na każdą próbkę. Nie wiem, czy to by miało znaczenie. To nie jest drukowane jako liczba uzupełniająca dwóch, więc myślę, że konwersja jest w wavefile.napisz – JVE999

1

Podczas tworzenia plików wav poprzez scipy.io.wavfile.write(), stwierdziłem, że amplituda jest bardzo ważna. jeśli tworzymy falę sinusoidalną z amplitudą 150, to brzmi jak cisza, gdy gra się w VLC. jeśli amplituda wynosi 100, brzmi jak zniekształcona fala sinusoidalna, a jeśli ją ustawisz na 80, zaczyna brzmieć jak normalny plik.

Zdecydowanie trzeba uważać na amplitudę podczas tworzenia plików wave, ale nie jest dla mnie jasne, jaki jest maksymalny poziom, zanim zacznie przycinać lub znikać.