Русский
Русский
English
Статистика
Реклама

Распознавание речи с помощью инструментов машинного обучения

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

Nvidia NeMo набор инструментов машинного обучения для создания и обучения моделей на базе графического процессора.

Модели в составе NeMo используют современный подход к распознаванию речи коннекционистская временная классификация (CTC).

До СТС использовался подход, при котором входной аудиофайл разбивался на отдельные речевые сегменты и по ним предсказывались токены. Далее токены объединялись, повторяющиеся сворачивались в один, и результат подавался на вывод модели.

При этом страдала точность распознавания, так как слово с повторяющимися буквами не считалось корректно распознанным на 100%. Например, кООперация приводилось к кОперация.

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

Для своей задачи я взял одну из моделей (Jasper 105) и обучил ее с нуля. Для обучения был выбран публичный датасет телефонных разговоров, содержащий нарезанные аудиозаписи и их транскрибацию.

Чтобы обучить модель, необходимо подготовить файл-манифест, содержащий информацию об аудиофайле и транскрибацию этого файла. Файл манифест имеет свой формат:

{{"audio_filepath": "path/to/audio.wav", "duration": 3.45, "text": "sometext"}{"audio_filepath": "path/to/audio.wav", "duration": 3.45, "text": "sometext"}}

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

def convertToWav(self, ext):        if not os.path.exists(self.datadir + '/dataset'):            tar = tarfile.open(self.an4Path);            tar.extractall(path=self.datadir);        sphList = glob.glob(self.datadir + '/dataset/**/*' + ext, recursive=True);        for sph in sphList:            wav = sph[:-4] + '.wav';            cmd = ["sox", sph, wav];            subprocess.run(cmd);            print('renamed ' + ext + ' to ' + wav);

Для построения тестового и тренировочного манифеста я использовал следующую функцию, в которой получили длительность аудиофайла с помощью функции getduration(filename=audiopath) библиотеки Librosa, путь к файлам транскрибации и аудиофайлам нам известен:

def buildManifest(self, transcript_path, manifest_path, wav_path):        with open(transcript_paths, 'r') as fin:            with open(manifest_path, 'w') as fout:                for line in fin:                    transcript = line[: line.find('(')-1].lower();                    transcript = transcript.replace('<s>', '').replace('</s>', '');                    transcript = transcript.strip();                    file_id = line[line.find('(')+1 : -2];                    audio_path = os.path.join(self.datadir, wav_paths, file_id[file_id.find('-')+1 : file_id.rfind('-')], file_id +'.wav');                    duration = librosa.core.get_duration(filename=audio_path);                    metadata = {                        "audio_filepath": audio_path,                        "duration": duration,                        "text": transcript                    }                    print(metadata);                    json.dump(metadata, fout);                    fout.write('\n');

Для инициализации модели я сформировал специальный файл конфигурации, в котором прописываются все параметры модели:

config.yaml:name: &name "Jasper10x5"model:  sample_rate: &sample_rate 16000  labels: &labels [" ", "a", "б", "в", "г", "д", "е", "ё", "ж", "з", "и", "й", "к", "л",                   "м", "н", "о", "п", "р", "с", "т", "у", "ф", "х", "ц", "ч", "ш", "щ", "ъ", "ь", "э", "ю", "я", "'"] preprocessor:    _target_: nemo.collections.asr.modules.AudioToMelSpectrogramPreprocessor    normalize: "per_feature"    sample_rate: *sample_rate    features: &n_mels 64    n_fft: 512    frame_splicing: 1    dither: 0.00001    stft_conv: false

Достаточно загрузить этот файл в конструктор модели и приступать к ее обучению. Для этого необходимо добавить к параметрам модели пути к тестовому и проверочному манифесту и с помощью инструмента pytorch_lighting запустить процесс обучения:

import nemo;class NemoASR:    def __init__(self, dataDir):        self.datadir = dataDir;        self.CONF_PATH = './config.yaml';        yaml = YAML(typ="safe");        with open(self.CONF_PATH) as f:            self.CONFIG = yaml.load(f);    def train(self, transcriptionPATH, manifestPATH, wavPATH, testTranscriptionPATH, testManifestPATH, testWavPATH):        print("begin train");        train_transcripts = self.datadir + transcriptionPATH;        train_manifest = self.datadir + manifestPATH;        if not os.path.isfile(train_manifest):            self.buildManifest(train_transcripts, train_manifest, wavPATH);        test_transcripts = self.datadir + testTranscriptionPATH;        test_manifest = self.datadir + testManifestPATH;        if not os.path.isfile(test_manifest):            self.buildManifest(test_transcripts, test_manifest, testWavPATH);        # params from ./config.yaml        self.CONFIG['model']['train_ds']['manifest_filepath'] = train_manifest;        self.CONFIG['model']['validation_ds']['manifest_filepath'] = test_manifest;        trainer = pl.Trainer(max_epochs=500, gpus=1);        self.model = nemo_asr.models.EncDecCTCModel(cfg=DictConfig(self.CONFIG['model']), trainer=trainer);        trainer.fit(self.model);        print("end train");#-------------------------------------------------------------nemoASR = NemoASR('.');if (nemoASR.checkExistsDataSet()):    print('dataset loaded');    nemoASR.train('./dataset/etc/train.transcription',  './dataset/train_manifest.json','./dataset/wav/an4_clstk', './dataset/etc/test.transcription', './dataset/test_manifest.json', './dataset/wav/an4test_clstk');    nemoASR.model.save_to('./model.sbc');

После обучения готовую модель можно использовать для распознавания речи:

files = ['./an4/wav/an4_clstk/mgah/cen2-mgah-b.wav'];    for fname, transcription in zip(files, nemoASR.model.transcribe(paths2audio_files=files)):        print(f"Audio in {fname} was recognized as: {transcription}");

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

При использовании инструмента NeMo я выделил для себяследующие достоинства:

  • быстрое обучение на GPU;

  • возможность менять настройки модели из одного места, не меняя код;

  • простота обучения.

Из недостатков можно отметитьнеобходимость включения большого количества тяжеловесных библиотек, а также то, что инструмент относительно свежий и некоторые функции модели находятся в бета-тесте.

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

Предлагаем использовать данный инструмент не только для распознавания речи, но и для генерации аудиофайлов на основе текста (TTS) и распознавания диктора (speaker recognition).

Источник: habr.com
К списку статей
Опубликовано: 27.01.2021 12:10:40
0

Сейчас читают

Комментариев (0)
Имя
Электронная почта

Программирование

Машинное обучение

Nvidia nemo

Python

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru