Тестовое задание для весенней практики JetBrains «Разметка облаков точек и mesh для оценки геометрических характеристик объектов (JBR)»
Данное приложение на Python 3 служит для обработки аудио файлов. Решение удовлетворяет следующим требованиям:
- режим склеивания произвольного количества аудиофайлов в один;
- режим нарезки входного файла по списку интервалов;
- режим нарезки входного файла на куски по списку тайм-кодов;
- режим инвертирования входного файла;
- присутствует образ Docker.
В системе должен быть установлен интерпретатор Python 3.9. Для работы с аудио файлами приложение использует библиотеку pydub версии 0.25.0. Можно установить зависимости из requirements.txt или из Pipfile, если использовать Pipenv. Исполняемый файл находится в скрипте simple_audio_processor.py.
Важно: работать с .wav файлами можно без каких-либо зависимостей, а если хочется иметь поддержку других расширений, то следует поставить ffmpeg или libav:
apt-get install ffmpeg libavcodec-extra
# или
apt-get install libav-tools libavcodec-extra
Dockerfile написан с использованием легковестной init-системой tini.
Сначала склоним репозиторий с проектом:
git clone https://github.com/madoka-wizard/jbr_mesh_practice_test_problem.git \
&& cd jbr_mesh_practice_test_problem
Теперь можно собрать Docker образ:
docker build -t simple_audio_processor .
Работать с ним очень просто. Нужно примонтировать в /data
директорию, в которой мы будем работать (где лежат файлы,
которые мы хотим процессить) и сказать, чтобы Docker писал из образа файлы как текущий пользователь:
docker run -v WORK_DIR:/data --user 1000:1000 simple_audio_processor ...
Пример команды, которая склеит файл a.mp3 с файлом b.mp3 в файл c.mp3, лежащие в /home/user/music:
docker run -v /home/user/music:/data --user 1000:1000 simple_audio_processor concat a.mp3 b.mp3 c.mp3
usage: simple_audio_processor.py [-h] COMMAND ...
Задавать имена файлов нужно вместе с раширением, например: a.mp3
.
Поддерживаются любые форматы, которые поддерживает FFmpeg,
Если на системе установлен FFmpeg, то их можно посмотреть с помощью компанды ffmpeg -formats
.
Список доступных операций с аудио файлами:
- Конкатенация произвольного количества аудио файлов (возможно с различными расширениями) в один:
usage: simple_audio_processor.py concat [-h] INPUT_FILE [INPUT_FILE ...] OUTPUT_FILE
- Вырезание из аудио файла произвольного числа интервалов (возможно пересекающихся).
Список интервалы передается последним аргументом, указывающим на путь текстового файла,
содержащего по одному интервалу в каждой своей строке. Интервалы записываются в формате
START-END
, гдеSTART
иEND
— моменты времени с начала звуковой дорожки в форматеhh:mm:ss.SSS
или целое число — количество миллисекунд с начала трека. На выходе получим набор файлов в директории, из которой вызывался скрипт, соответствующий списку интервалов. Кi
-му файлу перед расширением будет добавлен префикс_i
(нумерация с 1).
simple_audio_processor.py cut [-h] INPUT_FILE INTERVALS_FILE
- Разбиение входного файла на куски по тайм-кодам. Список тайм-кодов передается последним аргументом,
указывающим на путь текстового файла, содержащего по одному тайм-коду в каждой своей строке. Тайм-коды записываются
в формате
hh:mm:ss.SSS
или целое число — количество миллисекунд с начала трека. На выходе получим набор файлов в директории, из которой вызывался скрипт, соответствующий списку тайм-кодов (списку изn
тайм-кодов соответствуютn + 1
фрагментов). Кi
-му файлу перед расширением будет добавлен префикс_i
(нумерация с 1).
usage: simple_audio_processor.py ts [-h] INPUT_FILE TS_FILE
- Инвертирование входного файла. Опционально передается аргумент
--out
с именем выходного файла (если опустить аргумент, то в качестве имени будет взято исходное имя с префиксом_reversed
перед расширением).
usage: simple_audio_processor.py reverse [-h] [--out OUTPUT_FILE] INPUT_FILE