Лучшая альтернатива Google Speech Recognition API с открытым исходным кодом - теперь для второй по величине англоязычной страны!

Одна из первых попыток заставить компьютеры распознавать речь была сосредоточена на распознавании чисел! Лаборатории Белла в 1952 году разработали Систему Одри, которая могла распознавать единый голос, говорящий по цифрам. С тех пор было проведено множество других экспериментов, которые хорошо документированы в этой статье в Википедии. Перенесемся на сегодняшний день, и у нас есть современные механизмы автоматического распознавания речи (ASR), такие как Siri от Apple, Google Assistant и Alexa от Amazon.

Долгое время API преобразования речи в текст (STT) от Google был фактическим выбором для любой задачи ASR. Ситуация постепенно изменилась, когда в конце 2017 года вышла альтернатива с открытым исходным кодом, такая как Mozilla DeepSpeech. Она основана на оригинальном Исследовательском документе Deep Speech от Baidu и обучается с использованием (в основном) наборов данных американского английского, что приводит к плохой обобщаемости на другие английские акценты.

Во время недавней стажировки мне пришлось интегрировать движок ASR для платформы видеоконференцсвязи, которая должна была использоваться в основном населением Индии. Мы предпочтительно искали альтернативы с открытым исходным кодом, но большинство из них плохо работали на собраниях в реальном времени. Именно тогда я наткнулся на DeepSpeech и проект Индийский TTS от IITM.

Набор данных Indian содержит более 50 ГБ образцов речи с носителями из 13 штатов Индии. Он состоит из более чем 10000 предложений на английском языке, которые говорят носители языка как мужчинами, так и женщинами. Эти файлы доступны в формате .wav вместе с соответствующим текстом.

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

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

Примечание. Все мое обучение и предварительная обработка выполнялись в Google Colab с DeepSpeech версии 0.7.4.

Предварительная обработка набора данных

После того, как вы запросите набор данных, IITM предоставит вам доступ к своим ссылкам на Google Диск на семь дней. Поскольку мне были нужны данные в течение длительного периода, я перенес все ZIP-файлы в Google Cloud Bucket. В каждом ZIP-файле будет папка, содержащая файлы .wav и соответствующий файл метаданных с именем txt.done.data.

Нам нужно обработать файл метаданных и сгенерировать разделение train / dev / test для набора данных. Мы можем либо обучить модель для одного состояния за раз, либо сгруппировать пару состояний, а затем обучить модель. На диаграмме ниже показано, как должны обрабатываться метаданные.

Приведенная ниже сущность GitHub содержит весь код для создания одного CSV-файла, который нам позже потребуется разделить. Большая часть кода говорит сама за себя, с достаточным количеством комментариев. Обязательно сначала установите Librosa и num2words.

Сценарий выполняется с параметром wav, указывающим на папку, содержащую все аудиофайлы, и параметром meta, указывающим на папку, содержащую txt.done.data файл. Здесь первая часть копирует данные из Google Bucket в Colab. Вторая часть создает файл CSV, а последняя команда добавляется к этому CSV и так далее. Если вы хотите обучить каждый ZIP-файл индивидуально, запустите только одну команду и приступайте к разделению CSV-файла (хотя я не рекомендую это делать). Не забудьте закомментировать строку 45 при добавлении в тот же файл.

$ gsutil cp gs://bucket-name/hindi_female_english.zip /content/hindi_female_english.zip
$ gsutil cp gs://bucket-name/hindi_male_english.zip /content/hindi_male_english.zip
$ unzip hindi_female_english.zip -d /content/hindi_female_english
$ unzip hindi_male_english.zip -d /content/hindi_male_english
--------------------------------------------------------------------
$ python preProcess.py --wav /content/hindi_female_english/english/wav --meta /content/hindi_female_english/english
$ python preProcess.py --wav /content/hindi_male_english/english/wav --meta /content/hindi_male_english/english

Итак, теперь у нас есть файл CSV, и нам нужно разделить его на три отдельных файла. В сущности слева мы сначала разбиваем основной файл CSV на train и промежуточный, а затем разбиваем средний на dev и test. Наконец, у нас есть три файла, соответствующие трем разделам, которые DeepSpeech требует для обучения.

Тонкая настройка DeepSpeech

Официальная учебная документация находится здесь. Он очень подробный, но пропускает некоторые мелкие детали, которые могут задержать вас на удручающе долгое время 😩. Я предполагаю, что вы перенесли набор данных в корзину Google Cloud и у вас есть надлежащее подключение к Интернету, поскольку Colab завершает работу вашего экземпляра, если вы не подключаетесь быстро. Все описанные ниже действия взяты из обучающей тетради, доступной здесь на Colab.

  1. Разрешите Colab доступ к вашему Google Cloud Bucket. Загрузите файл учетных данных для доступа к IAM вашего проекта и загрузите их в Colab.
