В этой статье мы демонстрируем эффективность задач автоматического распознавания речи (ASR) с трансферным обучением. Мы начинаем с предварительно обученной модели ASR на английском языке и показываем, что трансферное обучение может быть эффективно и легко выполнено на другом языке (например, вьетнамском), даже если набор данных для тонкой настройки невелик.

Ключевые слова — вьетнамский язык, автоматическое распознавание речи, трансферное обучение, вьетнамский текст в речь

Похожие работы

Трансферное обучение для ASR изначально использовалось для систем Смешанная модель Гаусса — Скрытая марковская модель (GMM-HMM). Он основывался на идее, что представление фонемы может быть общим для разных языков.

Андерсон и др. применил эту идею к акустическому моделированию с использованием Международного фонетического алфавита (IPA). Адаптация межъязыковой акустической модели была подробно изучена в проекте GlobalPhone. Он был основан на двух методах:

  • Частичная адаптация модели для языков с ограниченным объемом данных.
  • Начальная загрузка, при которой модель для новой цели инициализируется моделью для другого языка, а затем полностью переобучается на целевом наборе данных.

Гибридная глубокая нейронная сеть (DNN) — модели HMM также использовали TL. По сути, функции, изученные моделями DNN, как правило, не зависят от языка на нижних уровнях. Таким образом, все языки могут совместно использовать эти низкоуровневые слои.

Эта гипотеза была экспериментально подтверждена TL между моделями ASR для германских, романских и славянских языков. Кунце и др. применил TL к сквозным моделям ASR на основе DNN и адаптировал английскую модель ASR для немецкого языка. В своих экспериментах они использовали модель Wav2Letter и замораживали нижние сверточные слои при переобучении верхних слоев.

Точно так же Бухар и соавт. адаптировали многоязычную модель ASR для двух новых языков с низким уровнем ресурсов (уйгурский и вьетнамский) путем переобучения последнего слоя сети. Тонг и др. обучили многоязычную модель на основе CTC телефонному аппарату на основе IPA, а затем адаптировали ее для языка с ограниченными данными.

Они сравнили три подхода к межъязыковой адаптации:

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

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

Набор данных

Набор данных, который мы используем в этой статье, — это набор данных VIVOS, который содержит речевой корпус, записанный с помощью записи речевых данных более 50 коренных вьетнамских добровольцев.

Для обучения 46 ораторов (22 мужчины и 24 женщины) помогают записать 15 часов речи с 11 660 высказываниями. Во время тестирования другая группа из 19 ораторов (12 мужчин и 7 женщин) записала 50 минут речи, всего 760 высказываний.

Этот набор данных имеет две особенности:

  • Аудиофайлы в формате .wav
  • Текстовый файл, содержащий все транскрипции аудиофайлов.

Пройтись по коду

Мы рекомендуем использовать Google Colab для этого учебного раздела. Но если у вас есть все зависимости и графический процессор, вы можете запустить его на своем локальном компьютере.

Сначала откройте новую записную книжку Python 3 и следуйте приведенным ниже инструкциям.

Установить зависимости

!pip install wget 

!apt-get install sox libsndfile1 ffmpeg libsox-fmt-mp3 

!pip install unidecode 

export BRANCH=‘main’ 

!python -m pip install git+https://github.com/NVIDIA/NeMo.git@$BRANCH#egg=nemo_toolkit[all] 

Загрузить набор данных

import glob 

import os 

import subprocess 

import tarfile 

import wget 

data_dir = '.' 

# Download the dataset 
print("******") 

if not os.path.exists(data_dir + '/vivos.tar.gz'): 

    vivos_url = 'https://ailab.hcmus.edu.vn/assets/vivos.tar.gz' 

    vivos_path = wget.download(vivos_url, data_dir) 

    print(f"Dataset downloaded at: {vivos_path}") 

else: 

    print("Tarfile already exists.") 

    vivos_path = data_dir + '/vivos_sphere.tar.gz'  

