Прогнозы возврата wav2ve c fairseq - PullRequest
3 голосов
/ 24 февраля 2020

Я пытаюсь использовать wav2ve c для обучения своей собственной Automati c Система распознавания речи:

https://github.com/pytorch/fairseq/tree/master/examples/wav2vec

import torch
from fairseq.models.wav2vec import Wav2VecModel

cp = torch.load('/path/to/wav2vec.pt')
model = Wav2VecModel.build_model(cp['args'], task=None)
model.load_state_dict(cp['model'])
model.eval()

Первая Как я могу использовать загруженную модель для возврата прогнозов из файла WAV?

Во-вторых, как мне пройти предварительную подготовку с использованием аннотированных данных? Я не вижу никакого текстового упоминания в скриптах манифеста.

Ответы [ 2 ]

3 голосов
/ 11 марта 2020

Попробовав разные вещи, я смог разобраться с этим и натренировал модель wav2ve c с нуля.

Некоторый фон: wav2ve c использует обучение под наблюдением для изучения векторных представлений для предварительно обработанного звука кадры. Это похоже на то, что делает word2ve c для изучения встраивания слов в текстовый корпус. В случае wav2ve c он выбирает случайные части звукового файла и учится предсказывать, будет ли данная часть в ближайшем будущем из текущей позиции смещения. Это несколько похоже на замаскированное слово-задачу , используемое для обучения таких преобразователей, как BERT. Хорошая вещь в таких задачах прогнозирования заключается в том, что они контролируются самими собой: алгоритм можно обучать на немаркированных данных, поскольку он использует временную структуру данных для создания меток и использует случайную выборку для создания контрастных отрицательных примеров. Это задача двоичной классификации (является ли предложенный обработанный звуковой кадр в ближайшем будущем текущим смещением или нет). При подготовке к этой задаче двоичной классификации он изучает векторные представления звуковых кадров (один 512 затемненных векторов на каждые 10 мс звука). Эти векторные представления являются полезными функциями, поскольку они концентрируют информацию, относящуюся к предсказанию речи. Эти векторы можно затем использовать вместо векторов спектрограммы в качестве входных данных для алгоритмов преобразования речи в текст, таких как wav2letter или deepSpeech. Это важный момент: wav2ve c - это , а не полностью автоматизированная c система распознавания речи (ASR). Это полезный компонент, поскольку, используя самоконтроль обучения для немаркированных данных (аудиофайлы, содержащие речь, но без текстовой транскрипции), он значительно снижает потребность в помеченных данных (речь, транскрибируемая в текст). На основании их статьи видно, что при использовании wav2ve c в конвейере ASR количество необходимых помеченных данных может быть уменьшено не менее чем в 10 раз (очевидно, что в 10-100 раз требуется меньше транскрибированной речи). Поскольку нетранскрибированные речевые файлы гораздо проще получить, чем транскрибированную речь, это огромное преимущество использования wav2ve c в качестве исходного модуля в системе ASR.

Таким образом, wav2ve c обучается с данными который не аннотирован (для его обучения текст не используется).

То, что меня смутило, было следующей командой для обучения ( здесь ):

python train.py /manifest/path --save-dir /model/path ...(etc.).........

Оказывается, поскольку wav2ve c является частью fairseq, для его обучения следует использовать следующий инструмент командной строки fairseq:

fairseq-train

Поскольку аргументы этой команды довольно длинные, это можно сделать при использовании bash scipt, такого как

#!/bin/bash
fairseq-train /home/user/4fairseq --save-dir /home/user/4fairseq --fp16 --max-update 400000 --save-interval 1 --no-epoch-checkpoints \
--arch wav2vec --task audio_pretraining --lr 1e-06 --min-lr 1e-09 --optimizer adam --max-lr 0.005 --lr-scheduler cosine \
--conv-feature-layers "[(512, 10, 5), (512, 8, 4), (512, 4, 2), (512, 4, 2), (512, 4, 2), (512, 1, 1), (512, 1, 1)]" \
--conv-aggregator-layers "[(512, 2, 1), (512, 3, 1), (512, 4, 1), (512, 5, 1), (512, 6, 1), (512, 7, 1), (512, 8, 1), (512, 9, 1), (512, 10, 1), (512, 11, 1), (512, 12, 1), (512, 13, 1)]" \
--skip-connections-agg --residual-scale 0.5 --log-compression --warmup-updates 500 --warmup-init-lr 1e-07 --criterion binary_cross_entropy --num-negatives 10 \
--max-sample-size 150000 --max-tokens 1500000

, большинство аргументов - это те, которые предлагаются здесь , только первые два (которые являются путями файловой системы) должны быть изменены для вашей системы.

Поскольку у меня были звуковые голосовые файлы в формате mp3, я преобразовал их в wav-файлы следующим bash сценарием:

#!/bin/bash
for file in /home/user/data/soundFiles/*
do
  echo "$file"
  echo "${file%.*}.wav"
  ffmpeg -i "$file" "${file%.*}.wav"
done

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

сценарий wav2vec_manifest.py должен использоваться для создания манифеста обучающих данных перед началом обучения. Он создаст два файла (train.tsv и valid.tsv), в основном создающих списки аудиофайлов, которые следует использовать для обучения, а также для проверки. Путь, по которому расположены эти два файла, является первым аргументом метода fairseq-train.

Вторым аргументом метода fairseq-train является путь, по которому следует сохранить модель. После обучения появятся эти два файла модели:
checkpoint_best.pt
checkpoint_last.pt
Они обновляются в конце каждой эпохи, поэтому я смог досрочно завершить процесс поезда и при этом сохранить сохраненную модель файлы

0 голосов
/ 02 марта 2020

Вы пропустили последнюю часть примера кода

# replace this line with the input from your wave file
wav_input_16khz = torch.randn(1,10000)
# this extracts the features
z = model.feature_extractor(wav_input_16khz)
# this will have your embedding
c = model.feature_aggregator(z)

(дополнительную информацию о двух последних битах вашего вопроса см. Здесь) https://github.com/pytorch/fairseq/tree/master/examples/wav2vec

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...