Ниже описана пошаговая инструкция по массовому распознаванию голоса (транскрибации) аудио- и видеофайлов в текст с помощью 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 гб ОЗУ.
Спасибо за статью! Очень доступно, как раз пригодилось 🙏🏼