if not os.path.exists(data_dir + '/vivos/'): 

    # Untar and convert .sph to .wav (using sox) 

    tar = tarfile.open(vivos_path) 

    tar.extractall(path=data_dir) 

     print("Converting .sph to .wav...") 

    sph_list = glob.glob(data_dir + '/vivos/**/*.sph', recursive=True) 

    for sph_path in sph_list: 

        wav_path = sph_path[:-4] + '.wav' 

        cmd = ["sox", sph_path, wav_path] 

        subprocess.run(cmd) 
 

print("Finished conversion.\n******") 

Модель кодирования символов CTC

Теперь, когда у нас есть обработанный набор данных, мы можем начать обучение модели ASR на этом наборе данных. В следующем разделе будет подробно описано, как мы подготавливаем модель CTC, которая использует схему кодирования символов.

В этом разделе будет использоваться предварительно обученный QuartzNet 15 × 5, обученный примерно на 7000 часов базовой модели английской речи. Мы изменим слой декодера (тем самым изменив словарь модели).

char_model = nemo_asr.models.ASRModel.from_pretrained("stt_en_quartznet15x5") 

Обучение малоресурсным языкам

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

freeze_encoder = False #@param ["False", "True"] {type:"raw"} 

freeze_encoder = bool(freeze_encoder) 


if freeze_encoder: 

  char_model.encoder.freeze() 

  char_model.encoder.apply(enable_bn_se) 

  logging.info("Model encoder has been frozen, and batch normalization has been unfrozen") 

else: 

  char_model.encoder.unfreeze() 

  logging.info("Model encoder has been un-frozen") 

Настроить дополнение

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

Примечание. Для языков с низким уровнем ресурсов может быть лучше увеличить увеличение с помощью SpecAugment, чтобы уменьшить переоснащение. Однако это, в свою очередь, может затруднить обучение модели за короткое количество эпох.

## Uncomment lines below if you want augment your data 

# with open_dict(char_model.cfg.spec_augment): 

  # char_model.cfg.spec_augment.freq_masks = 2 
  
  # char_model.cfg.spec_augment.freq_width = 25 
  
  # char_model.cfg.spec_augment.time_masks = 2 
  
  # char_model.cfg.spec_augment.time_width = 0.05 

 char_model.spec_augmentation = char_model.from_config_dict(char_model.cfg.spec_augment) 

Настройка показателей

Первоначально модель обучалась на английском корпусе наборов данных. При расчете Коэффициента ошибок в словах мы можем легко использовать токен «пробел» в качестве разделителя границ слов. С другой стороны, некоторые языки, такие как японский и мандарин, не используют лексемы «пробел», вместо этого выбирают другие способы аннотирования конца слова.

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

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

use_cer = True #@param ["False", "True"] {type:"raw"} 

log_prediction = True #@param ["False", "True"] {type:"raw"} 

char_model._wer.use_cer = use_cer 

char_model._wer.log_prediction = log_prediction 

Вот и все! Как всегда, мы можем обучить модель с помощью Pytorch Lightning Trainer и NeMo Experiment Manager.

Результат и заключение

Мы попробовали несколько голосовых записей в формате .wav и получили хороший результат. Тем не менее, он все еще сохраняет некоторые недостатки:

  • Модель не очень хорошо предсказала разные вокалы, не включенные в набор данных.
  • Он все еще не может быть готов к ASR в реальном времени из-за очень небольшого набора данных (около 15 часов аудио) по сравнению с его предварительно обученными наборами данных (примерно 7000 часов английского аудио).

Подход к трансфертному обучению, основанный на повторном использовании предварительно обученного сетевого кодировщика QuartzNet, оказывается очень эффективным для различных задач ASR. Во всех наших экспериментах мы наблюдали, что точная настройка хорошего базового уровня дает хорошие результаты на небольшом наборе данных и небольшой модели.

Мы представляем этот метод для реализации вьетнамского автоматического распознавания речи (ASR) с использованием модели QuartzNet 15 × 5. Эта модель была основана на глубокой нейронной сети с одномерными сверточными слоями, разделяемыми по временным каналам. Небольшая модель (около 18,9 млн параметров) открывает новые возможности распознавания речи на мобильных и встроенных устройствах.

Ресурсы:

Читайте оригинальную и последнюю статью по адресу: https://www.neurond.com/blog/vietnamese-automatic-speech-recognition-vietasr.

NeurondAI — это трансформационный бизнес.

Сайт: https://www.neurond.com/