В ряде статей, опубликованных на этом сайте, есть описание того, что на рынок вышла новая Open Source платформа AI «речь в текст» VOSK-API. Ее инсталляция и один из способов применения расписан достаточно подробно в ее документации. Привожу ссылку на Гитхаб VOSK-API, рекомендую пробовать октябрьскую версию 2020 года.



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

Основная проблема у начинающего пользователя — установка самого KALDI (на котором она основана). Основные вопросы рассмотрены в подробном мануале. Одна из задач создания голосового бота решена в статье. Для экспериментов мы выбрали виртуальную машину с Ubuntu 18.04, четырехядерным десктопным процессором и 8ГБ оперативной памяти. Замечено, что необходимо не менее 10ГБ свободного места для ее пересборки на диске и установка ряда дополнительных пакетов.

По времени полная ее пересборка из исходников по инструкции автора заняла около 2 часов времени вместе с выкачиванием зависимостей. Дополнительно надо помнить и выкачать требуемые словари нужных языков. Из настоятельных рекомендаций — просмотреть статью про Яндекс станцию.Мини касательно микрофонов. Настройка распознавания KALDI в файле mfcc.conf оставлена по дефолту.

Достигнутое быстродействие — 3 часа речи в текст за 45 минут без CUDA. С CUDA скорость вырастет раза в три.

Цель моей статьи: показать полученные решения четырех очень важных примеров из жизни, которые вы можете использовать на момент нахождения на самоизоляции. Использование команд, которые будут приведены, не требует никакой подготовки. Достаточно базовых знаний операционной системы. Если вы смогли самостоятельно поставить данный продукт, то они могут быть рассмотрены как углубленный анализ результата работы демо-скриптов, идущих с данной системой.

Устанавливаем очень полезную утилиту jq.

sudo apt-get install jq

Первая задача. Бабушка пишет мемуары для своих внуков.

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

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

Вторая задача. Многие столкнулись с тем, что учитель, уходя на удалённую работу, обязан поставить оценки всему классу. Допустим, за стихотворение Алексея Плещеева «Травка зеленеет, солнышко блестит», которое было задано выучить наизусть, необходимо прослушать 1 минуту аудиозаписи на каждого ученика. Приведем это стихотворение полностью.

Травка зеленеет,
Солнышко блестит;
Ласточка с весною
В сени к нам летит.
С нею солнце краше
И весна милей…
Прощебечь с дороги
Нам привет скорей!
Дам тебе я зерен,
А ты песню спой,
Что из стран далеких
Принесла с собой…


Если этот текст вам расскажут девяносто человек, то вы получите 90 отдельных файлов. Хорошо, если они у вас лежат в одной директории, допустим в Облаке «Школьного портала».
Еще лучше, если учащиеся не забыли, что надо перед чтением стиха произносить свое имя, класс, представлять автора стиха и проговаривать его название. Совсем хорошо, если файлы будет писать родитель и поименует файл понятным для учителя образом.

Результаты работы нейросети следующие. Ребенок 11 лет.

«ксюша иванова его третьего класса травка зеленеет солнышко блестит»
«травка зеленеет солнышко блестит ласточка с весною к сенью к нам летит»
«с нею солнца краше и весна милей прощай дейзи с дороги нам привет скорей дам тебе я зёрен а ты песню спою чтоб стран далёких принесла с собой»

Для сравнения — родитель, возраст более 50 лет.

«юрий иванов третьей главе класс»
«автор алексей плещеев стихотворение травка зеленеет солнышко блестит»
«травка зеленеет»
«солнышко блестит»
«ласточка с весною»
«в сени к нам летит»
«с нею солнца краше»
«и весна милей прыщи бич с дороги»
«нам привет скорей»
«дам тебе я зёрен»
«а ты песню спой»
«что из стран далёких принесла с собой»

