В этом уроке я покажу вам, как создать собственную ASR — систему автоматического распознавания речи за 15 минут (плюс-минус). Прежде чем двигаться дальше — чтобы создать ASR, вы должны иметь базовые знания
1. Python
2. Git
3. HuggingFace

Вот и все! Это все, что нам нужно. Мы можем углубиться в особенности модели трансформатора и в то, как она работает, но это не обязательно. Этот учебник должен работать для любого

Я покажу вам, как создать систему ASR с использованием двух разных алгоритмов: CTC (временная классификация коннекционистов) и Seq-2-Seq (последовательность к последовательности).

Я буду использовать набор данных Common Voice — открытый исходный код фонда Mozilla — просто потому, что к нему легко получить доступ, и каждый может просматривать данные.

Краткое введение в ASR — автоматическое распознавание речи, или ASR, — это использование технологии машинного обучения или искусственного интеллекта (ИИ) для преобразования человеческой речи в читаемый текст. Использование ASR устраняет узкие места транскрипции, которые в противном случае связаны с ручной расшифровкой акустических записей. Недавние достижения в ASR позволили достичь аналогичного коэффициента ошибок в словах (WER) при значительно меньшем объеме данных и меньшем времени обучения. Таким образом, существует значительный исследовательский интерес к расширению границ таких методов, как обучение с полуучителем (Чжан и др.), Обучение без учителя и совместное обучение без учителя и с учителем (Бай и др.).

Давайте начнем с создания каталога, а затем инициализируем в нем пустой репозиторий git.

mkdir asr-app 
cd asr-app 
git init 

Хорошо, теперь, когда мы это сделали, мы можем клонировать репозиторий трансформеров с github.

git clone https://github.com/huggingface/transformers.git
cd examples/pytorch/speech-recognition/
ls

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

pip install -r requirements.txt
pip install git+https://github.com/huggingface/transformers
# This step is important - it installs transformers directly from source

Теперь давайте запустим скрипт CTC для «tr» — это турецкий язык. У турецкого есть небольшой набор данных на Common Voice, поэтому он в основном используется в качестве отправной точки, чтобы показать, как мы можем точно настроить модель для нового языка.

python run_speech_recognition_ctc.py \
 --dataset_name="common_voice" \
 --model_name_or_path="facebook/wav2vec2-large-xlsr-53" \
 --dataset_config_name="tr" \
 --output_dir="./wav2vec2-common_voice-tr-demo" \ #Turkish language - you can do it for any!
 --overwrite_output_dir \
 --num_train_epochs="15" \
 --per_device_train_batch_size="16" \
 --gradient_accumulation_steps="2" \
 --learning_rate="3e-4" \
 --warmup_steps="500" \
 --evaluation_strategy="steps" \
 --text_column_name="sentence" \
 --length_column_name="input_length" \
 --save_steps="400" \
 --eval_steps="100" \
 --layerdrop="0.0" \
 --save_total_limit="3" \
 --freeze_feature_encoder \
 --gradient_checkpointing \
 --chars_to_ignore , ? . ! - \; \: \" “ % ‘ ” � \
 --fp16 \
 --group_by_length \
 --push_to_hub \
 --do_train --do_eval 

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

  --dataset_name DATASET_NAME
                        The name of the dataset to use (via the datasets library). (default: None)
  --dataset_config_name DATASET_CONFIG_NAME
                        The configuration name of the dataset to use (via the datasets library). (default: None)
  --overwrite_cache [OVERWRITE_CACHE]
                        Overwrite the cached training and evaluation sets (default: False)
  --preprocessing_num_workers PREPROCESSING_NUM_WORKERS
                        The number of processes to use for the preprocessing. (default: None)
  --max_train_samples MAX_TRAIN_SAMPLES
                        For debugging purposes or quicker training, truncate the number of training examples to this value if set. (default: None)
  --max_eval_samples MAX_EVAL_SAMPLES
                        For debugging purposes or quicker training, truncate the number of evaluation examples to this value if set. (default: None)
  --audio_column_name AUDIO_COLUMN_NAME
                        The name of the dataset column containing the audio data. Defaults to 'audio' (default: audio)
  --text_column_name TEXT_COLUMN_NAME
                        The name of the dataset column containing the text data. Defaults to 'text' (default: text)
  --max_duration_in_seconds MAX_DURATION_IN_SECONDS
                        Truncate audio files that are longer than `max_duration_in_seconds` seconds to 'max_duration_in_seconds` (default: 20.0)
  --min_duration_in_seconds MIN_DURATION_IN_SECONDS
                        Filter audio files that are shorter than `min_duration_in_seconds` seconds (default: 0.0)
  --preprocessing_only [PREPROCESSING_ONLY]
                        Whether to only do data preprocessing and skip training. This is especially useful when data preprocessing errors out in distributed training due to timeout. In this case, one should run the
                        preprocessing in a non-distributed setup with `preprocessing_only=True` so that the cached datasets can consequently be loaded in distributed training (default: False)
  --train_split_name TRAIN_SPLIT_NAME
                        The name of the training data set split to use (via the datasets library). Defaults to 'train' (default: train)
  --eval_split_name EVAL_SPLIT_NAME
                        The name of the training data set split to use (via the datasets library). Defaults to 'train' (default: test)
  --do_lower_case [DO_LOWER_CASE]
                        Whether the target text should be lower cased. (default: True)
  --no_do_lower_case    Whether the target text should be lower cased. (default: False)
  --language LANGUAGE   Language for multilingual fine-tuning. This argument should be set for multilingual fine-tuning only. For English speech recognition, it should be set to `None`. (default: None)
  --task TASK           Task, either `transcribe` for speech recognition or `translate` for speech translation. (default: transcribe)
  --output_dir OUTPUT_DIR
                        The output directory where the model predictions and checkpoints will be written. (default: None)
  --overwrite_output_dir [OVERWRITE_OUTPUT_DIR]
                        Overwrite the content of the output directory. Use this to continue training if output_dir points to a checkpoint directory. (default: False)
  --do_train [DO_TRAIN]
                        Whether to run training. (default: False)
  --do_eval [DO_EVAL]   Whether to run eval on the dev set. (default: False)
  --do_predict [DO_PREDICT]
                        Whether to run predictions on the test set. (default: False)
  --evaluation_strategy {no,steps,epoch}
                        The evaluation strategy to use. (default: no)
  --prediction_loss_only [PREDICTION_LOSS_ONLY]
                        When performing evaluation and predictions, only returns the loss.

