Пакетное распознавание аудио и видео в текст

Ниже описана пошаговая инструкция по массовому распознаванию голоса (транскрибации) аудио- и видеофайлов в текст с помощью Vosk на Ubuntu 22. Сразу (субъективно) отмечу, что качество распознавания очень хорошее; проблемы присутствуют в тех случаях, когда голос неразборчив или плохое качество записи.

Итак, в наличии «чистая» Ubuntu Server 22.04. Обновляем репозитарии и ставим зависимости:

sudo apt update
sudo apt install -y python3 python3-pip ffmpeg unzip rename

Устанавливаем VOSK:

sudo pip3 install vosk

Скачиваем и распаковываем актуальную модель для распознавания голоса:

wget https://alphacephei.com/vosk/models/vosk-model-ru-0.22.zip
unzip vosk-model-ru-0.22.zip

Синтаксис vosk:

vosk-transcriber -i имя_исходного_файла -o имя_текстового_файла -m путь_к_папке_модели
vosk-transcriber -i test.mp3 -o test.txt -m vosk-model-ru-0.22/

Для пакетной конвертации файлов я набросал небольшой bash-скрипт.

touch transcribe.sh
chmod +x transcribe.sh
nano transcribe.sh
#!/bin/bash

errmsg="USAGE: sh transcribe.sh SRCPATH DSTPATH VOSKMODELPATH"

if [ $1 ]; then
    srcpath=$1
    echo "SOURCE PATH: $srcpath"
else
    echo "No source path entered" >&2
    echo $errmsg
    exit 2
fi

if [ $2 ]; then
    dstpath=$2
    echo "DESTINATION PATH: $dstpath"
else
    echo "No destination path entered" >&2
    echo $errmsg
    exit 2
fi

if [ $3 ]; then
    modelpath=$3
    echo "VOSK MODEL PATH: $modelpath"
else
    echo "No VOSK language model path entered" >&2
    echo $errmsg
    exit 2
fi

startdate=$(date)

find $srcpath -name "* *" -type f  | rename 's/ /_/g' ## удаляем пробелы из названий файлов в целевой директории
famount=$(find $srcpath -type f | wc -l) ## считаем количество файлов
echo "Found $famount files"
i=0;

for f in $srcpath/*; do 
	i=$(( $i + 1 ))
	echo "Transcribing ${f##*/} ($i/$famount)"  
	vosk-transcriber -m $modelpath -i $srcpath/${f##*/} -o $dstpath/${f##*/}.txt >/dev/null 2>&1 ; ## удалите >/dev/null 2>&1 для вывода статуса распознавания
	## rm $srcpath/${f##*/} ## раскоментируйте для удаления исходного файла
done

fready=$(find $dstpath -type f | wc -l)
echo "DONE. Transcribed $fready of $famount files"
enddate=$(date)
echo STARTED AT: ${startdate}
echo ENDED AT: ${enddate}

Будьте внимательны, в директории скрипт попытается транскрибировать все файлы в исходной директории. Синтаксис:

sh transcribe.sh путь_к_папке_с_исходными_файлами путь_к_целевой_папке путь_к_папке_модели
sh transcribe.sh audio/ text/ vosk-model-ru-0.22/

Что касается скорости распознавания — полноценных испытаний не проводил, однако моё тестирование транскрибации 700 mp3-файлов (32kbit) общим весом 300 мб заняло около 8 часов на машине с 6 vCPU 2.6 ггц и 12 гб ОЗУ.

Один комментарий

Оставить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *