Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Распознавание слов на Java, Написание системы распознавания  
:(
    Опции темы
Kor1
  Дата 21.12.2013, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 21.12.2013

Репутация: нет
Всего: нет



Приветствую, форумчане!

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

Собс- но, вопрос, с чего начать?
Кто то уже писал подобные системы? Цель программы такая - (пример) говоришь ей пять,он тебе пишет вы сказали пять пи пи пи smile

Из всего , что я умею,это только файл воспроизводить)) Ну и записывать звуки с микрофона.

Поделитесь опытом,знаниями,пожалуйста)

Заранее благодарствую!
PM MAIL   Вверх
Stolzen
Дата 21.12.2013, 17:42 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1041
Регистрация: 17.10.2005

Репутация: 23
Всего: 48



Добро пожаловать на форум. 

Скажите, у вас есть какой-нибудь опыт в Machine Learning? 

Можно подойти к решению этой задачи следующим образом:

Тренировка
  •  Сначала нужно решить какие слова вы хотите определять. Допустим, это цифры от 0 до 9.
  •  Далее вам нужно записать как можно больше слов для тренировки классификатора.
    •   Тут еще важно, чтобы были слова были записаны разными голосами, в идеале еще чтобы были и мужские и женские голоса.
    •   Если вы натренируете классификатор только своим голосом, рискуете оказаться в ситуации, когда он только вас и сможет определять
    •  Так же важно, чтобы все записанные файлы были в одном формате. Я использовал WAV, моно, с частой 16 кгц. Можно частоту еще ниже сделать
  •  Далее тренируете классификатор


Определение 
  •  Записываете голос и передаете его классификатору. На данном этапе следует обратить внимание на определение моментов тишины перед словом и после - для её обрезания
  •  Полученный файл передаете классификатору для классификации

Замечания
  •  Часть данных из набора для тренировки нужно отложить в сторону и использовать для тестирования классификатора
  •  Можно достичь лучшего результата если звук предварительно пропустить через преобразование фурье
  •  В качестве классификатора в моем случае я использовал Random Forest, именно он показал лучший результат как по скорости, так и по точности. SVM также был неплохой, а вот нейронные сети тренировались достаточно долго.

Для этого всего лично я использовал библиотеки JavaML и lib-svm плюс самописное преобразование Фурье (хотя оно уже должно быть реализовано в Apache Commons Math)

Цитата(Kor1 @  21.12.2013,  16:26 Найти цитируемый пост)
Ну и записывать звуки с микрофона.

Это уже хорошо. Средствами джавы тоже можете? 



Это сообщение отредактировал(а) Stolzen - 23.12.2013, 10:25


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
Kor1
Дата 21.12.2013, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 21.12.2013

Репутация: нет
Всего: нет



Спасибо огромное!))

Опыта нету, к сожалению...

Очень много звука записал)в основном  как раз цифры,запись проводил не только я))

Да, как раз средствами Java и записываю звуки с микрофона, и воспроизвожу, концепт интересный.

Цитата

Полученный файл передаете классификатору для классификации


Ну.. тут понятие размытое)) у меня план был примерно таков, записать, соб-но , текст, очистить его от посторонних шумов, разделить на несколько частей, для каждой части сделать преобразование Фурье,выдать результат, который потом идет дальше,  так скажем,ну и если соответствует, то выдать, что , например, сказали: пять.

Вообще в этом деле я еще новичок,кстати,записывал звук тоже с частотой 16кГц,Моно,16 бит.

Не могли бы вы чуть больше рассказать? пожалуйста))

Это сообщение отредактировал(а) Kor1 - 22.12.2013, 18:43
PM MAIL   Вверх
Stolzen
Дата 22.12.2013, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1041
Регистрация: 17.10.2005

Репутация: 23
Всего: 48



Цитата(Kor1 @  21.12.2013,  21:22 Найти цитируемый пост)
Не могли бы вы чуть больше рассказать? пожалуйста))

Спрашивайте, что именно интересует 


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
Kor1
Дата 23.12.2013, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 21.12.2013

Репутация: нет
Всего: нет



Просто вы так написали.. растянуто,скажем так.

Давайте по плану))
 Звук записан, что же дальше?)
PM MAIL   Вверх
Stolzen
Дата 23.12.2013, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1041
Регистрация: 17.10.2005

Репутация: 23
Всего: 48



Допустим, все необходимые шаги на этапе пред-обработки вы выполнили (обрезали тишину, сделали преобразование Фурье)

Теперь к себе в проект добавляете какую-нибудь библиотеку для Machine Learning. Я лично использовал JavaML, поэтому следующие шаги приведу для него

Сначала нужно подготовить training set. 

Создаете его
Код
Dataset set = new DefaultDataset();


И для каждого вашего звукового файла вызываете 
Код
set.add(new DenseInstance(sound, cls));

sound - это массив double[] со звуком 
cls - класс, к которому принадлежит данный звук, т.е. если это цифра 5, то класс "пять"

После этого можно приступать к тренировке классификатора
Код

Classifier classifier = ...
classifier.buildClassifier(set);


Выбор классификатора остается за вами smile

Это сообщение отредактировал(а) Stolzen - 23.12.2013, 15:55


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
Kor1
Дата 23.12.2013, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 21.12.2013

Репутация: нет
Всего: нет



Спасибо!))



(обрезали тишину, сделали преобразование Фурье)

А вот тут можно поподробнее,преобразование.
PM MAIL   Вверх
Stolzen
Дата 23.12.2013, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1041
Регистрация: 17.10.2005

Репутация: 23
Всего: 48



Цитата(Kor1 @  23.12.2013,  18:28 Найти цитируемый пост)
А вот тут можно поподробнее,преобразование. 

Как я уже писал выше, для этого можно использовать Apache Commons Math (класс FastFourierTransformer)


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
Kor1
Дата 23.12.2013, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 21.12.2013

Репутация: нет
Всего: нет



Цитата


Как я уже писал выше, для этого можно использовать Apache Commons Math (класс FastFourierTransformer) 

Пока опустим это.а если самопис?)
PM MAIL   Вверх
Stolzen
Дата 23.12.2013, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1041
Регистрация: 17.10.2005

Репутация: 23
Всего: 48



Ну тогда вспоминайте (или изучайте) курс матана и теории обработки цифровых сигналов и пишите smile 
В гугле искать по Fast Fourier Transform или Discrete Fourier Transform.

Вроде бы на хабре были неплохие статьи по теории, можете еще там глянуть. 


Это сообщение отредактировал(а) Stolzen - 23.12.2013, 20:25


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
Kor1
Дата 23.12.2013, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 21.12.2013

Репутация: нет
Всего: нет



Цитата

Ну тогда вспоминайте (или изучайте) курс матана и теории обработки цифровых сигналов и пишите smile 
В гугле искать по Fast Fourier Transform или Discrete Fourier Transform.

Вроде бы на хабре были неплохие статьи по теории, можете еще там глянуть. 

Да.. были.Кстати,а что нужно скармливать на вход в FFT ?
Просто файл же не будешь скидывать)) 

UPD.А вы(если занимались данной темой) файл делили,если да,то как?) на сегменты.


PM MAIL   Вверх
Stolzen
Дата 23.12.2013, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1041
Регистрация: 17.10.2005

Репутация: 23
Всего: 48



Цитата(Kor1 @  23.12.2013,  21:43 Найти цитируемый пост)
UPD.А вы(если занимались данной темой) файл делили,если да,то как?) на сегменты.

Нет, не делил, на вход подавался звуковой файл, состоящий только из одного слова, я только тишину убирал с начала и с конца. 

Цитата(Kor1 @  23.12.2013,  21:43 Найти цитируемый пост)
Да.. были.Кстати,а что нужно скармливать на вход в FFT ?
Просто файл же не будешь скидывать)) 

