Приветствую. Данная статья не является новшеством. Это скорее сборка использования различных технологий для достижения одной цели — определение и анализ полученных данных. В моем случае - это аналитика аудиосодержимого. Нет, у меня не будет графиков по правилам Котельникова. Мы будем складывать полученные данные в различные базы данных и последовательно анализировать полученное, а также пытаться автономно на существующих мощностях переопределять речь в текст. К сожалению в первой части больше теории.
Итак, у нас есть куча аудиозаписей и пишется ещё и ещё. Мы нанимаем новых работников, которые будут анализировать аудиозаписи с целью «повышения качества обслуживания» (того самого качества, о котором говорят в начале разговора) — но обычно данное качество проверяется только после жалобы клиента на несоответствие работы оператора, либо клиент всегда любит жаловаться. В современном мире, не должно быть вопросов - «что делать», а какие технологии будем использовать и какой бюджет. Да, простите меня за долгое и нудное вступление. Перехожу к схемам, определению данных, что и как будем смотреть, а также покажу свое mvp выложенное в общий доступ для последующего использования (и даже инструкция есть!). По технологиям, которыми будем пользоваться для преобразования речи в текст, тесты и кто победит — это отдельная статья т. к. тут ваш выбор, либо использовать готовые сервисы, с хорошим распознаванием, либо развивать свои — тут все на ваш выбор, все зависит от уровня вашей организации и требований, которые предъявляют. Как правило организации выбирают готовый сервис для преобразования аудиоречи в читаемый текст.
Есть прекрасный доклад, где поэтапно рассказывают, как создать свой speech-to-text своими руками https://www.youtube.com/watch?v=eke2h9fGtu0 к сожалению последние коммиты 4х летней давности, но для понимания как работает и на какие моменты стоит обратить внимание — очень хорошо рассказано.
Мой проект делится на 2 части — это непосредственно сам аудиоанализатор и система, которая будет складывать и анализировать полученные данные. Аналитика содержимого и как интерпретировать данные, как их можно использовать, какие плюсы это принесет бизнесу…. Можно долго рассуждать, а можно выделить время и попробовать сделать хороший проект, который поможет людям. Скорее всего я ничего нового не скажу, но хочется перечислить пункты, где данная аналитика и будущий проект могут применяться:
1. В здравоохранении, начиная от записи к врачу и заканчивая удаленным приемом, у нас есть телемедицина и полномочия удаленных врачей начинают расти, под покровом конфиденциальности, можно анализировать общение и выявлять проблемы — например, когда одна из сторон грубит и по сути сервис предоставлен некачественно.
2. В экстренных службах, как мы знаем, бывают «прослушки» и бывают ошибки диспетчеров, как и эмоциональное потрясение пациентов, которые ведут к другим ошибкам.
3. Во всех сферах услуг, где участвует голос — вызовы такси, заказы еды, общения по корпоративным каналам, везде можно проводить аналитику и сопоставлять данные.
4. Отдельным пунктом, это про тот самый «глаз», который за всеми следит, дополнительно можно анализировать «шумы» в здании бизнес центров и в случае увеличение «градуса» предпринимать действия (киберпанк какой то получается).
Как и написал выше, не успел сделать практически работающих чартов для запуска в кластерах.
Будут следующие этапы:
1. Установка приложения.
1.1. Распознавания речи.
1.2. Анализа данных.
2. Смотрим графики нагрузки и анализируем.
2. Установка баз данных для приложения
2.1. Elasticsearch.
2.2. Clckhouse.
2.3. Kafka.
1. Поговорим про речь
Думаю, что все кто искал информацию по определению аудио в текст, уже встречал статьи по сравнению открытых систем распознования, например тут http://suendermann.com/su/pdf/oasis2014.pdf, а также сравнения с облачными провайдерами — но тут тесты могут быть противоречивые т. к. авторы используют уже ранее выложенные датасеты, поэтому в рамках данной статьи мы просто запустим одно из открытых решений и не будем слишком зацикливаться на фонемах, корпусировании, обучение моделей и других элементов системы, которые важны для определения речи в текст.
В качестве системы для определения голоса выбрал vosk https://github.com/alphacep/vosk-server — конечно, я как и все прочитал про сравнительные анализы, тесты, но у данного продукта есть много готовых интеграций с открытыми системами телефонии и не только, а также порог входа ниже, поэтому прошу не критиковать по выбору данного продукта.
Запускаю vosk-server для этого взял последний датасет и собрал образ используя данный Dockerfile https://github.com/alphacep/vosk-server/blob/master/docker/Dockerfile.kaldi-ru — образ загрузил itforever/vosk-server:0.0-ru. Для запуска данного контейнера требуется достаточное количество ОЗУ, в моем случа потребление контейнера выглядит так:
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS 035fd2e639f9 vosk-server 0.00% 6.524GiB / 19.59GiB 33.30% 9.02MB / 146kB 2.61GB / 0B 2
и сразу протестировал работу — запустил ./vosk-server/websocket/test_ffmpeg.py test.ac3 (использовал для записи audacity, с wav форматом почему то отдавал пустые значения)
Вывод получился таким (тут записал последний абзац):
{ "partial" : "запускаю воск сервер для этого взял последний сет и собрал образ используя данный докер"
}
{
"partial" : "запускаю воск сервер для этого взял последний сет и собрал образ используя данный докер файл"
}
.....
{
"conf" : 1.000000,
"end" : 9.180000,
"start" : 8.700000,
"word" : "работу"
}],
"text" : "образ загрузил все равно протестировал работу"
}
Как видим работает. У нас есть ws сервер, куда будем направлять данные для анализа, значит наш концепт будет выглядеть примерно так:
Теперь переходим к этапу анализа данных.
Я записал враждебную аудиозапись, в которой есть частые употребления нехороших слов и угроз. Например, как выглядит расшифровка записи:
./test_ffmpeg.py ./test_ssud.ac3 | grep "суд"
"partial" : "я суд"
"partial" : "я суд на вас"
"partial" : "я суд на вас"
"partial" : "я суд на вас подам в суд"
"partial" : "я суд на вас подам в суд"
"partial" : "я суд на вас подам в суд"
"partial" : "я суд на вас подам в суд суд"
"partial" : "я суд на вас подам в суд суд"
"partial" : "я суд на вас подам в суд суд"
"partial" : "я суд на вас подам в суд суд в"
"partial" : "я суд на вас подам в суд суд суд"
"partial" : "я суд на вас подам в суд суд суд"
"partial" : "я суд на вас подам в суд суд суд"
"partial" : "я суд на вас подам в суд суд суд суд"
"partial" : "я суд на вас подам в суд суд суд суд"
"partial" : "я суд на вас подам в суд суд суд суд"
"word" : "суд"
"word" : "суд"
"word" : "суд"
"word" : "суд"
"word" : "суд"
"word" : "суд"
"text" : "я суд на вас подам в суд суд суд суд все суд"
Думаю нам этого будет достаточно. Также дополнительно, есть очень хороший проект по определению эмоций на основе набора данных https://github.com/MITESHPUTHRANNEU/Speech-Emotion-Analyzer, поэтому в нашу систему при наличии желания и ресурсов, можно встроить дополнительные проверки.
Следовательно исходя из полученных данных, мы можем сделать недорогую (написанную на коленке) систему, которая привнесет в наш бизнес много полезного и мы узнаем, что было скрыто за тысячами аудиозаписей приходящих к нам и получить статистику, а далее получить динамику в зависимости от изменений на процесс.
В данном случае мы должны заранее знать возможный список негативных слов и выражений, по которым будем искать совпадения, а также на основе полученных данных рисовать графики и другие конструкции, которые будут понятны бизнесу. Также можно пойти дальше и исходя из векторных, языковых моделей попытаться использовать машинное обучение, что мы и будем делать.
Вторая, будущая часть статьи, целиком и полностью будет посвящена анализу текстовых данных с возможностью быстрого анализа. Давайте вкратце рассмотрим какие технологии и методы есть в общем доступе применительно к моей задаче. Как мы знаем существует множество методик, семантический, структурный, семиотический, системный, символический анализ и много других. Поэтому, в нашем случае необходимо выбирать ту технологию, которая больше применима к решению нашей задаче.
https://github.com/explosion/spaCy — хороший проект, честно говоря искал по альтернативам LIWC, методика обладающая собственными словарями представляющими собой пространство для оценки того, в какой степени испытуемые используют слова тех или иных категорий (например, позитивные и негативные слова).
Отдельно стоит рассказать про морфологический анализ, реализован в большинстве методик, так как является основой для других видов анализа текста, например яндекс, сделал хорошую документацию, https://yandex.ru/dev/mystem/doc/index.html. Как видите, я решил использовать технологии на основе словарей и подробнее рассмотрю вариант с морфологическим анализом.
Спасибо за прочтение статьи. Постараюсь вторую часть написать более практической и с готовыми хелм чартами и полным описанием процессов. И конечно пишите критику, предложения.
Комментарии (11)
AigizK
26.05.2022 08:37Пока статья слишком вводная, но посмотрим что будет в следующий части.
По статье не очень понял, какую задачу решаете? Так как из аудио можно получить много информации(пол, возраст, эмоции и тд), а из текста, еще больше. И хотите сделать что то универсальное или решать узконаправленную задачу?
iwram Автор
26.05.2022 08:48В целом хотел универсальное решение. Также хотел сразу предусмотреть систему телефонии работающую в кластере kubernetes с включенной аналитикой, но думаю что один такое не потяну (уже пробовал запустить решение на основе доклада https://www.youtube.com/watch?v=xgx61YGSS54).
Задача в целом простая, это возможность сделать софт, который легко внедрить в существующие системы и быстро анализировать поток данных. Как и сказал, это вводная часть. И в статье указал то, что основная программная часть работы будет связана в основном с аналитикой полученного текста. С speech to text уже есть много хороших, открытых решений, поэтому хочется все правильно скомпоновать и сделать хорошее, доступное решение.
AigizK
26.05.2022 11:30+1по поводу универсальности сомневаюсь, что получится. те же stt лучше тренировать для своих данных, так как телефонная речь и с диктофона качество разное получается. далее может быть область, где есть ключевые слова, соответсвенно при распознавании надо "предупредить" вашу языковую модель, чтоб правильно расшифровала.
что касается анализа текста: для скорой медицинской помощи нужны одни данные, например уметь распознавать адрес, симптомы и тд, а для банка другие. получается слишком много нюансов.
iwram Автор
26.05.2022 12:17Согласен. Для начала и понимания, что надо получить, можно какую то базу заложить, ведь не всегда даже разработчик знает, что хочет получить от системы. Во время внедрения уже появляются уточнения и что надо для конкретного решения.
Enterboy
26.05.2022 08:48Думаю, довольно долго самым надёжным и точным останется распознаватель с биржи фрилансеров: рубль минута и максимально точная расшифровка на выходе.
iwram Автор
26.05.2022 09:10200*60*8= 96000, это усредненная формула call centr, где 200 это количество звонков в минуту и 8 часовой рабочий день. Даже если фрилансер будет брать 10 рублей за минуту распознавания, получится довольно кругленькая сумма в день. Тут решают масштабы бизнеса.
Enterboy
26.05.2022 09:14Давайте будем повнимательнее. Я написал рубль минута, а не 10.
И второе: 200 звонков в минуту это нереально. На один звонок в среднем (сильно зависит от бизнеса) отводится около полутора минут. Обычно количество "голов" в колл-центре далеко не 200 или 100, а на порядок меньше.
priwelec
Вам лучше такие предложения разбивать на более короткие и понятные, чтобы статья стала читабельной. Сейчас понять мысли автора проблематично...
iwram Автор
Спасибо за замечание. Это правда поток мыслей.