Что мы можем видеть сразу? При достаточном уровне выполнения условий — ясная речь и хороший микрофон нейросеть позволяет качественно проводить анализ того, был ли факт сдачи домашнего задания, нет ли ошибок и оговорок в распространенных словах. Для автора статьи данный тест очень показателен с точки зрения достижения AI определенного уровня зрелости. Заметим, что очень хотелось бы видеть правильные знаки препинания, но из-за наличия большого количества авторских знаков в поэзии, на текущий момент нейросистемам данная задача недоступна.

Код для решения данной задачи.


cd ~/vosk-api/python/example/
ffmpeg <конкатенация файлов от учеников> <итоговый файл>
test_ffmpeg.py <итоговый файл> > <распознанный файл.txt>

JSON-структура распознанного файла.

{
  "result" : [{
      "conf" : 1.000000,
      "end" : 11.670000,
      "start" : 11.190659,
      "word" : "автор"
    }, {
      "conf" : 0.999981,
      "end" : 12.329875,
      "start" : 11.730000,
      "word" : "алексей"
    }, {
      "conf" : 1.000000,
      "end" : 13.170000,
      "start" : 12.330000,
      "word" : "плещеев"
    }, {
      "conf" : 0.499391,
      "end" : 14.730000,
      "start" : 13.620000,
      "word" : "стихотворение"
    }, {
      "conf" : 1.000000,
      "end" : 15.720000,
      "start" : 15.090000,
      "word" : "травка"
    }, {
      "conf" : 1.000000,
      "end" : 16.620000,
      "start" : 15.720000,
      "word" : "зеленеет"
    }, {
      "conf" : 1.000000,
      "end" : 17.970000,
      "start" : 16.950000,
      "word" : "солнышко"
    }, {
      "conf" : 1.000000,
      "end" : 18.840000,
      "start" : 18.090000,
      "word" : "блестит"
    }],
  "text" : "автор алексей плещеев стихотворение травка зеленеет солнышко блестит"
}


cat <распознанный файл.txt> | jq -e '.text // empty'


""
"юрий иванов третьей главе класс"
"автор алексей плещеев стихотворение травка зеленеет солнышко блестит"
"травка зеленеет"
"солнышко блестит"
"ласточка с весною"
"в сени к нам летит"
"с нею солнца краше"
"и весна милей прыщи бич с дороги"
"нам привет скорей"
"дам тебе я зёрен"
"а ты песню спой"
"что из стран далёких принесла с собой"

Где найти словарь и слово «прыщи бич»?


cd ~/vosk-api/python/example/model/graph
gedit words.txt

Всего строк в файле 709157, слово «прощебечь» отсутствует. Слово «щебетать» есть — строка «щебетать 693280».

Третья задача. Проверена работа VOSK-API при записи конференций на программах Zoom и Skype.

Результат экспериментов следующий. Zoom показал себя несколько лучше Skype. Так как конференции чаще всего ведут гарнитурами телефонов, то приемлемого уровня транскрибирования получить не удается. До 40% процентов записей необходимо править и переслушивать запись. Из очень сильной стороны VOSK-API требуется отметить наличие словарей на 16 языков. Перемена словаря иногда помогает в распознавании речи, если данный язык или акцент вам не знаком. Но надо помнить, что речь должна быть не скороговоркой, а с точным соблюдением последовательности слов и ударений в тех языках, где оно явно приводит к смене смысла отдельного слова.


cd ~/vosk-api/python/example/
test_microphone.py > > <файл, куда будет идти вывод текста с микрофона> --- при работе с микрофоном
test_ffmpeg.py  <аудиофайл, где записана конференция> > <файл, куда будет записан распознанный текст>

Четвертая задача. Решение задач кадрового администрирования у людей, которые переболели COVID-19. К сожалению, из-за отдельных неврологических проблем после перенесения гриппа, люди, вернувшиеся обратно к активной деятельности, чаще всего некоторое время не полностью работоспособны — это признают врачи-неврологи, поэтому автор рекомендует делать три теста, которые позволяют определить степень расстройства.

Тест первый. Чтение собственной биографии с рукописного текста.
Тест второй. Проверка знаний по технике безопасности и служебных обязанностей, особенно, если при выполнении служебных обязанностей требуется работа на иностранных языках.
Тест третий. Решение задач на логику/подбор цифр/подбор цветов.