Файл состоит из байтов, их считывайте и передавайте в классификатор. 
Чтобы их правильно считать нужно знать, какой именно кодек используется. 
Вот код, который я использовал: https://gist.github.com/alexeygrigorev/8104025 (код был взят отсюда и немного переделан)


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
Kor1
Дата 24.12.2013, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 21.12.2013

Репутация: нет
Всего: нет



Цитата

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

Вот тут не знаю...
Вообще, если AudioFormat,ом выводить инфу о файле будет так:

Код

CM_SIGNED 16000.0 Hz, 16 bit, mono, 2 bytes/frame, little-endian


Там, вроде, надо побитовое смещение делать.
PM MAIL   Вверх
Stolzen
Дата 24.12.2013, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1041
Регистрация: 17.10.2005

Репутация: 23
Всего: 48



Вообщем тот код что я привел должен нормально работать в вашем случае (я надеюсь)

Это сообщение отредактировал(а) Stolzen - 24.12.2013, 17:57


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
Kor1
Дата 24.12.2013, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 21.12.2013

Репутация: нет
Всего: нет



У меня, кстати, был код, достающий инфу:
Код


import java.io.File;
import java.io.IOException;

import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.UnsupportedAudioFileException;

public class mfc {

    private static AudioInputStream audioInputStream;
    private static AudioFormat format;
    private static AudioFileFormat.Type fileType = AudioFileFormat.Type.WAVE;
    private static int BITS_IN_BYTE = 8;

    public static void main(String[] args) {
        String fileN = "C:\\test\\mix11" + "." + fileType;
        File soundFile = new File(fileN);

        try {
            audioInputStream = AudioSystem.getAudioInputStream(soundFile);
            format = audioInputStream.getFormat();
        } catch (UnsupportedAudioFileException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        System.out.println("Общая информация о файле: " + format);
        /*
         * Расширени аудио файла
         */
        System.out.println("Расширение файла: " + fileType.getExtension());
        /*
         * Количество используемых бит на выборку (Significant Bits Per Sample)
         * Величина указывает количество бит, формирующих каждую выборку
         * сигнала.
         */
        int bPs = format.getSampleSizeInBits();
        System.out.println("Бит на выборку: " + bPs);
        /*
         * Количество каналов указывает, сколько отдельных аудиосигналов
         * закодировано в секции данных звука (wave data chunk). Значение 1
         * означает монофонический сигнал, 2 означает стерео
         */
        int NumChannels = format.getChannels();
        System.out.println("Количество каналов(моно = 1, стерео = 2): "
                + NumChannels);
        /*
         * Кодировка аудио файла
         */
        System.out.println("Кодировка: " + format.getEncoding());
        /*
         * Число выборок аудиосигнала, приходящихся на секунду. На эту величину
         * не влияет количество каналов. Частота дискретизации
         */
        int frameRate = (int) format.getSampleRate();
        int SampleRate = frameRate;
        System.out.println("Частота дискретизации: " + frameRate);
        /*
         * Выравнивание блока (Block Align) Количество байт на одну выборку.
         */
        int BlockAlign = bPs / 8 * NumChannels;
        System.out.println("Количество байт на одну выборку: " + BlockAlign);
        /*
         * Среднее количество байт в секунду (Average Bytes Per Second)
         * Величина, показывающая, сколько байт за секунду данных должно быть
         * пропущено через цифроаналоговый преобразователь (D/A converter, DAC)
         * во время воспроизведения файла.
         */
        int AvgBytesPerSec = SampleRate * BlockAlign;
        System.out.println("Среднее количество байт в секунду: "
                + AvgBytesPerSec);
        /*
         * Количество байт, переданных за секунду воспроизведения.
         */
        long byteRate = frameRate * NumChannels * bPs / BITS_IN_BYTE;
        System.out
                .println("Количество байт, переданных за секунду воспроизведения(аналогично AvgBytesPerSec): "
                        + byteRate);
        /*
         * Порядок байтов
         */
        System.out.println("Порядое байтов: " + format.isBigEndian());
    }
}


PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0632 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.