Адаптация языковой модели vosk

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

Приветствую, Хабр. В данной статье хочу рассмотреть процесс добавления слов в языковую модель vosk'а. (vosk - библиотека для распознавания речи, в основе которой kaldi). В русском сегменте подобных статей нет, а которые есть - неактуальны, поэтому, думаю, будет полезно.

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

Процесс создания

Для удобства создаем директорию (в моем случае new-model), в которой мы будем работать, и переходим в нее. Теперь скачиваем родную малую русскую модель vosk'а, чтобы заменить в ней языковую модель, которая и отвечает за словарный запас. После скачивания разархивируем родную модель.

mkdir new-model && cd new-model
wget "ttps://alphacephei.com/vosk/models/vosk-model-small-ru-0.22.zip"
unzip vosk-model-small-ru-0.22.zip

Для генерации новой модели нам необходимо установить kaldi для необходимого инструментария.

git clone https://github.com/kaldi-asr/kaldi
cd kaldi

Далее нам нужно установить утилиты, для этого переходим в директорию kaldi/tools.

cd tools

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

extras/check.dependencies.sh

Устанавливаем основные утилиты, добавление маркера -j позволяет распараллелить задачу на указанное после маркера количество потоков.

make -j 4

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

extras/install_irstlm.sh
extras/install_opengrm.sh

Чтобы установить srilm при помощи штатного скрипта, необходимо указать свою почту, имя и организацию, но запросы с российских ip блокируются. Поэтому нужно будет вручную скачать srilm в директорию, где находитесь в данный момент (kaldi/tools).
А штатный скрипт нужно будет изменить на модифицированный. Исправленный отличается лишь вырезанным в начале блоком кода, отвечающим за отправление запроса на сервер srilm. Далее приведены первые строчки обновленного скрипта, после которых различий с изначальным скриптом нет:

#!/usr/bin/env bash

current_path=`pwd`
current_dir=`basename "$current_path"`

if [ "tools" != "$current_dir" ]; then
    echo "You should run this script in tools/ directory!!"
    exit 1
fi

if [ ! -d liblbfgs-1.10 ]; then
    echo Installing libLBFGS library to support MaxEnt LMs
    bash extras/install_liblbfgs.sh || exit 1
fi

! command -v gawk > /dev/null && \
   echo "GNU awk is not installed so SRILM will probably not work correctly: refusing to install" && exit 1;


mkdir -p srilm
cd srilm

if [ -f ../srilm.tgz ]; then
    tar -xvzf ../srilm.tgz || exit 1 # Old SRILM format
elif [ -f ../srilm.tar.gz ]; then
    tar -xvzf ../srilm.tar.gz || exit 1 # Changed format type from tgz to tar.gz
fi

...

После этого запускаем его установку.

extras/install_srilm.sh

Продолжаем собирать инструментарий, но уже в папке src. Переходим в нее.

cd ../src

Используем следующие команды для сборки. после -j количество поток, как и ранее.

./configure --shared
make depend -j 4
make -j 4

Выходим из src и отправляемся в директорию kaldi/egs/wsj/s5, в ней мы и будем работать:

cd ../egs/wsg/s5

Скачиваем исходные файлы нескомпилированной малой модели vosk'а и разархивируем ее.

wget "https://alphacephei.com/vosk/models/vosk-model-small-ru-0.22-compile.tar.gz"
tar -xf vosk-model-small-ru-0.22-compile.tar.gz

Копируем содержимое файла kaldi/tools/env.sh и вставляем в конец файла kaldi/egs/wsj/s5/path.sh, который только разархивировался из модели vosk'а. После этого kaldi/egs/wsj/s5/path.sh должен выглядеть примерно так:

export KALDI_ROOT=`pwd`/../../..
export PATH=$PWD/utils:$KALDI_ROOT/src/bin:$KALDI_ROOT/tools/openfst/bin:$KALDI_ROOT/src/fs>
export PATH=$KALDI_ROOT/tools/ngram-1.3.7/src/bin:$PATH
export LD_LIBRARY_PATH=$KALDI_ROOT/tools/openfst/lib/fst/
export LC_ALL=C

export PATH=/home/arch/model_disk/kaldi/tools/python:${PATH}
export IRSTLM=/home/arch/model_disk/kaldi/tools/irstlm
export PATH=${PATH}:${IRSTLM}/bin
export LIBLBFGS=/home/arch/model_disk/kaldi/tools/liblbfgs-1.10
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH:-}:${LIBLBFGS}/lib/.libs
export SRILM=/home/arch/model_disk/kaldi/tools/srilm
export PATH=${PATH}:${SRILM}/bin:${SRILM}/bin/i686-m64

Запускаем kaldi/egs/wsj/s5/path.sh, чтобы инициализировать пути к kaldi и его инструментарию.

./path.sh

Прописываем в файле kaldi/egs/wsj/s5/db/extra.txt словосочетания, которые вы хотите добавить в модель. Каждое словосочетание должно быть в новой строке и без знаков препинания, например

поставь эмоджи
открой фейсбук

В данном случае мы добавляем слова «эмоджи» и «фейсбук».

Также, скорее всего, вам понадобится установить python-библиотеку phonetisaurus для скрипта далее.

pip install phonetisaurus

И наконец запускаем kaldi/egs/wsj/s5/compile-graph.sh, который сгенерирует нам модифицированную модель.

./compile-graph.sh

Модель сгенерирована. Теперь копируем из директории kaldi/egs/wsj/s5/exp/tdnn/lgraph/ файлы Gr.fst и HCLr.fst и вставляем их в родную модель, которую скачали в самом начале.

cp -f exp/tdnn/lgraph/Gr.fst exp/tdnn/lgraph/HCLr.fst ../../../../vosk-model-small-ru-0.22-compile/graph/

После этого в папке vosk-model-small-ru-0.22 будет модель, способная распознавать добавленные нами слова.

Успехов, и всего наилучшего.

Источник: https://habr.com/ru/articles/735480/


Интересные статьи

Интересные статьи

Большие языковые модели (Large Language Model, LLM) сейчас у всех на слуху. Они привлекают внимание общественности своей, казалось бы, впечатляющей возможностью — составлять осмысленные текс...
Исследователь лаборатории криптографии компании «Криптонит» Кирилл Царегородцев (@kirtsar) сравнил разные подходы к оценке безопасности криптографических протоколов. В качестве примера он использовал ...
Привет, Хабр! Продолжаем нашу серию статей о суррогатном моделировании, на этот раз расскажем, как мы применили нейросети при создании сложных технических систем – приспособили GRU в качестве суррогат...
Привет!Меня зовут Коля, и я системный аналитик.В большинстве источников моделирование данных (в контексте создания приложений) рассматривается как последовательное создание трёх моделей данных - конце...
Порой люди обращаются к искусственному интеллекту не для того, чтобы заказать еду, найти подходящий фильм или решить какую-то ещё свою задачу, а для того, чтобы просто поболтать. Например, потому что ...