Pull to refresh

И чат, и бот, и логопед. Как разработать сервис на основе ML для диагностики дефектов речи у детей

Reading time6 min
Views3K

«Шла Саша по шоссе», «Скажи: рррррыба», «Кукушка кукушонку...» – знаете, да, эти фразы, травмировавшие нас всех в детстве? Это был какой-то бесконечный эксперимент родителей с неоформленным желаемым результатом и главное – страхами, что их ребенок растет с дефектом речи. 

Привет! Меня зовут Дима Пухов, я технический директор в Cleverbots. Хочу рассказать, как мы учили чат-бот распознавать дефекты речи и добились 80% точности в диагнозах ИИ-логопеда.

Проблема

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

В прошлом году фармкомпания «Герофарм», чтобы бороться со страхами и стереотипами о когнитивном развитии, запустила портал ПРО.МОЗГ, на котором можно прочитать очень много полезных и доступных материалов о том, как работает мозг, как «действуют» болезни и меняется организм. Кроме того, на сайте есть спектрограмма – сервис, который помогает родителям в игровом формате протестировать ребенка и определить, есть ли у него дефекты речи.

Коротко о работе сервиса

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

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

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

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

Это место было бутылочным горлышком – продукту с такими сложными и достаточно рутинными этапами диагностики тяжело масштабироваться и сложно донести пользу для широкой аудитории. Еще и потребуется нанимать больше логопедов для оперативной проверки такого количества записей. Мы это исправили с помощью искусственного интеллекта.

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

Теперь самое интересное – как мы это реализовывали

Существует много идей и технологий которые можно попробовать для решения:

  • хорошо зарекомендовали себя в голосовых задачах частотные преобразования, например мел-кепстральные коэффициенты (MFCC). Их можно использовать на этапе feature engineering;

  • использовать статистические признаки; 

  • Deep Learning, а именно технологии вроде тех, что используются в speech2text. С ними удобно работать, а решения получаются более универсальными, но может потребоваться большее количество данных, чем их есть на самом деле;

  • использовать уже готовые облачные решения для косвенной оценки наличия дефекта. Например, решения от Yandex, Google, AWS для того, чтобы решить задачу speech2text и получить текст, который в дальнейшем будем сравнивать с тем, что должен был произнести ребенок.

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

Изучив имеющиеся вводные данные, мы выделили четыре возможных категории записей:

  1. Пустая аудиозапись;

  2. На аудиозаписи нет голоса ребенка (только голос взрослого человека);

  3. Ребенок произнес фразу с дефектом;

  4. Ребенок произнес фразу без дефекта.

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

Ход решения

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

Сперва применили к каждому сэмплу преобразования для удаления и сокращения больших пауз. Чаще всего, как обычно это бывает, подобные участки находились в начале/конце аудиодорожки.

На следующем шаге для сэмплов подсчитали несколько статистических параметров (например, доля пауз и их длительность) и затем применили метод 3Sigma на преобразованных методом Бокса-Кокса распределениях для выявления аномалий и их последующего исключения из датасета. Это позволило нам избавиться от, например, очень коротких/длинных аудиозаписей.

Теперь можно было двигаться дальше.

Определение забракованных аудиозаписей

Для этого из разделов spectral & rhythm features библиотеки librosa мы выбрали ряд переменных, по которым посчитали расширенную статистику. Применение PCA сократило число переменных до адекватных значений, и простая логистическая регрессия показа 0.99 по ROC_AUC.

Определение дефекта речи

Так как пользователи должны произносить заранее определенный текст, решили испытать speech2text. Мы попробовали использовать сервисы для распознавания речи: Yandex, Google, Amazon. Гипотеза, которую мы проверяли, была достаточно простой: если нет дефекта речи, то на выходе из speech2text сервиса получим как раз ту фразу, которую мы просили произнести нашего пользователя.

Но это не взлетело... Текст, который мы получали, почти никогда не соответствовал тексту задания, которое выполнял пользователь. Даже в тех случаях, когда пользователь все очень четко произносил, мы чаще всего получали не то, что ожидали. Также у нас не получилось качественно разделить речь двух людей (такой функционал тоже есть). Единственный результат, который был полезен в нашем случае – это timestamp начала и конца каждого слова.

В качестве бейзлана был выбран следующий подход – все переменные spectral & rhythm features из библиотеки librosa, tsfresh для калькуляции статистики и PCA (так как переменных получилось очень много). Результат оказался достаточно неплохим: ROC_AUC показал 0.85, но мы решили идти дальше – ближе к тому процессу, что проводит логопед при анализе того или иного сэмпла.

Сначала необходимо перейти от общей модели к ряду моделей по каждому таску (пока их 52 штуки; <100 сэмплов в каждой). Так мы хотя бы немного упростим задачу моделирования – алгоритм быстрее отберет ряд наиболее важных переменных, представляющих наличие дефекта.

Второй шаг – провести сегментацию каждого сэмпла. На текущем этапе хорошо себя показала функция onset_detection, которая разбивает каждый сэмпл на ряд подсэмплов, по которым мы считаем статистику и которая агрегируется обратно до уровня сэмпла. Средний balanced_accuracy_score, посчитанный на всех тасках показал оценку 0.80, что достаточно неплохо.

Хорошей идеей показалось провести кластеризацию подсэмплов для каждого таска, с целью выявления одинаковых, и учиться только на них. В качестве теста были опробованы различные алгоритмы – от DTW до обычных кластеризаций на агрегированных статистиках и метода Audio Fingerprinting. Первый и последний метод оказались достаточно любопытными, хоть и работают не без ошибок, но, скорее всего, мы продолжим работу с ними.

Как мы реализовали это в production

Технологический стэк

  • Предобученная модель и ее интерфейс в Python;

  • Kafka – брокер сообщений;

  • Django для кабинета специалиста.

Как только пользователь записал и отправил аудиозапись, наша модель приступает к обработке, и через пару секунд результаты уже лежат в БД. В момент, когда логопед будет проверять анкету пользователя, подсказки от нашей модели уже будут у него перед глазами.

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

Что получилось

Если раньше логопед слушал каждую аудиозапись (а их, как мы писали выше, ~10 на каждого ребенка) по несколько раз, то сейчас логопед обращает пристальное внимание лишь на аудиозаписи которые были «подсвечены» нашей моделью, остальное – в пределах случайной проверки. В сравнении с тем, как были устроены процессы ранее, логопед экономит очень много времени. Модель сразу подсказывает, что с данным аудио все в порядке. На усмотрение специалиста можно на них не обращать внимания, а сразу перейти к аудиозаписям в которых у детей все таки появляются трудности с произношением.

Да, наша модель еще не совершенна, и есть риск ошибки, но, во-первых, риски не так велики – модель точно определяет дефект на 80% записей. Во-вторых, мы активно работаем над их минимизацией: от выборочных проверок до регулярного дообучения моделей на новых данных.

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

Tags:
Hubs:
+4
Comments7

Articles