LINUX.ORG.RU

Пишу программу для распознавания речи

 , , ,


0

1

Назвал Дельфин. Написана на java. Разместил на sourceforge.net. Можно обучать. Распознает слова и печатает в чате. Цель: сделать полноценную программу, которая будет распознавать речь и печатать в чате с произнесенных слов.

Вот ссылка https://sourceforge.net/projects/opnsrcprgrmfrrc/ на проект.

Присоединяйтесь!

Мои контакты можно найти на странице проекта.



Последнее исправление: Oleg_Dorozhko (всего исправлений: 1)

Назвал Дельфин

занято давно уже

opnsrcprgrmfrrc

э-э-э...

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

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

i-rinat ★★★★★
()
Ответ на: комментарий от Zhbert

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

Seraph
()

Description

Open Source Programm for Recognizing Sounds.

More sounds - more recognizing.

May be in learning mode.

If you have any qwestions:

Skype: dov_php_programmer

Меня одолевают сомнения насчет авторства кода.

fads ★★
()
Последнее исправление: fads (всего исправлений: 1)
Ответ на: комментарий от Zhbert

Да, два велосипеда.

Первый это Cell и CellManager

Допустим, у вас есть две последовательности чисел

10, 20, 30, 40, 50 и 11, 19, 30, 44, 50

Эти последовательности при отображении, скажем на графике дадут примерно подобные линии

Вопрос, как запрограммировать программу, чтобы она эти две последовательности посчитала равными?

На помощь придет объект Cell - ячейка и такая присказка: у любой ячейки есть и начало и конец.

Итак, объект Cell имеет два поля s и f

Создаем 5 объектов Cell на основе первой последовательности

Вот они: (10,10)(20,20)(30,30)(40,40)(50,50)

Объект Cell также имеет метод eql, который возвращает истину, если входной параметр помещается между граничными значения s и f (включительно)

Таким образом, после инициализации 5 ячеек первой последовательностью и сравнении в цикле этих ячеек с каждым элементом

второй последовательности получим 40% совпадение между двумя последовательностями.

Но что будет, если под чутким руководством оператора, одна из ячеек изменит свое значение?

(10,11) <- эта (20,20)(30,30)(40,40)(50,50)

Теперь при сравнении в цикле этих ячеек с каждым элементом второй последовательности получим уже 60% совпадение между двумя последовательностями.

Такое изменение возможно при вызове метода learning нашего объекта Cell.

В этом методе входной параметр сравнивается с граничными условиями и если он меньше s то s присваивается входной параметр. Если он больше f то f присваивается входной параметр.

Так происходит обучение ячейки на распознавание близко лежащих значений.

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

Более того, если подать на вход третью подобную последовательность то также получим результат близкий к 100%

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

Это: первичная инициализация ячеек, сравнение входящего образца с ячейками, обучение ячеек и сохранение обученных ячеек.

Используя классы CellsManager и Cell я и написал простенькую обучаемую демо-программу распознавания речи и разместил ее на sourceforge.net

Думаю что подобная программная конструкция может оказаться весьма полезной при разработке программ распознавания образов ========================================

Второй это встроенная в программу консоль.

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

Oleg_Dorozhko
() автор топика
Ответ на: комментарий от i-rinat

Сравнение картинок для наглядности. В общем и целом алгоритм выглядит так:

Я сейчас делаю так: Получаю массив байт из TargetDataLine Это один фрейм Потом отсеиваю шум и получаю красивую синусоиду для ноты Создаю BufferedImage для наглядности длина рисунка = длине массива байт высота рисунка = 256 Значение byteArray это красная точка с координатами i, byteArray Так вот записываю звук в картинках)

После этого, создаю массив ячеек Cell длиной исходного массива байт Каждую ячейку инициализирую так: Cell = new Cell( byteArray, byteArray)

Получаю массив ячеек. Их записываю тоже в картинку так: длина рисунка = высоте рисунка = корню квадратному из длины массива байт

Далее делаю в цикле перебор по ячейкам, и по координатам i, j вывожу точку с цветом, несущим информацию об обоих значениях ячейки вот так:

Code: view sourceprint?

//g типа Graphics картинки

Cell temp = cells[w*j+i];

int r = temp.sv;

int b = temp.sf;

Color c = new Color(r,0,b);

g.setColor(c);

g.drawLine(i,j,i,j);

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

Oleg_Dorozhko
() автор топика
Ответ на: комментарий от fads

Dorozhko Oleg Vladimirovich = dov

PHP? Я и на php програмлю

В коде действительно использованы чужие фрагменты но только которые опен соурс для не коммерческого использования

