6 / 6 / 1
Регистрация: 15.09.2013
Сообщений: 149
1

Написание системы распознавания речи!

26.11.2013, 22:29. Показов 11712. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет форумчанам!
Задумался я над интересно темой: Распознавание речи.Тема довольна перспективна,особенно в наши времена.

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

Так как я задумался написать такую систему под андроид,то и копать надо в ту же сторону.
У кого есть какие то материалы по данной тематике - выкладывайте!Все

Прежде чем писать такую систему разберем основные компоненты системы:

1)Запись звука - это запись звука То есть, сказали что то в микрофон, файл записался(Точнее он может и не записаться,а сразу перейти во второй этап)

2)Анализ сигнала - Ядро нашей программы,анализирует записанную с микрофона речь.Самая сложная часть.

3)Вывод - Тут уж в зависимости от назначения программы.Для начала надо научиться просто выводить слово.


Этап первый,начнем.

Так как самое главное нам это запись звука с микрофона,накропал небольшой кодец:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import java.io.File;
import java.io.IOException;
import java.util.Scanner;
 
import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.TargetDataLine;
 
public class Main {
    
    final static int MONO = 1;
    private static AudioFileFormat.Type fileType = AudioFileFormat.Type.WAVE;
 
    public static void main(String[] args) {
        AudioFormat format = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,
                44100, 16, MONO, 2, 44100, true);
        DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);
        int numb = 5; //номер файла
        String files = "C:\\test\\mix" + numb + "." + fileType;
        File fileOut = new File(files);
 
        if (!AudioSystem.isLineSupported(info)) {
            System.out.println("Line nit supporot!");
        }
        System.out.println("Для остановки записи звука введите - g");
        TargetDataLine mike = null;
        try {
            mike = (TargetDataLine) AudioSystem.getLine(info);
            mike.open(format);
            AudioInputStream sound = new AudioInputStream(mike);
            mike.start();
            
            try {
                AudioSystem.write(sound, fileType, fileOut);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        } catch (LineUnavailableException e) {
            System.out.println("line not avaible");
        }
        
        Scanner sc = new Scanner(System.in);
        String scc;
        if (sc.hasNext()) { 
            System.out.println("Запись звука остановлена");
            scc = sc.nextLine();
            if (scc.equals("g")) {
                System.out.println("Запись звука остановлена");
                mike.stop();
            }
        }
        
        
    }
}
Эта часть кода немного неправильно работает:
Java
1
2
3
4
5
6
7
8
9
10
Scanner sc = new Scanner(System.in);
        String scc;
        if (sc.hasNext()) { 
            System.out.println("Запись звука остановлена");
            scc = sc.nextLine();
            if (scc.equals("g")) {
                System.out.println("Запись звука остановлена");
                mike.stop();
            }
        }
Но если программу остановить,все будет хорошо,звук запишется.

Пожалуйста,выкладывайте любые ссылки по теме,говорите какие недочеты есть в коде)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.11.2013, 22:29
Ответы с готовыми решениями:

Написание системы обработки инцедентов
Привет всем! Мне нужно написать систему HelpDesk, тоесть систему обработки инцедентов, для...

ПО для распознавания речи
Понадобилась прога по сабжу. По указанным ссылка на ifolder скачать прогу не удалось(( У кого...

Ускорение распознавания речи
Недавно начал учить распознавание речи в Python, есть код: import speech_recognition as sr def...

Система распознавания речи
Хочу написать программу которая работала бы как Google Voice Search (Голосовой поиск Гугл) только...

7
ɐwʎ ɔ vǝmоɔ dиw ɐʚонɔ
443 / 442 / 100
Регистрация: 14.10.2012
Сообщений: 1,146
Записей в блоге: 9
26.11.2013, 23:30 2
воу-воу-воу, палехче! Гугл повержен?

Добавлено через 3 минуты
Scanner sc = new Scanner(System.in);
String scc;
if (sc.hasNext()) {
System.out.println("Запись звука остановлена");
scc = sc.nextLine();
if (scc.equals("g")) {
System.out.println("Запись звука остановлена");
mike.stop();
}
}
вопрос по теме!
ТС, как вы думаете, как работает данный код и каково его место под солнцем?
1
6 / 6 / 1
Регистрация: 15.09.2013
Сообщений: 149
26.11.2013, 23:54  [ТС] 3
Вообще он работает,если вставить его в другое место,но файл записи тогда получается пустым..

Добавлено через 20 секунд
Работает только остановкой программы в еклипсе(красный квадратик)
0
Кандёхаем веселее!
296 / 328 / 76
Регистрация: 02.10.2012
Сообщений: 2,175
27.11.2013, 07:02 4
Силами одного кодера(не эксперта предметной области) реально реализовать только сравнение фрагментов. Как голосовые команды в мобилах.
1
92 / 59 / 8
Регистрация: 09.11.2011
Сообщений: 443
27.11.2013, 09:27 5
Цитата Сообщение от LanGrande Посмотреть сообщение
Прежде чем писать такую систему
надо устроиться в http://google.com поработать опыта понабраться
1
6 / 6 / 1
Регистрация: 15.09.2013
Сообщений: 149
27.11.2013, 13:46  [ТС] 6
Цитата Сообщение от tankomaz Посмотреть сообщение
ТС, как вы думаете, как работает данный код и каково его место под солнцем?
Хм.Имеется Сканнер если он не пустой(имеет что то), то присвоить это строке,если строка совпадает с буквой g,то остановить запись,примерно так)
Цитата Сообщение от Cheb Посмотреть сообщение
надо устроиться в http://google.com поработать опыта понабраться
Куда то я потерял пару ссылок,на тему устройства распознавания речи от гугл..
0
ɐwʎ ɔ vǝmоɔ dиw ɐʚонɔ
443 / 442 / 100
Регистрация: 14.10.2012
Сообщений: 1,146
Записей в блоге: 9
27.11.2013, 14:56 7
Java
1
2
3
Scanner sc = new Scanner(System.in);
String scc;
if (sc.hasNext()) {
что будет в переменной sc после инициализации? будет .hasNext работать или нет?
1
6 / 6 / 1
Регистрация: 15.09.2013
Сообщений: 149
28.11.2013, 19:30  [ТС] 8
Цитата Сообщение от tankomaz Посмотреть сообщение
что будет в переменной sc после инициализации?
Введенный нами текст,разве нет?))
Цитата Сообщение от tankomaz Посмотреть сообщение
будет .hasNext работать или нет?
Не знаю,наверно,будет)
Наверно правильнее было бы проверить sc на не null , а не так..

