Транскрибация в Linux + lifehack

в 11:46, , рубрики: bash, lifehack, звук, Программирование, Софт, фриланс
Скрипт работает
Скрипт работает

Нет, это не ругательное слово (для тех, кто не в курсе). Транскрибация это перевод голоса в текст.

На протяжении нескольких лет я подрабатывал этим делом. Титры для видео (использовал subtitle editor), интервью, доклады, проповеди и т. п. По заказам речь переводил в текст.

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

Тем не менее существенно облегчить труд может творческое отношение к процессу.

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

При записи текста обычно требуется указывать этот самый тайминг.

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

Это существенно помогает ориентироваться в тексте и в аудио записи.

При необходимости по тексту легко определить место в записи, чтобы перейти к нему для уточнения.

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

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

Это средство обыкновенный терминал и bash (Одна из наиболее популярных современных разновидностей командной оболочки UNIX).

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

Вот фрагмент работы:

0:15:30 !

Дадим же Богу возможность в нашей жизни действовать. Действовать через нас, через нашу жизнь, через наши слова, через наши поступки.

0:15:45 !

Сделаемся и мы его орудием для того чтобы ещё хоть кого-то обратить к Богу. Во всём этом пусть каждому из нас Господь поможет

0:16:00 !

и укрепит в наших желаниях. Аминь.

0:16:15 !

- - -

=282.75 ₽.

Скрипт определяет стоимость работы исходя из расценки 17 р/мин. Эта цена настраивается в строке 65 указанием цены за 15 секунд.

MON1=$(bc <<< "$TIMING*0.26016")

Содержание файла:

#!/bin/bash
##Создание формы для транскрибации
## 15 р / мин 0,216666667 р/ сек.
#
#
echo "Запускается перетаскиванием исполняемого файла и акдиофайла в окно терминала, открытого в рабочем каталоге."
echo "Из исходного видео или аудио извлекает фрагменты в формата opus по 15 сек."
echo "и записывает пустые строки [имя аудио].txt"
echo "Временные файлы удаляются автоматически"


F_NAME_FULL1=$1
echo $F_NAME_FULL1
##sleep 5
EXT=${F_NAME_FULL1##*.}
BNAME=`basename "$F_NAME_FULL1" ".$EXT"`
F_NAME_FULL="./"$BNAME"."$EXT

echo $BNAME

##sleep 2


TIME_R=15


######################################
## Преобразование входного файла в формат OPUS для расшифровки

ffmpeg -i $F_NAME_FULL -vn -c:a libopus audio.opus && ffmpeg -i ./audio.opus -f segment -segment_time $TIME_R  -acodec copy "%03d.ogg"

##sleep 1
rm ./audio.opus

## Проверка наличия файла для расшифровки
RASH=".ogg"
NNN=0
FILE1=$F_NAME_PREF$(printf '%03d' $NNN)$RASH
echo $FILE1
while [ -f "$FILE1" ]

do
    ## echo $FILE1
    echo "Есть"

    ## Распознавание
    ################################
    PREF="@"
    FILE2=$PREF$FILE1
    echo $FILE2


(echo "X")>>./text_1.txt

    ## Контролируем процесс 
    ################################
    rm $FILE1
    NNN=$[1+$NNN]
    ## Добавляем пустую строку с номером минуты.
    TIMING=$(($NNN*$TIME_R))

## расходы
############################################

MON1=$(bc <<< "$TIMING*0.26016")
##MON1=$(bc <<< "$TIMING*0.27")
MON==$(echo "scale=2;$MON1/1" |bc)
printf -v ts '%d:%02d:%02d' `expr $TIMING / 3600` `expr $TIMING / 60` `expr $TIMING % 60`

    echo " $ts ! "  >> ./text_1.txt
###########################################

    FILE1=$F_NAME_PREF$(printf '%03d' $NNN)$RASH

   ## sleep 1

done
echo " - - - ">>./text_1.txt
echo ${MON} " ₽. ">>./text_1.txt
echo " 0:00:00 !">'./'$BNAME'.txt'
echo  -e «n+++» | cat ./text_1.txt>>'./'$BNAME'.txt'
##echo  | cat ./text_1.txt>>'./'$BNAME'.txt'
clear
################################

rm ./text_1.txt

## mm.ss
TIME_CODE="0:00:00"
TIME_CODE_str=$"("$TIME_CODE$")"

Имя файла любое допустимое, например write-speech-form.

Достаточно открыть окно терминала из каталога где лежит аудио файл и скрипт, перетащить мышью файл скрипта и аудио файл в окно терминала, нажать <Enter>. Имя аудио файла не должно содержать пробелов и лишних точек, должны быть установлены права на выполнение. Я именую обычно датой или временем 20_59_19.mp3.

Через несколько секунд в каталоге появится текстовая форма разграфка с ценой работы.

При необходимости автоматически проставленные тайминги можно удалить или заменить на более редкие.

В процессе работы скрипт разбирает исходный файл на фрагменты. Это можно использовать для анализа фрагментов и решении других задач автоматизации. Раньше мной это использовалось для отправки фрагментов Яндексу для дешифровки.

Автор: Александр Поляк-Брагинский

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js