Oleg_Dorozhko
() автор топика
Ответ на: комментарий от Oleg_Dorozhko

В общем, ты строишь границы и проверяешь, влезает в них семпл или нет.

Твоя проблема в том, что пока семплов мало (один-два), у тебя получатся данные вроде:

         x
        x  x
      x      x
      x       xx                      xx
    x           xx                  x    x                 xx
   x    xxxxx                    x         x              x
     xxxx xxxxx   x            x            x           x
    xx        xx   x           x              x        x
   xx          xx    x       x       xx        x      x
  xx            xx     x x x       xx  x xxx    x x x      xx
  x              xx              xx         xx            xx
                   xx          xx             xx          x
                     x       xx                 xx      xx
                     xxx    xx                    xxxxxx
                        xxxxx

И всё вроде круто. Ты говоришь «Привет» и оно опознаёт. Но когда семплов станет много (а их надо много, так как люди разные) у тебя будет что-то вроде:




                                                            xx
      xxxxxxxxxxxxxxxxxxxxx          xxxxxxxx  xxxx    xxxxx  xxxxx    x
    xx                xxx  xxxxxxxxxx        xx    xxxx            xxxx x











         xxxxxxxxx           xxxxxx       xxxxx           xxxxxx
     xxx          xxx     xxx      xx   x      xxx     xxx      xxxx   xxxx
                     xxxxx           xxx          xxxxx             xxxx

И уже под этот шаблон весело подойдут и «Привет» и «Вася» и прочее.

Ещё ты забыл отрабатывать смещения. Ну и вообще заточено под единственного пользователя.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Ты все верно говоришь, Ринат. Я сам обдумываю все эти моменты. Сейчас работаю над улучшением алгоритма записи фреймов и сравнения. Ключевые слова для версии 2.0 это: промежутки и масштабирование

один байт промежутка превращается в селл(2в16,2в16)

берем промежутки между значениями входного массива байт ba-ba[i-1] Порядок не имеет значения ведь каждый селл сравнивается с каждым промежутком, а значит смещение нивелируется. А при масштабировании промежутки Васи и Привета наверное будут различаться Но тут нужны испытания. И блин, я себя новым Теслой чувствую. Я не хочу тянуть это в одиночку, понимаешь? Я хочу найти тех, кому интересно вместе сделать этот проект.

Oleg_Dorozhko
() автор топика
Ответ на: комментарий от Oleg_Dorozhko

10, 20, 30, 40, 50 и 11, 19, 30, 44, 50
Эти последовательности при отображении, скажем на графике дадут примерно подобные линии
Вопрос, как запрограммировать программу, чтобы она эти две последовательности посчитала равными?

man coherence (statistics). Тхреад не читал.

anonymous
()
Ответ на: комментарий от i-rinat

Нашел ошибку в своем коде: У объекта Cell должен быть id В этом случае можем получить последовательность промежутков которая почти однозначно описывает входной сигнал т.е. исходный массив байт. Например: 10 40 70 120 150 промежутки: 30, 30, 50, 30 последовательность 1 2 3 4 ----------------------- Допустим сигнал сдвинут: 50 10 40 70 120 промежутки 40, 30, 30, 50 вычисленная последовательность 1, 2, 3, 5 -------------------- Итого получаем 1,2,3,4 и 1,2,3,5 т.е. 75% совпадение Осталось только внести изменения в алгоритм

Oleg_Dorozhko
() автор топика
Ответ на: комментарий от Kadi

Ага, удалить после ознакомления и написать свою версию)

Oleg_Dorozhko
() автор топика
Ответ на: комментарий от i-rinat

да не, унрар у меня есть... просто не понимаю это пристрастие к проприатерному архиватору... если бы он был быстрее/лучше сжимал... а так.. странно просто. :)

BattleCoder ★★★★★
()
Ответ на: комментарий от Mironor

Во-во, и я о том же.

Он и архивировать сам умеет текущий срез репозитория :) да и git clone никто не отменял.

BattleCoder ★★★★★
()
Ответ на: комментарий от BattleCoder

унрар

не unrar, а unar. Меня до сих пор терзают смутные сомнения о легальности поддержки в нём rar'а, но тем не менее, лицензия LGPL-2.1+.

i-rinat ★★★★★
()
Последнее исправление: i-rinat (всего исправлений: 1)
Ответ на: комментарий от Oleg_Dorozhko

Если честно, ни слова не уловил. Какой подход к распознаванию используется? структурный? нейронные сети? вероятностный? цепи Маркова?

если «можно обучать», то наверное нейронные сети, да?..

BattleCoder ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.