Pull to refresh

Comments 4

Рискую быть обвинен в занудстве, но есть несколько вопросов/предложений:

>Обычно работа по транскрибации оплачивается по времени записи. Было бы удобно сразу после завершения работы видеть и сумму, которую вам должен будет заплатить заказчик.
>Скрипт определяет стоимость работы исходя из расценки 17 р/мин. Эта цена настраивается в строке 65 указанием цены за 15 секунд.

Почему бы сразу не взять длительность файла в минутах (с округлением вверх) и не умножить ее на 17? Весь блок кода будет заменен одной строкой, не будет дробных чисел, и в целом всё будет сильно читабельнее.

>Имя аудио файла не должно содержать пробелов и лишних точек

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

Я попробовал запустить скрипт, и получил чистый экран терминала. Предварительно вывалилась какая-то ошибка (ffmpeg вроде). И ничего больше. В целом-то понятно, что ему нужно передать какой-то аргумент, но сам скрипт ничего не ответил на эту тему. Хорошей практикой будет сделать проверку на наличие аргумента, и в случае его отсутствия выдать usage. Вы же сами, если какое-то время не будете пользоваться своей наработкой - забудете/запутаетесь. Придется открывать код и вспоминать. Так вы еще и презентуете это, а раз так - то неплохо бы сделать хорошо :)

В принципе очень много беспорядка в коде. Лишние комментарии, лишние пробелы, отступы, неочевидные конструкции, общая "неоднородность" кода. Например, что делает команда эта команда?

echo  -e «\n+++» | cat ./text_1.txt>>'./'$BNAME'.txt'

А точнее ее первая часть. Зачем она тут нужна? Зачем столько лишних символов во второй части? cat text_1.txt >> $BNAME.txt сработает так же. А cat file >> "${BNAME}.txt" еще и без проблем сработает при файле с пробелом.

Почему в каких-то случаях использована конструкция $(command) а в каких-то `command`? Рекомендации к использованию парных скобок $() давно описаны, их легче дебажить, чем непарные ``. Почему переменные стилистически используются по-разному? Когда ${var}, когда $var. Есть понимание, или это "от балды"? Зачем конструкции типа F_NAME_FULL="./"$BNAME"."$EXT, если ее заменит F_NAME_FULL=$BNAME.$EXT? Если хочется извращаться с точка-слеш перед названием файла (хотя нужно понять зачем это делать) - то хватит "./${BNAME}.${EXT}". Возможно ли все "математические" операции привести к одному виду, что бы использовать что-то одно из expr, bc, $(())? Конструкция (echo "X")>>./text_1.txt вообще феерична :) Зачем грузить во временные файлы всё, если можно грузить в память? В случае если скрипт сломается посредине (или будет остановлен) - хотя бы не останется кучки мусора. В конце концов зачем clear в конце? Может я логи почитать хочу :) без tmux'а я бы этого сделать не смог.

Мне кажется, что если навести порядок в коде - статья уже будет иметь большую ценность, хотя бы с точки зрения самообразования автора.

В заключение: при всей моей любви к башу в целом, при тысячах строк написанных мною в собственных баш-портянках - сегодня подобное я бы стал делать только если хочется потренировать непосредственно баш. Если бы мне нужно было решать задачу - я бы, вероятнее, взял пайтон, начал с малого, но двигался бы в сторону автоматического определения наличия разговора в определенном временном диапазоне, динамическое создание таких временных диапазонов, и, возможно, автоматический перевод аудио в текст. После чего просто подредактировать тайминги там, где это нужно и отдать корректору (или самому) на корректирование ошибок автоматического преобразования. А может быть в сторону интерактивности, где после определения временного диапазона этот диапазон проигрывается в цикле, а в окошке есть возможность сразу редактировать временной интервал и "распознанный" текст. На сегодняшний день это звучит вполне реальной задачей.

Если бы мне нужно было решать задачу — я бы, вероятнее, взял пайтон

