Как я могу создать интерактивное отображение формы волны аудиофайла в стиле Audacity?Python

Программы на Python
Anonymous
Как я могу создать интерактивное отображение формы волны аудиофайла в стиле Audacity?

Сообщение Anonymous »

Я хочу иметь возможность загружать аудиофайл (например, с помощью PyDub), а затем отображать его образцы в виде сигнала. Однако я не хочу, чтобы этот сигнал был статичным — программа должна позволять мне произвольно увеличивать и уменьшать его масштаб. Кроме того, я хочу включить функционально базовое взаимодействие, которое позволит мне создать своего рода «маркер», который я смогу разместить в произвольной части звуковой дорожки, переместить ее ( перетаскивая его вокруг оси времени) и удаляйте по мере необходимости.
Конечно, эта программа требует некоторого дополнительного графического интерфейса, поэтому изначально я выбрал TkInter, поскольку включение Canvas казалось подходящим способом решить проблему рисования формы волны. Однако с этой опцией, похоже, есть некоторые проблемы:
  • Когда уровень масштабирования достигает отдельных сэмплов (например, масштабирование до нескольких миллисекунд дорожки ), их отображение должно отличаться от отображения при сжатии нескольких секунд/минут — точно так же, как в Audacity. Другими словами, небольшое количество выборок должно быть составлено другим способом. Поэтому функция Canvas .zoom(...) не подходит.
  • При масштабировании Если длинный аудиофайл (например, длительностью в час) составляет всего несколько миллисекунд, то абсолютно неэффективно визуализировать весь оставшийся фрагмент семпла. Поэтому я подумал о создании «статического» холста, который бы отображал только видимую часть звука. С помощью простой математики мне удалось это реализовать, и я мог прокручивать и масштабировать изображение по своему желанию. Проблема, однако, заключается в том, что по сути приходится перерисовывать холст каждый раз, когда я перемещаю полосу прокрутки или увеличиваю или уменьшаю масштаб. Судя по тому, что я читал, методы TkInter, такие как create_line(...), не являются «нарисовать и забыть» — вместо этого они каким-то образом «хранят» эти объекты, и при таком подходе они ужасно медленны и засоряют. память.
  • Подход «перерисовки», кажется, трудно сочетать с взаимодействием «маркера», о котором я упоминал ранее.
Как реализовать эту функциональность? Достижима ли эта цель с помощью TkInter, или у вас есть другие предложения по библиотекам?

Подробнее здесь: https://stackoverflow.com/questions/790 ... audio-file

Вернуться в «Python»