Как стать автором
Обновить

Комментарии 39

нарисовать фолну

Поправьте в первом предложении.
Почему вы не пользуетесь ПМ?
Потому что автор не пользуется проверкой орфографии в браузере.
Почему struct.unpack не пользовали, а нампи?
Да, можно парсить через struct, не спорю. Но я где-то читал (к сожалению, не помню, где), что mathplotlib заточена под numpy, выше производительность по сравнению со стандартными списками. И кроме того, если со звуком будут выполняться какие-либо манипуляции (нормализация, фильтры, компрессия, преобразования Фурье), то лучше numpy-массивов ничего лучше быть не может.
Да, в том и дело, что в numpy массивы, а не списки. А массивы и существуют для обработки больших данных однородной информации. Кстати, вы повторяете ошибку и в статье, и в этом комментарии: Matplotlib пишется без h.
Меня топик чем-то зацепил, наверное я бессознательно тоже хочу waveform-ы на python рисовать :)
Интересно, что-то из готового пробовали приспособить?
С ходу гуглится такое и вот такое.
А еще scipy.io.wavfile.read.
Да, тем более что scipy.io.wavfile как раз возвращает numpy array.
Пробывал scipy.io.wavfile, у меня почему-то выдавало ошибку на некоторых файлах. Решил отложить scipy на потом.
Спасибо!
P.S: В скрипте удалите «r» в первом param:
wav = wave.open(r«music.wav», mode=«r»)
и в четвертом абзаце
а xe3\xfа — второго (правого).
Хороший выбор средств.

А вообще мне очень нравится, что с wave работать легко и просто, например нормально (для любых wav) повернуть звук задом наперёд занимает всего примерно 10 строк.
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
В модуле wave есть класс для записи wav-файла. В гугле можно найти примеры, как генерируют вейвы с шумом на основе random. А как читать звук с девайсов, к сожалению, не знаю.
Читать можно, например, с помощью pymedia.audio.sound. В tutorial есть пример voice recoder.
440 гц :) = до, вроде так, не помню уже
там кучу гармоник еще делать, звучание струны + отражения других струн ну и реверберация внутри коробки.
Забейте, в наше время хиты делаются коктейлем white trash poser + autotune
вроде 440гц — это ля первой октавы.
Интересно, а звук в питоне получать со звуковухи можно? То есть, реально ли написать, например, тюнер с помощью каких-то уже реально существующих библиотек, как это сделано тут?
Конечно, можно. Например, с помощью pymedia.
Спасибо, попробую поковыряться, всегда было интересно что-нибудь такое написать
Можно вроде GStreamer pygst модуль зовется. Правда под win вроде не очень работает.
НЛО прилетело и опубликовало эту надпись здесь
Конечно, я сверял график с другими программами.
Изображение с программы SoundBooth:


Мой график:


Видимо, меня подвел коэфициент k для прореживания графика. Чем он больше (ближе к числу сэмплов), тем лучше график.
Обновил код с новым коэффициентом.
ток акуратнее, на коротеньких файлах коэффициент может стать 0 а это вызовет ValueError: slice step cannot be zero
Слушайте, в этом скрипте нужно загружать весь файл в память… Соответственно очень большие файлы так не обработаешь ибо память закончится.

Можно-ли как то переделать на потоковую обработку? Считывать и обрабатывать пофреймово допустим...?
content = wav.readframes(nframes)
прочтите сколько надо фреймов, меняйте переменную nframes под количество байт в нем, читайте, принудительно удаляйте объекты или перезаписывайте буфер content.
Это я заметил, но мне кажется что будут проблемы с калибровкой высоты графика, ведь нужно макс. амплитуду знать чтобы разрешение по Y оси задать…
Можно в 2 прохода сделать конечно, но не очень приятная перспектива.
НЛО прилетело и опубликовало эту надпись здесь
256^sampwidth чтоль? Переменная peak?
Если да, то ок, принимается. (Что за магическая константа 256?)

Хотя исходный скрипт довольно сильно переделывать придется. Надо будет заняться на досуге.

А matplotlib умеет данные по кусочкам принимать? (хотя после разрежения channel = channel[0::k] там объем данных очень сильно сократится, так что главное ДО процедуры разрежения все потоково проделать)

Да, надо будет заняться на досуге…
peak — это пиковое значение амплитуды. Зная, сколько байт выделяется под один сэмпл, можно высчитать ее максимальное значение: 256 (макс. амплитуда для 1 байта) возвести в степень числа байт на сэмпл и разделить пополам.
А по поводу чтения по кусочкам — совершенно верно, но это уже дальнейшая оптимизация.
А есть возможность получить громкость в дб в определённый момент времени? Грубо говоря сделать цикл от 0 сек до 60 сек?
Функция format_db, приведенная в коде, возвращает громкость в децибелах по амплитуде.
По коду похоже, что внутри конкретного фрейма и канала цифры обозначают только амплитуду. Как (и где) тогда в wav-файле хранится распределение по частотам?
Распределение по частотам нигде не хранится, эти данные извлекаются аналитически. Сейчас работаю над этим.
Гуглите по словам «wave frequency analyze»
Не гуглил, но кажется понял. У нас распределение по частотам образуется изменением амплитуды во времени (по фреймам). То есть, если нам нужна скажем одна волна частотой 1КГц, мы можем завести по 2000 фреймов в секунду и в каждом фрейме менять знак амплитуды. Так можно задать произвольную комбинацию волн, складывая амплитуды, соответствующие каждой волне, в каждом фрейме (а получить волны «обратно» можно каким-нибудь преобразованием Фурье).
А вы пробовали работать с 24-битными файлами? python.wave ведет себя странно — sample width == 3, но len(sample.readframes(1)) == 6

Похоже на баг библиотеки
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации