создание wav-файла и запись его на диск с помощью scipy

Я хочу разобрать волновой файл на небольшие фрагменты, собрать его в другом порядке и затем записать на диск. Кажется, у меня возникли проблемы с его написанием после повторной сборки частей, поэтому сейчас я просто пытаюсь отладить этот раздел, а об остальном позабочусь позже. В основном я читаю исходный wav в двумерный массив numpy, разбиваю его на 100 частей, хранящихся в списке меньших 2D-массивов numpy, а затем складываю эти массивы вертикально, используя vstack:

import scipy.io.wavfile as sciwav
import numpy
[sr,stereo_data] = sciwav.read('filename')
nparts = 100
stereo_parts = list()
part_length = len(stereo_data) / nparts 

for i in range(nparts):
    start = i*part_length
    end = (i+1)*part_length
    stereo_parts.append(stereo_data[start:end])

new_data = numpy.array([0,0])
for i in range(nparts):
    new_data = numpy.vstack([new_data, stereo_parts[i]])
sciwav.write('new_filename', sr, new_data)

На данный момент я убедился, что new_data похож на стереоданные с двумя исключениями: 1. в начале добавлено [0,0]. 2. Он на 88 сэмплов короче, потому что len(stereo_data)/nparts не делится без остатка.

Когда я пытаюсь прослушать результирующий файл eave new_data, все, что я слышу, это тишина, что, как мне кажется, не имеет особого смысла.

Спасибо за помощь! омер


person Omer Eilam    schedule 03.07.2013    source источник
comment
Каковы формы stereo_data и new_data?   -  person Jaime    schedule 03.07.2013


Ответы (1)


Очень вероятно, что dtype отличается. Когда вы создаете нули для заполнения в начале, вы не указываете dtype, поэтому они, вероятно, np.int32. Ваши исходные данные, вероятно, np.uint8или np.uint16, поэтому весь массив повышается до np.int32, что не соответствует разрядности ваших данных. Просто сделайте:

new_data = numpy.array([0,0], dtype=stereo_data)

Я бы на самом деле предпочел сделать:

new_data = numpy.zeros((1, 2), dtype=stereo_data.dtype)

Кстати, вы могли бы немного упростить свой код и избавиться от большого количества циклов for:

sr, stereo_data = sciwav.read('filename')
nparts = 100
part_length = len(stereo_data) // nparts 

stereo_parts = numpy.split(stereo_data[:part_length*nparts], nparts)

new_data = numpy.vstack([numpy.zeros((1, 2), dtype=stereo_data.dtype)] +
                        stereo_parts)

sciwav.write('new_filename', sr, new_data)
person Jaime    schedule 03.07.2013