редактирование wav-файлов с помощью python

Между каждым словом в wav-файле у меня полная тишина (я проверил с Hex-мастерской, а тишина – 0).

Как я могу отрезать звук без молчания?

Я программирую с помощью python.

Благодаря!

6 Solutions collect form web for “редактирование wav-файлов с помощью python”

Python имеет модуль wav . Вы можете использовать его для открытия wav-файла для чтения и использования команды `getframes (1) 'для просмотра файла по кадре.

import wave w = wave.open('beeps.wav', 'r') for i in range(): frame = w.readframes(1) 

Возвращаемый кадр будет байтовой строкой с шестнадцатеричными значениями в ней. Если файл является стерео, результат будет выглядеть примерно так (4 байта):

 '\xe2\xff\xe2\xff' 

Если его моно, у него будет половина данных (2 байта):

 '\xe2\xff' 

Каждый канал имеет длину 2 байта, поскольку звук 16 бит. Если 8 бит, каждый канал будет только одним байтом. Вы можете использовать метод getsampwidth() чтобы определить это. Кроме того, getchannels() определит, является ли его моно или стерео.

Вы можете перебрать эти байты, чтобы увидеть, все ли они равны нулю, что означает, что оба канала молчат. В следующем примере я использую функцию ord() для преобразования шестнадцатеричных значений '\xe2' в целые числа.

 import wave w = wave.open('beeps.wav', 'r') for i in range(w.getnframes()): ### read 1 frame and the position will updated ### frame = w.readframes(1) all_zero = True for j in range(len(frame)): # check if amplitude is greater than 0 if ord(frame[j]) > 0: all_zero = False break if all_zero: # perform your cut here print 'silence found at frame %s' % w.tell() print 'silence found at second %s' % (w.tell()/w..getframerate()) 

Стоит отметить, что один кадр молчания необязательно обозначает пустое пространство, так как амплитуда может пересекать нормальные частоты 0-значных. Поэтому рекомендуется, чтобы определенное количество кадров в 0 наблюдалось до того, как решить, действительно ли регион, молчит.

Я занимаюсь некоторыми исследованиями по этой теме для проекта, над которым я работаю, и я столкнулся с несколькими проблемами с предоставленным решением, а именно, метод определения молчания неверен. «Более правильная» реализация будет:

 import struct import wave wave_file = wave.open("sound_file.wav", "r") for i in range(wave_file.getnframes()): # read a single frame and advance to next frame current_frame = wave_file.readframes(1) # check for silence silent = True # wave frame samples are stored in little endian** # this example works for a single channel 16-bit per sample encoding unpacked_signed_value = struct.unpack("<h", current_frame) # * if abs(unpacked_signed_value[0]) > 500: silent = False if silent: print "Frame %s is silent." % wave_file.tell() else print "Frame %s is not silent." % wave_file.tell() 

Ссылки и полезные ссылки

* Struct Unpacking будет полезен здесь: https://docs.python.org/2/library/struct.html

** Хорошая ссылка, которую я нашел, объясняя формат волновых файлов для работы с битовыми кодировками различного размера и несколькими каналами: http://www.piclist.com/techref/io/serial/midi/wave.html

Использование встроенной функции ord () в Python для первого элемента строкового объекта, возвращаемого методом readframes (x), будет работать некорректно.

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

Надеюсь, это поможет кому-то в будущем.

Вот некоторые из наиболее важных пунктов из ссылки, и то, что я нашел полезным.

Организация данных


Все данные хранятся в 8-битных байтах, расположенных в формате Intel 80×86 (т. Е. В небольшом концевом формате). Байты многобайтовых значений сначала сохраняются с младшими (то есть наименее значимыми) байтами. Биты данных следующие (т. Е. Показаны с номерами бит сверху):

  7 6 5 4 3 2 1 0 +-----------------------+ char: | lsb msb | +-----------------------+ 7 6 5 4 3 2 1 0 15 14 13 12 11 10 9 8 +-----------------------+-----------------------+ short: | lsb byte 0 | byte 1 msb | +-----------------------+-----------------------+ 7 6 5 4 3 2 1 0 15 14 13 12 11 10 9 8 23 22 21 20 19 18 17 16 31 30 29 28 27 26 25 24 +-----------------------+-----------------------+-----------------------+-----------------------+ long: | lsb byte 0 | byte 1 | byte 2 | byte 3 msb | +-----------------------+-----------------------+-----------------------+-----------------------+ 

Чередование


Для многоканальных звуков (например, стереосигнала) отдельные точки выборки из каждого канала чередуются. Например, предположите стереофонический (т. Е. 2-канальный) сигнал. Вместо того, чтобы сначала сохранить все точки выборки для левого канала, а затем сохранить все точки выборки для правого канала, вы «смешаете» образцы точек двух каналов вместе. Вы сохранили бы первую точку отсчета левого канала. Затем вы сохраните первую точку выборки для правильного канала. Затем вы сохраните вторую точку отсчета левого канала. Затем вы сохраните вторую точку выборки правильного канала и т. Д., Чередуя между сохранением следующей точки выборки для каждого канала. Это то, что подразумевается под чередованием данных; вы поочередно сохраняете следующую выборочную точку каждого из каналов, так что точки выборки, которые должны быть «воспроизведены» (т.е. отправлены на ЦАП) одновременно, сохраняются смежно.

См. Также Как редактировать исходные звуковые данные PCM без аудио-библиотеки?

У меня нет опыта с этим, но посмотрите на волновой модуль, присутствующий в стандартной библиотеке. Это может сделать то, что вы хотите. В противном случае вам придется прочитать файл как поток байтов, вырезать последовательности из 0-байтов (но вы не можете просто вырезать все 0-байты, поскольку это приведет к аннулированию файла …)

Возможно, вы захотите попробовать использовать sox , инструмент для обработки звука в командной строке. У него много режимов, один из них – silence :

тишина: удаляет тишину с начала, середины или конца звукового файла. Тишина – это нечто ниже определенного порога.

Он поддерживает несколько звуковых форматов, и это довольно быстро, поэтому синтаксический анализ больших файлов не должен быть проблемой.

Чтобы удалить тишину из середины файла, укажите below_periods который является отрицательным. Это значение затем обрабатывается как положительное значение и также используется для указания того, что эффект должен перезапустить обработку, как указано above_periods , что делает ее подходящей для удаления периодов молчания в середине звукового файла.

Однако я не нашел никакого python-здания для libsox, но вы можете использовать его, поскольку используете все программы командной строки в python (или вы можете переписать его – используйте источники sox для указания тогда).

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

Однако Python – отличный инструмент для такого рода задач. 🙁

Python - лучший язык программирования в мире.