Я не программист. Задачи решал по большей части готовыми средствами. Когда начал пробовать яндексовские сервисы по переводу голоса в текст, пришлось создать скрипт по описанию на Яндексе. Позднее выяснилось, что сервисы мало помогают, а доработанный скрипт может быть полезен и без них.
Недавно пришёл случайный заказ (давно уже не занимаюсь этим специально) и скрипт помог его оперативно выполнить. Раз он помог мне, может помочь и другим.
Относительно Python, могу сказать, что иногда обращаюсь и к нему. Но Bash на компах всегда в рабочем состоянии. Не надо ничего подгружать. И если надо решить задачу не программисту, то это вполне годный инструмент.
Если уж вы потратили столько сил на свой комментарий, видимо Вас заинтересовал вопрос. Никто не мешает реализовать ваши идеи на Python или даже на C.
Удачи.

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

#!/bin/bash

if [ -z "${1}" ]; then
    echo "use script with filename as argument"
    echo "example:"
    echo "  ./script.sh myfile.mp3"
    exit 1
fi

file=$1
COST=0.26016

dur=$(ffmpeg -i "${file}" 2>&1 | \
      grep Duration | \
      awk '{print $2}' | \
      awk -F '.' '{print $1}')
hh=$(echo $dur | awk -F ':' '{print $1}')
mm=$(echo $dur | awk -F ':' '{print $2}')
ss=$(echo $dur | awk -F ':' '{print $3}')
length_sec=$(bc <<< "($hh * 3600) + ($mm * 60) + $ss")

steps=$(bc <<< "$length_sec / 15 + 1")

for step in $(seq 0 $steps); do
    timing=$(TZ=GMT date -d @$(bc <<< "$step * 15") +'%H:%M:%S')
    [ $step -eq $steps ] && echo -e " ${timing} ! \n - - -" \
                         || echo -e " ${timing} ! \nX"
done

price=$(bc <<< "$length_sec * $COST")
printf "=%.2f P\n" $price

Сделал нарочито просто, без сокращений. Уверен, что можно написать красивее (но понимать "непрограммисту" будет сложнее). Знаю, что можно написать короче. Подозреваю, что мой код тоже не идеален, и его улучшать и улучшать.

Первый блок кода это usage - он не нужен для работы скрипта, но сильно помогает когда им делишься. Потом с помощью ffmpeg (который вы использовали) мы получаем длительность. Не понятно, зачем вы в вашем решении били на отрезки, зачем потом проверяли наличие отрезков. Это всё вычислительные ресурсы, которые не нужны. Дальше используя количество шагов мы просто выводим тайминги с нужным вам форматом. Всё. Если нужно решить конкретно вашу задачу - то даже такое решение уже сильно проще. Имхо, читаемее.

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

Из обязательного, что нашел через промежуток времени после написания комментария: нужно проверять на наличие файла перед ffmpeg. Если файла нет - выходить с указанием, что файл не найден.

Из необязательного, но было бы правильно: после ffmpeg'а и обрезания вывода проверить переменную dur на соответствие регулярному выражению.

Из вообще мелочей: их много, но больше всего меня беспокоит две. 1) заменить '%H:%M:%S' на '%T'; 2) Всё таки попробовать заменить все bc на $(()), если получится (лень проверять сейчас). Первое визуально сократит код, второе может сделать его быстрее, потому что вызов отдельного приложения - всегда накладные расходы и время. Одна только замена в вызове date после собаки на $(($step * 15)) - уже дает почти двухкратное увеличение скорости выполнения на небольшом файле (длительность 3:23):

# before: 
#   timing=$(TZ=GMT date -d @$(bc <<< "$step * 15") +'%H:%M:%S')
bash script2.sh fl.mp3  0.08s user 0.38s system 20% cpu 2.170 total

# after:
#   timing=$(TZ=GMT date -d @$(($step * 15)) +'%T')
bash script2.sh fl.mp3  0.05s user 0.19s system 19% cpu 1.200 total

# Для сравнения - скрипт из поста:
bash script.sh fl.mp3  2.09s user 0.66s system 43% cpu 6.295 total

Кстати, пока писал коммент - обнаружил, что скрипт автора выводит время сверху длительности файла. Т.е. мой файл 3:23, скрипт автора последним таймингом выводит 3:30. Я что бы этому соответствовать - добавил в вычисление steps +1. Его нужно убрать, потому что это, имхо, неверно.

Sign up to leave a comment.

Articles