import os
from google.colab import auth
auth.authenticate_user()
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "creds.json"
#ensure the path is set correctly
!echo $GOOGLE_APPLICATION_CREDENTIALS
project_id = '<gcloud-project-id>'
bucket_name = 'gs://<bucket-name>'
!gcloud config set project {project_id}

2. Клонируйте DeepSpeech v0.7.4 с GitHub: и загрузите соответствующую контрольную точку.

!git clone --branch v0.7.4 https://github.com/mozilla/DeepSpeech
!wget https://github.com/mozilla/DeepSpeech/releases/download/v0.7.4/deepspeech-0.7.4-checkpoint.tar.gz
!tar -xvf deepspeech-0.7.4-checkpoint.tar.gz -C \
/content/model_checkpoints/

3. Установка зависимостей DeepSpeech: нам нужно будет устанавливать несколько вещей каждый раз, когда мы обучаем нашу модель. Подробные действия приведены в блокноте здесь.

4. Установите версию CUDA по умолчанию: Эта часть будет очень неприятной, если вы не поймете ее правильно с первого раза 😤. По какой-то причине, когда вы пытаетесь установить версию CUDA по умолчанию как 10.0 (DeepSpeech требует CUDA 10.0 и CuDNN v7.6) в Colab, она всегда пытается вернуться к 10.1. Я нашел последовательность шагов, которая, кажется, работает, но не могу гарантировать, что она будет работать каждый раз - вам, возможно, придется немного покопаться, чтобы понять ее правильно. Подробные действия приведены в блокноте здесь. Если вы все еще не можете заставить его работать, я буду более чем рад помочь :)

5. Установите TensorFlow-GPU:

!pip3 uninstall tensorflow
!pip3 install 'tensorflow-gpu==1.15.2'

6. Скопируйте данные в Colab из Google Bucket: здесь нужно быть осторожным и копировать файлы точно на то место, где они находились при создании файлов CSV, поскольку модель использует абсолютный путь к аудиофайлам, как указано в CSV. файл.

%cd /content/
!gsutil cp gs://bucket-name/hindi_female_english.zip /content/hindi_female_english.zip
!gsutil cp gs://bucket-name/hindi_male_english.zip /content/hindi_male_english.zip
!unzip hindi_female_english.zip -d /content/hindi_female_english
!unzip hindi_male_english.zip -d /content/hindi_male_english

7. Проверьте наличие лишних символов в алфавите.txt: этот файл (присутствует в / DeepSpeech / data) определяет алфавит языка, на котором обучается DeepSpeech. . Для нашей задачи, поскольку язык тот же, нам не нужно его менять. Если мы хотим обучить новую модель совершенно другому языку, нам нужно переопределить алфавит и выполнить эти шаги. Загрузите три файла CSV в / content / и запустите для них check_parameters.py.

!python3 /content/DeepSpeech/training/deepspeech_training/util/check_characters.py -csv /content/train.csv -alpha
!python3 /content/DeepSpeech/training/deepspeech_training/util/check_characters.py -csv /content/dev.csv -alpha
!python3 /content/DeepSpeech/training/deepspeech_training/util/check_characters.py -csv /content/test.csv -alpha

Примечание. Возможно, вам придется закомментировать некоторые строки в check_characters.py, чтобы заставить его работать. После комментирования некоторых строк вот так должна выглядеть строка 44 в этом файле.

if not args.disable_unicode_variants:
  unicode_transcript = unicodedata.normalize("NFKC", row[2])
  #if row[2] != unicode_transcript:
    #print("Your input file", in_file, "contains at least one transript with unicode chars on more than one code-point: '{}'. Consider using NFKC normalization: unicodedata.normalize('NFKC', str).".format(row[2]))
    #sys.exit(-1)
all_text |= set(row[2])

8. Обучение модели (наконец 😌): этот шаг довольно прост. Попробуйте разные гиперпараметры и перепроверьте пути. Параметры дополнения могут помочь вашей модели немного лучше обобщить.

9. Экспорт модели для вывода: после завершения процесса обучения файл модели .pb экспортируется в каталог_экспорта. Но эта модель очень большая (~ 700 МБ) и не очень эффективна при пакетном прогнозировании. К счастью, есть возможность преобразовать экспортированную модель в модель с отображением памяти, после чего мы получим файл модели .pbmm.

%cd /content/DeepSpeech/
!python3 util/taskcluster.py --source tensorflow --artifact convert_graphdef_memmapped_format --branch r1.15 --target .
!./convert_graphdef_memmapped_format --in_graph=/content/models/ft_model.pb --out_graph=/content/models/ft_model.pbmm

Этот файл .pbmm относительно меньше (~ 180 МБ) и эффективен, и его можно использовать с соответствующим файлом счетчика для улучшения результатов вывода.

Заключение

Уф! Это была длинная статья 😵. Если вы дошли до этого места, спасибо, что остались :)

За время работы с DeepSpeech я обнаружил, что это одна из самых простых библиотек для работы с ASR. Я надеюсь, что эта статья поможет любому попробовать что-то самостоятельно.

Со мной можно связаться: LinkedIn, GitHub