Общее решение — сравнить речь человека до и после болезни. Перед запуском этого скрипта необходимо скачать словарь Speaker identification model.


./test_speaker.py test.wav
Text: what zero zero zero one
X-vector: [-1.065311, 0.14455, 1.310549, 0.596016, -0.151356, -0.362094, 0.745858, -0.264195, 0.307014, 0.058419, 0.738315, 0.635655, -0.495874, 0.139377, 0.356549, -0.173395, 0.074023, -0.83072, -1.736858, -0.570139, 0.89358, 0.075338, 0.886154, -0.137121, -0.722118, -0.586631, -0.923351, -1.145369, 0.721946, 0.855906, -0.527137, -0.602525, -0.404175, 0.14571, 0.481054, 1.070324, -0.452989, 0.440212, 0.95773, 0.607813, -0.748662, 0.248267, 0.281229, -1.602895, -1.129104, 0.378493, -1.342542, 0.312861, -0.405486, 0.232147, -0.883148, 0.215719, -0.720657, 0.241228, -0.856604, -0.454164, 1.092535, -1.528371, -0.849456, -0.413601, 0.011528, -0.619541, 1.089719, -1.076719, 0.778474, -1.022505, -0.282122, 1.959929, -1.417458, -0.375822, 1.581648, 0.906027, -0.800187, 1.231653, 0.859697, 1.284286, -1.040324, -1.228232, -0.971846, -0.594426, -1.413725, -0.99551, 2.357713, -1.907972, -0.16593, 0.183826, -1.341422, -1.380152, -0.252688, 0.401448, 1.342474, -1.904654, 1.280014, 0.632759, 0.323294, -0.3574, 1.516961, -2.11078, -1.839827, -0.427943, 0.832596, -1.724944, -0.031242, -1.266902, 3.215793, 0.2991, -0.187186, 1.585431, 0.9225, -0.128613, 0.383765, -0.972161, 0.774282, 0.43021, -1.750064, 1.274774, 0.026617, 0.428113, -0.443698, 0.896994, -0.522293, -1.237508, -2.001688, -0.641555, -1.942122, 0.561793, 1.141983, -0.478895]
Speaker distance: 0.01602843768494866 based on 174 frames
LOG (VoskAPI:~CachingOptimizingCompiler():nnet-optimize.cc:710) 0.0117 seconds taken in nnet3 compilation total (breakdown: 0.0107 compilation, 0.000635 optimization, 0 shortcut expansion, 0.000121 checking, 9.54e-07 computing indexes, 0.000215 misc.) + 0 I/O.
Text: no no to uno
X-vector: [-0.315216, 0.088054, 1.967613, 0.440483, -1.425646, 0.299931, 0.621808, -0.920581, 0.263069, -0.216305, -0.384349, 0.078719, 0.15704, 2.007216, -1.331602, 0.720121, 0.508036, -0.768363, -0.074315, 0.113592, 1.173006, 1.21138, -0.294857, 0.835466, -0.270718, 1.132135, -1.588558, 0.406705, -0.531724, 0.092602, 1.5677, -0.245982, 0.655816, 0.376164, 0.077411, -0.547771, 0.196848, 1.530783, 0.557785, -0.846675, -1.288608, 0.140275, 0.06392, 0.709163, -1.025039, -1.477721, -0.179096, 0.316264, -0.566066, 1.153895, 0.654089, 0.084374, -0.510161, 1.186644, -0.202071, -0.915526, -0.196917, -0.162389, 1.817603, -1.664899, -0.072249, -0.117305, 1.670558, -3.026185, -0.49294, -1.51643, -0.205612, 1.918243, 0.776788, -0.101979, 2.172074, 0.091645, 0.411623, 1.020418, -0.71609, -0.034635, -0.32363, -0.673635, -0.972474, 0.851203, 0.621995, -0.112647, 1.024791, -1.764144, 1.312728, -1.02536, -1.223556, -2.747352, 0.381789, 0.217219, 0.347767, 0.004582, -0.838587, 1.136404, -1.049031, -0.575243, 0.848262, -0.057954, -1.762913, 0.393559, 0.84619, 0.221667, 0.608691, 1.417057, -1.322821, -1.321385, 0.973689, -1.175761, -0.317987, 0.373828, -0.192994, 0.854224, 2.230777, 0.627181, -1.071384, -1.809651, 0.849013, 0.41032, -0.045185, -0.073063, -0.428079, -0.577237, -0.861689, 1.305788, -1.700222, -1.188621, 1.197436, 0.943091]
Speaker distance: 0.7495460914450667 based on 72 frames
Note that second distance is not very reliable because utterance is too short. Utterances longer than 4 seconds give better xvector
LOG (VoskAPI:~CachingOptimizingCompiler():nnet-optimize.cc:710) 0.0136 seconds taken in nnet3 compilation total (breakdown: 0.0121 compilation, 0.00063 optimization, 0 shortcut expansion, 0.00017 checking, 1.19e-06 computing indexes, 0.000646 misc.) + 0 I/O.
Text: cyril one eight zero three
X-vector: [-0.880006, 0.186606, 1.848107, 0.674361, -0.747068, 0.03707, 0.332981, -0.223074, -0.26606, 0.252309, 1.311052, 0.731834, -0.347791, -0.015727, 0.264074, -0.045843, 0.053776, -0.341771, -0.984138, -0.346953, 0.937853, -0.316124, 2.276106, -0.589401, 0.283398, 0.678342, -0.392648, -1.73645, 0.341099, 1.257073, 0.82611, -1.22818, 0.039835, -0.080493, -0.912248, 1.685127, 0.177878, 0.660492, 1.094303, 0.473059, -1.256159, 0.937267, 0.0417, -0.292262, -0.285039, -0.921979, -1.534441, -0.211981, -1.994463, 0.512648, 0.114646, 2.468064, -1.15914, -0.797758, -0.199447, -0.672875, 0.452033, -0.163903, -0.109623, 0.564099, -1.081989, -1.362331, 0.484899, -1.329233, 0.515784, -1.341571, -0.899612, 1.492324, -0.498962, -0.926496, 2.493385, 0.475057, 0.597296, 1.374582, 0.777272, 1.556976, -0.215508, -1.401148, -0.779485, -0.165828, 0.1682, -0.165277, 1.167712, -0.748817, -0.668321, -0.006841, -1.870955, 0.296376, 0.362641, 0.246981, -0.74697, -1.148609, -0.256512, -0.708602, -0.910755, -0.65048, 0.785714, -1.613403, -1.52025, -0.366386, 1.112397, -1.063604, -0.169103, -0.115601, 2.725785, 1.206273, -0.047244, -1.942164, -0.144012, 0.981502, 0.374681, 0.070751, 1.332015, -0.631551, -1.297623, 2.502249, 0.580735, 0.215355, 0.008061, -0.758196, -0.870196, -0.198494, 0.504556, 0.333052, -1.248781, 1.009707, 1.975181, 1.947483]
Speaker distance: 0.40815495072293917 based on 177 frames

Так как набор служебной информации у всех на работе разный, напомним несколько важных цифр, которые установили учёные-нейролингвисты.

Обычный человек в сутки может произнести: мужского пола — десять тысяч слов, женского пола — пятнадцать тысяч. Средний темп говорения на европейском языке у его носителя: сто пятьдесят слов в минуту, а темп написания — только сорок.

При взаимодействии с различными системами искусственного интеллекта нужно понимать, что мы добиваемся от них гладкого диалога. Диалоги вида «да» или «нет» приводят человека к психологическим проблемам.

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

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

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

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

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

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

Статья была написана с использованием VOSK-API. Вычеркнуто неверно распознанных слов — 20, исправлено 15 ошибок в окончаниях. Расставлены знаки препинания.

Хочу выразить Николаю Шныреву из компании AC Technologies LLC г. Новосибирск искреннюю благодарность за платформу VOSK-API и представленные с ней модели.