Вот и все! Пусть процесс работает на вашем графическом процессоре в течение нескольких часов подряд. "На одном графическом процессоре V100 этот скрипт должен выполняться примерно за 1 час 20 минут и давать потерю CTC 0,39 и частоту ошибок 0,35 ". Теперь давайте посмотрим, как будет выглядеть код для Мульти графический процессор

python -m torch.distributed.launch \
 --nproc_per_node 8 run_speech_recognition_ctc.py \
 --dataset_name="common_voice" \
 --model_name_or_path="facebook/wav2vec2-large-xlsr-53" \
 --dataset_config_name="tr" \
 --output_dir="./wav2vec2-common_voice-tr-demo-dist" \
 --overwrite_output_dir \
 --num_train_epochs="15" \
 --per_device_train_batch_size="4" \
 --learning_rate="3e-4" \
 --warmup_steps="500" \
 --evaluation_strategy="steps" \
 --text_column_name="sentence" \
 --length_column_name="input_length" \
 --save_steps="400" \
 --eval_steps="100" \
 --logging_steps="1" \
 --layerdrop="0.0" \
 --save_total_limit="3" \
 --freeze_feature_encoder \
 --gradient_checkpointing \
 --chars_to_ignore , ? . ! - \; \: \" “ % ‘ ” � \
 --fp16 \
 --group_by_length \
 --push_to_hub \
 --do_train --do_eval

«На 8 графических процессорах V100 этот скрипт должен выполняться ок. 18 минут, потеря CTC – 0,39, а частота ошибок – 0,36 дюйма.

Теперь, когда мы точно настроили модель Wav2Vec2 с помощью алгоритма CTC, мы можем легко настроить модель Whisper, подготовленную OpenAI с использованием алгоритма последовательностей. Нам просто нужно будет изменить параметры скрипта python

python run_speech_recognition_seq2seq.py \
 --model_name_or_path="openai/whisper-small" \
 --dataset_name="mozilla-foundation/common_voice_11_0" \
 --dataset_config_name="hi" \
 --language="hindi" \
 --train_split_name="train+validation" \
 --eval_split_name="test" \
 --max_steps="5000" \
 --output_dir="./whisper-small-hi" \
 --per_device_train_batch_size="16" \
 --gradient_accumulation_steps="2" \
 --per_device_eval_batch_size="16" \
 --logging_steps="25" \
 --learning_rate="1e-5" \
 --warmup_steps="500" \
 --evaluation_strategy="steps" \
 --eval_steps="1000" \
 --save_strategy="steps" \
 --save_steps="1000" \
 --generation_max_length="225" \
 --preprocessing_num_workers="16" \
 --length_column_name="input_length" \
 --max_duration_in_seconds="30" \
 --text_column_name="sentence" \
 --freeze_feature_encoder="False" \
 --gradient_checkpointing \
 --group_by_length \
 --fp16 \
 --overwrite_output_dir \
 --do_train \
 --do_eval \
 --predict_with_generate \
 --use_auth_token

И это все! Теперь вы можете пойти и проверить результаты на своем аккаунте с обнимающимся лицом — и вуаля! Теперь вы можете точно настроить модели Whisper и Wav2Vec2 на любом языке.

Теперь, вместо того, чтобы запускать его на своем компьютере, который будет занимать ненужный GPU, вы должны попробовать запустить его в Google Colab.
Я создал Colab здесь, который следует тем же инструкциям!