Проект SoundAgent. Исполняемая программа AiSound.
Ссылка на папку
В ней архив V1_48send.zip
В папке EXE – исполняемый файл AiSound.exe
В папке PAS – исходники для Delphi7. Они же легко компилятся в Delphi 10.4 Никаких сторонних библиотек, только оригинальные. Для нейросетей взята старая добрая наработка NeuralBase, слегка «подкручена» и лежит в основной папке проекта в виде DCU и PAS.
В папке WAV/ АЕИЧСК размеченная выборка слов в формате wav для нейросети, которая обучается распознавать звуки «АЕИЧСК»
выборка1- основная
минивыборка – усеченная
тест1 – тестовая выборка
weight31.txt – весовая матрица обученной сети
InVector=24
Layer0=24
Layer1=24
Layer2=12
Layer3=6
OutVector=6
Выходной вектор имеет 6 значений, которые указывают на вероятность распознавания звуков АЕИЧСК.
Входной вектор состоит из 12 нормированных значений амплитуд гармоник в кадре и 12 нормированных значений частот этих гармоник. Кадр это 40 миллисекунд потока от звуковой карты, в котором производится преобразование товарища Фурье. Всего кадр описывается двенадцатью гармониками. Их амплитуды и позиции на оси частот и составляют входной вектор.
В чем идея? Во-первых это не законченный проект. Во-вторых это инструмент. Распознавание речи решенная задача и все тут… Не, не всё. Современный подход предполагает жесткое обучение. Моя же задача построить систему, которая не заканчивает свое обучение. Минимизировать все параметры речи на столько, на сколько это возможно, не потеряв при этом способность распознавания вообще, критерием которого является способность распознавания человеком. Выстроить иерархию признаков речи. Например в данном варианте их нет. Но в дальнейшем предполагается использовать в качестве входного вектора параметры огибающей, которая в иерархическом плане выше спектральных характеристик. Возможно для этого надо создать другую сеть, а не использовать одну общую.
Сейчас мне бы хотелось понять, как работает обучение сети в случае появления ошибок разметки.
Это актуальная ситуация. Многие звуки очень похожи и когда оператор создает обучающую выборку он в плену своих представлений о том или ином звуке. Например звук «А» и «Е» вообще выглядят на спектральной картине одинаково, а человек помечает их как разные. Как при этом работает сеть? А она не сходится. Попадает в локальный минимум и бесконечно в нем крутится.
Всё это можно наблюдать и изучать, используя этот инструмент.
Программа может работать с микрофоном и загружать в качестве данных заранее подготовленные звуковые файлы в формате WAV
Частота дискретизации(Hz): 12000
Mono 16 bit
Для начала надо проверить работает ли микрофон. В верхнем поле мониторится реальный звук. Если что-то сказать, то появится огибающая. Значение Level указывает на линию дискретизации, ниже которой шум. Микрофон надо конечно хороший, это зависит от звуковой карты, где есть и аппаратный шумодав.
Если микрофон не работает, то можно загрузить подготовленные мной файлы. В папке WAV/ АЕИЧСК
File+LoadWav
В окне Envelope появится огибающая спектральной плотности. Кнопка Play проигрывает по кругу, она же стоп.
В окне Spectr можно просмотреть каждый кадр, нажимая < >.
В окне FormMain – редактор спектров. После появления огибающей и спектра нажимаем Load from Сurrent. Появляется огибающая и спектр. Нажимая кнопки <> мы видим каждый кадр. Если левой кнопкой мышки нажать точно на гармонику, то она исчезнет. Если с нажатым Ctrl это сделать, то гармоника появится в том месте, где мышь. Так можно редактировать каждый кадр, а потом проиграть Play, будет забавно.
Нейросети.
File+Load Weight выбираем файл weight31.txt
В правом окне FormView внизу галочка Recognition, нажимаем.
File + Load Wav + !chelovek_new1%Ч%Е%А%Е%К.wav
Это файл из разметки, поэтому он на 100% распознает. И мы увидим:
2 : А= 0.00 Е= 0.00 И= 0.00 Ч= 1.00 С= 0.00 К= 0.00
4 : А= 0.00 Е= 1.00 И= 0.00 Ч= 0.00 С= 0.00 К= 0.00
8 : А= 1.00 Е= 0.00 И= 0.00 Ч= 0.00 С= 0.00 К= 0.00
13 : А= 0.00 Е= 0.99 И= 0.00 Ч= 0.00 С= 0.00 К= 0.00
17 : А= 0.00 Е= 0.00 И= 0.00 Ч= 0.00 С= 0.00 К= 1.00
2,4,8,13,17 – номера кадров
Если микрофон работает, то надо нажать в окне Envelpe галочку Mikrophone, произнести слово и закрыть галочку. Увидим распознавание.
Пока все.
Очень интересный проект ИМХО.
Многие могут начать ворчать мол гугл с мелкомягкими и тд. напилили каких то свои поделок в этом направлении, но это их поделки они под их контролем есть куча риска с этим связанная сводящая на нет "вольное" юзание такого продукта, тем более если через грёбаный SaaS(бееее, простите не выдержал блеванул).
А тема распознавания речи — просто ОЧЕНЬ ВОСТРЕБОВАНА, чисто конкретно, без Б, как говорится, это фундаментальный кирпичик 100500 направлений продуктов. Причем востребованность эта достаточно гибкая к качеству, не везде нужна суперупер аккуратность, есть большое пространство для манёвра, как бы корпоративные маркетологи не пытались всех подсадить на их поделки как на единственно возможный вариант, это всё чепуха и развод.
Что касается паскаля, это конечно не кул, будем откровенны, не фэшн, нужно переписывать на плюсы\ява\шарп, желательно на полюсы ядро(захват, фурье, ML) а на яве\шарпе всё вспомогательное (БД, гуи и тп.). Хотя бы ядро на плюсы, а гуи и прочее опционально кто на чем хочет, это уже не суть.
Второе это как то прорекламировать разработку, среди кодеров и братьев меньших, Вы уже бодро начали в этом направлении, сделали кое какое описание что к чему, но это только начало, нужно по подробнее с картинками и видео на ютубе. Нужно заставить древние отделы мозга вовлечься в процесс, которые реагируют на видео, картинки, звуки и истории.
Пример для подражания : https://habr.com/ru/company/yandex/blog/181219/
Ну и понятно затем проект гитхаб пока тут нет функционала для работы с кодом.
Не для данного форума.
Как-то искал песню по неоригинальному исполнению. Надо сказать, достаточно точно снятому. Ничего не нашлось. А по оригиналу на раз-два. Думаю, даже два экземпляра одного произведения, записанные одним исполнителем (сделанные максимально одинаково) врядли будут похожи для данного метода.
Ну чего, вполне ясное и вдохновляющее описание, можно садиться и кодить самому, даже не заглядывая в их код(если бы они его выложили). Я про ясность изложения идеи алгоритма, образность. Пример это был именно про подачу материала.
Также конечно нужно архитектурно разбить код на сравнительно независимые модули, как минимум на три — захват звука, распознавание и взаимодействие с юзером, задать всем разумные интерфейсы и тогда на гитхабе может начать подтягиваться народ, комитить ченить пулрекветить...
figaro:
Второе это как то прорекламировать разработку, среди кодеров и братьев меньших, Вы уже бодро начали в этом направлении, сделали кое какое описание что к чему, но это только начало, нужно по подробнее с картинками и видео на ютубе. Нужно заставить древние отделы мозга вовлечься в процесс, которые реагируют на видео, картинки, звуки и истории.
Я очень древний old scool. Мог бы сделать и переход на Pyton, хотя его семантика вызывает у меня несварение желудка. Можно и заютубить. Но не уверен, что чьи-то "отделы мозга" вовлекутся.
Накопилось очень много знаний в этой области. И прежде чем ютубиться хочу увидеть отклик в ИИ-шной среде. Посмотрим....
Kek, благодарю, всё скачалось, компилируется и работает.
Kek: Моя же задача построить систему, которая не заканчивает свое обучение. Минимизировать все параметры речи на столько, на сколько это возможно, не потеряв при этом способность распознавания вообще, критерием которого является способность распознавания человеком.
Эта постановка задачи мне очень близка. Уверен, что этот принцип реализован в мышлении человека повсеместно - минимизировать до предела всю обработку входящих сигналов и сконцентрироваться только на отслеживании критических, определяющих, поворотных точек-признаков. Всё остальное отбрасывается, а необходимое - дорисовывается.
Поигрался с экспериментальной станцией AiSound. Функционал выглядит солидно, однако мне, к сожалению, так и не удалось что-либо распознать.
Хотелось бы вернуться к теме "бубнения". Я думаю это очень близко к тому, что Вы называете "параметры огибающей". По моему представлению, человек выделяет в речи те признаки, отслеживая которые он сможет сам себя научить (натренировать) говорить правильно. Если человек - певец, то он конечно отслеживает и распознаёт частотные составляющие сигнала, высоту, обертоны. Но большинству людей медведь наступил на ухо, поэтому "ре" от "до" они не отличают. Частотные параметры сигнала для них не важны. Для них важно выделить в речи те поворотные моменты, которые укажут, в какой момент нужно поддать воздуха из лёгких, сжать зубы, повернуть язык или вытянуть губы при попытках самостоятельно воспроизвести такой же сигнал. Все побочные артефакты речи конечно неизбежно воспроизводятся речевым аппаратом, но они не являются предметом интереса при восприятии. Мы можем их отмечать для себя мимоходом, но это никак не влияет на результат опознавания. Если только мы не изучаем индивидуальные особенности конкретного диалекта, акцента, наречия или конкретного человека, тут тонкие трудноуловимые нюансы будут иметь решающее значение.
Я думаю первый признак, который отслеживается, это общая энергия сигнала. Этот тот параметр, который указывает с каким усилием надо выдувать воздух из лёгких. Если попробовать произносить слова с закрытым ртом (через нос), то именно это "бубнение" мы услышим. Оно указывает на динамику интонации, усилия говорения, которое нужно воспроизвести в первую очередь. Мне интересно научиться выделять из wav-сигнала именно эту основную энергетическую составляющую, потом вычесть её из оригинального сигнала и послушать, что получится. Можно для этого как-то настроить Вашу AiSound-станцию? Я думаю так, отсекая по очереди главные признаки, мы получим в итоге всё лишнее (наверное, что-то шумоподобное), что можно безболезненно отбросить.
Думаю, в отдельных случаях, только одного этого первичного энергетического сигнала достаточно для распознавания. Например такие слова как "wow" или "да" не требуют никаких дополнительных признаков. А вот, например, слова "инцидент" и "президент" по такому "бубнению" уже будет сложно различить, нужно будет добавить 1-2 отличительных признака.
figaro:
Второе это как то прорекламировать разработку, среди кодеров и братьев меньших, Вы уже бодро начали в этом направлении, сделали кое какое описание что к чему, но это только начало, нужно по подробнее с картинками и видео на ютубе. Нужно заставить древние отделы мозга вовлечься в процесс, которые реагируют на видео, картинки, звуки и истории.
Я очень древний old scool. Мог бы сделать и переход на Pyton, хотя его семантика вызывает у меня несварение желудка. Можно и заютубить. Но не уверен, что чьи-то "отделы мозга" вовлекутся.
Накопилось очень много знаний в этой области. И прежде чем ютубиться хочу увидеть отклик в ИИ-шной среде. Посмотрим....
Не, питон это не путь джедая, да и смысл если он в 10-100 раз медленнее плюсов, питон это гламурная оболочка для вызова сишных библиотек, сам реальный код всегда на плюсах или чистом Си.
Prosolver: Kek, благодарю, всё скачалось, компилируется и работает.
Вот теперь, друг мой, можно и поработать.
Я готов рассказать все нюансы...
"Мне интересно научиться выделять из wav-сигнала именно эту основную энергетическую составляющую, потом вычесть её из оригинального сигнала и послушать, что получится."
Огибающая в окне Envelope красный график это именно то. Это спектральная плотность. По сути она получается так. Берем кадр, в нем амплитуды гармоник. Их 12 штук. Складываем их все и получаем число. Это есть точка на красном графике Envelope.
Зачем ее вычитать, я не очень понимаю. Этот график сам по себе есть характеристика слова.
Что я понял?
Локальные максимумы этого графика есть ничто иное как характерные признаки слова. В слове "ЧЕЛОВЕК" этих признаков 5. Ч Е О Е К.
И это статистическая характеристика. Т.к. может 4, а может 6. Но. Наше человеческое восприятие реагирует именно на максимумы энергии. Именно эти максимумы и лежат в основе разметки обучающей выборки. Здесь важно решить задачу инвариантов. Слово может быть произнесено быстро или медленно. И как тут быть?
Если описывать слово не как череду кадров, как это делается в классическом подходе того же Sphinx, а как череду пиков огибающей, то это инвариантно относительно темпа говорения.
Слово ЧЕЛОВЕК произнесенное быстро или медленно описывается пиками одинаково. Их, пиков 5.
Пик это максимум огибающей, начало и конец. Без картинок плохо.
Описывая слово пиками огибающей мы решаем задачу инвариантно относительно темпа говорения.
Не знаю понятно это или нет. Конечно надо иметь в виду статистический характер этого описания.
Можно и нужно построить нейросеть, которая в качестве входного вектора имеет значение пиков огибающей.
Это будет очень "слабая" сеть. Но она будет точно разделять например слово ЧЕЛОВЕК и слово МАМА только на основании того, что количество пиков будет разным. Это иерархический принцип на основании которого формируются кластеры речи.
"Думаю, в отдельных случаях, только одного этого первичного энергетического сигнала достаточно для распознавания. Например такие слова как "wow" или "да" не требуют никаких дополнительных признаков. А вот, например, слова "инцидент" и "президент" по такому "бубнению" уже будет сложно различить, нужно будет добавить 1-2 отличительных признака."
Именно!
Все, устал...
Привет всем.
Уважуха и почет нашему с вами достопочтимому Кеку.
Намедни я закодил в Андроид приложение и в браузерную страничку по технологии WebAssembly автономную распознавалку речи включая и русскую. Называется сие VOSK.
https://github.com/alphacep/vosk-api
Очень даже недурственно, смею доложить.
Но это путь такой - взять чужое и не сосредотачиваясь на потрохах проги использовать это в другом чем-то более общем. Так я и сделал - прикрутил к альфа-версии системы понимания смысла сказанного или написанного.
А к собственно первичной работе над обработкой звука в ИИ системе попробую вернуться позже, заменив чужую либу на что-то свое. Если до этого дело дойдет. конечно.
Вот как-то так.
Покажу все таки публике интересующейся как самому сделать обучающую выборку и обучить нейросеть.
Вот видео
При проигрывании файла выберите в настройках максимальное разрешение.
Чтобы мне хотелось понять. Я обращаюсь к знатокам нейросетей, если таковые имеются.
Если разметка сделана не корректно, то ошибка обучения может быть например Error=1 или Error=0.5.
Ошибка не дойдет до своего заданного значения. А некорректность может быть двух видов:
1 одинаковые или очень похожие входные вектора размечаются как разные
2 разные вектора размечаются как одинаковые
Делая разметку человек ошибается и это факт. А как быть, если достаточно большая выборка обучается не один час и вы не знаете где же эта некорректность среди тысячи паттернов?
Это не актуальная задача если мы хотим сделать систему распознавания. В этом случае решение одно : "пилите, Шура, пилите". Подбирайте паттерны. Но мы же не это хотим. Мы же хотим сделать процесс обучения интерактивным, похожим на диалог. В этом случае ошибки просто неизбежны и что делать с сетью я пока не знаю.
Kek: Складываем их все и получаем число. Это есть точка на красном графике Envelope.
Зачем ее вычитать, я не очень понимаю.
Когда мы складываем все гармоники в кадре, то фактически ничего не теряем. Мы получаем сумму всех составляющих. Но когда мы слышим реальное бубнение, то мы явно что-то теряем. Звук либо размывается во времени, либо теряются высокие частоты, либо ещё что-то, не могу понять. Потому я и спросил Вас, как эксперта в этой области, может Вы в курсе, какое именно преобразование происходит.
Меня интересует такое пеобразование: качественный звук (WAV-1) => некая функция => бубнение (WAV-2). После чего я хочу из WAV-1 вычесть WAV-2 и послушать своими ушами, что получилось. По идее, если главная составляющая речи будет удалена, то распознать звук не удастся. Это всё находится ровно в той парадигме, которую Вы описывали выше ("Минимизировать все параметры речи на столько, на сколько это возможно, не потеряв при этом способность распознавания вообще, критерием которого является способность распознавания человеком").
Kek: Описывая слово пиками огибающей мы решаем задачу инвариантно относительно темпа говорения.
Не знаю понятно это или нет.
Да, Вы всё понятно объяснили про пики, как отличительные признаки. Я думаю это очень интересно и правильно. Меня только не устраивает, что Вы используете нейросети. Хотелось бы более понятный и прозрачный с человеческой точки зрения механизм распознавания.
В древних языках гласные буквы вообще на письме не отображались, потому что они в речи играют вспомогательную роль. Важны только переходы от одних согласных к другим. В речи (так же как и в письме) мажна вса гласнаа паманать на адан звак а вса бадат распазнаватьса.
Kek: Вот видео
Спасибо за видео, так намного понятнее стало, как работать с интерфейсом. Если Вы не возражаете, я мог бы залить это видео на свой ютуб-канал и выложить его тут в виде сообщения, в удобном для просмотра формате.
Prosolver:
Меня интересует такое преобразование: качественный звук (WAV-1) => некая функция => бубнение (WAV-2). После чего я хочу из WAV-1 вычесть WAV-2 и послушать своими ушами, что получилось.
Да, это возможно сделать в ручном режиме уже сейчас. Покажу. Но я понял, что объяснять что-то лучше именно с помощью видео. Поэтому подготовлю короткие сюжеты по каждому функционалу. Размещайте у себя, пусть идет в народ...
2Kek: Мою действующую программу распознавания слов ANNLab от 2018.01 с использованием нейросети никак не удалось использовать?
Насколько я помню, там ручной работы для обучения практически не требовалось.
Виктор Казаринов: 2Kek: Мою действующую программу распознавания слов ANNLab от 2018.01 с использованием нейросети никак не удалось использовать?
Насколько я помню, там ручной работы для обучения практически не требовалось.
Виктор, я ее смотрел и изучал. Позже я представлю свой подход, который вообще без использования нейросетей. Это конечно дискуссионный момент. Готовлю сюжеты, терпение.
Kek, спасибо! Ваша работа впечатляет. Особенно, что это самостоятельная и свободная разработка. Единственный минус из-за которого я не стал разбираться с кодом в том, что написано не на C++.
cortl: Kek, спасибо! Ваша работа впечатляет. Особенно, что это самостоятельная и свободная разработка. Единственный минус из-за которого я не стал разбираться с кодом в том, что написано не на C++.
Спасибо, на С я работаю, но только это простейший С для микроконтроллеров. Перелопачивать все - тяжелая работа. Но я попытаюсь и дальше объяснять суть функционалов. Понимая суть, можно самому повторить.
И в дальнейшем можно поразмышлять над теми путями по которым двигаться в рамках ИИ, оперируя не кодом, а методами и функциями.