Добавлено через 12 минут
Пока на закуску пару ссылок:

http://habrahabr.ru/post/144580/

http://habrahabr.ru/company/yandex/blog/198556/

Добавлено через 1 час 9 минут
Почему то никак не могу воспроизвести звуковой файл.
Тут уже вопрос задвал:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import java.io.File;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.DataLine;
 
public class Main {
    public static void main(String[] args) {
 
        try {
            System.out.println("Start");
            File f = new File("c://music.wav");
            AudioInputStream source = AudioSystem.getAudioInputStream(f);
 
            DataLine.Info info = new DataLine.Info(Clip.class,
                    source.getFormat());
 
            Clip clip = null;
            if (AudioSystem.isLineSupported(info)) {
                clip = (Clip) AudioSystem.getLine(info);
            }
 
            clip.open(source);
            clip.start();
 
        } catch (Exception E) {
            System.out.println(E.getMessage());
 
        }
    }
}
Добавлено через 19 часов 7 минут
Ругается на эту строку:
Java
1
 clip.open(source);
Добавлено через 1 час 17 минут
Воспроизведение заработало!)

Первый вариант где то с хабра:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import java.io.File;
import java.io.IOException;
 
import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.FloatControl;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;
 
public class Test1 {
    private static AudioFileFormat.Type fileType = AudioFileFormat.Type.WAVE;
 
    public static void main(String[] args) {
 
        System.out.println("Start");
        String fileN = "C:\\test\\mix7" + "." + fileType;
        File soundFile = new File(fileN); // Звуковой файл
 
        AudioInputStream ais = null;
 
        try {
            ais = AudioSystem.getAudioInputStream(soundFile);
        } catch (UnsupportedAudioFileException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
 
        Clip clip = null;
 
        try {
            clip = AudioSystem.getClip();
            clip.open(ais);
        } catch (LineUnavailableException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
 
        FloatControl vc = (FloatControl) clip
                .getControl(FloatControl.Type.MASTER_GAIN);
 
        System.out.println(vc.getMinimum());
        System.out.println(vc.getMaximum());
 
        vc.setValue(5); // Громче обычного
 
        clip.setFramePosition(0);
        clip.start();
 
        try {
            Thread.sleep(clip.getMicrosecondLength() / 1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        clip.stop();
        clip.close();
 
    }
 
}
Второй вариант:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
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.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;
import javax.sound.sampled.UnsupportedAudioFileException;
 
public class Splay {
    private static final int EXTERNAL_BUFFER_SIZE = 1048576;// 128Kb
    private static AudioFileFormat.Type fileType = AudioFileFormat.Type.WAVE;
 
    public static void main(String[] args) {
 
        boolean playing = true;
        System.out.println("Start");
        String fileN = "C:\\test\\mix7" + "." + fileType;
        File f = new File(fileN);
 
        AudioInputStream source = null;
        try {
            source = AudioSystem.getAudioInputStream(f);
        } catch (UnsupportedAudioFileException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
 
        AudioFormat format = source.getFormat();
        System.out.println(format);
        SourceDataLine auline = null;
        DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);
 
        try {
            auline = (SourceDataLine) AudioSystem.getLine(info);
            auline.open(format);
        } catch (LineUnavailableException e) {
            e.printStackTrace();
            return;
        } catch (Exception e) {
            e.printStackTrace();
            return;
        }
        
        auline.start();
        
        int nBytesRead = 0;
        byte[] abData = new byte[EXTERNAL_BUFFER_SIZE];
 
        try {
            
            while(playing){
            while (nBytesRead != -1) {
                nBytesRead = source.read(abData, 0, abData.length);
                if (nBytesRead >= 0)
                    auline.write(abData, 0, nBytesRead);
                System.out.println("Фрейм " + auline.getFramePosition());
                System.out.println("Громкость " + auline.getLevel());
                System.out.println("Микро " + auline.getMicrosecondPosition());
            }
            }
        } catch (IOException e) {
            e.printStackTrace();
            return;
        } finally {
            auline.drain();
            auline.close();
        }
 
    }
}
Добавлено через 23 секунды
Осталось распознать!)

Добавлено через 39 минут
Отличная статья:
http://habrahabr.ru/post/140828/

Примерный план реализации уже есть!
(не для получения слова,а для получения MFCC векторов)

Ну и вот это(как ж без этого)
http://ru.wikipedia.org/wiki/Д... ание_Фурье
0
28.11.2013, 19:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.11.2013, 19:30
Помогаю со студенческими работами здесь

Рекуррентная НС для распознавания речи
Доброго времени суток. Стоит задача написать классификатор для кластеризации языка голоса. Языка...

Математическая модель распознавания речи
Здравствуйте,форумчане!!! Такой вопрос, наступил тот момент,пришла пора писать диплом. Диплом...

Динамический вывод распознавания речи
Как можно сделать динамический вывод голоса в текст? То есть во время разговора оно заполняет...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru