1)한줄요약 : 머신러닝을 활용한 위험소리알림,오픈소스 활용한 음성인식기능,SOS기능,보호자 등록 기능을 가진 안드로이드 앱을 제작

+비상알림벨: 경적,화재경보음,아기울음소리 등 위험소리를 감지하여 그 종류를 알려준다. 소리데이터 즉각적인 인지를 위해 진동을 발생시키고, 소리를 분석하여 화면에 이미지로 출력한다.          

+소음측정기: 주변의 소음정도를 측정해 적절한 발화를 돕는다. 데시벨을 측정해 크기에 맞춰 LED를 점등시킨다.

+원터치 신고: 사회적 약자인 장애인을 겨냥한 범죄를 즉각 대처할 수 있도록 돕는다. 버튼을 특정 패턴으로 누르면 작동되어, 실시간으로 사용자의 위치와 녹음 파일을 서버로 전송한다.

+음성인식: 원활한 대화를 위해 상대방의 음성을 인식하여 모니터에 텍스트로 출력한다.

 

2)본인 역할 : 위험소리알림기능을 전담함. mfcc로 wav파일 특징값을 추출하고 ,svm으로 모델에 학습시켜 샘플의 분류결과값을 지정. 자신의 역할을 끝낸 뒤  안드로에드에서 모듈들을 합치는 것을 도와줌.

+팀원:천재영(웹),박진청(데이터베이스),이은경(소음측정기,음성인식),박신혜(원터치신고,구글맵)

 

3)본인이 사용한 스킬 : JAVA,Machine Learning(MFCC+SVM)

+팀원스킬: Google Map Api, Naver Speech Api,Android,PHP,Mysql

 

4)힘들었던 점: 

+머신러닝이 어렵고 낯설었던 점->기술 레퍼런스,구조도를 활용해 맥락을 파악하려고 노력하며 디버깅

+머신러닝 분류기 선택할 때 팀원들을 설득하던 것->분류기마다 특성을 정리해 SVM이 더 적합한 이유를 얘기

+추출기의 출력 포맷이 분류기의 입력 포맷과 달랐는데 추출기 내부 함수를 수정하기 어려웠음->다른 IDE에서 미니 전처리 프로그램을 따로 만듬. 추후에 내부 함수 또한 수정하는데 성공했음.

 

[전체구조도]

 

 

 

[미니전처리기를 통해 포맷팅을 한 결과]

 

[제공되는 GUI를 활용하는 모습- 라이브러리는 livsvm 사용]

[실제 프로젝트 결과 모델의 분류 정도]

 

 

[실제 완성본 모습-데시벨 증가하는 모습, 분류해서 push 알림으로 도착한 모습, 보호자 로그인 기능..(다른 기능들은 사진이 없다)]

 

 

 

 

 


그 외의 자료들...

 

[주요 코드 1]

 

package edu.iitb.frontend.audio.feature;

import java.io.DataOutputStream;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.util.Vector;

import javax.sound.sampled.AudioInputStream;

import javax.sound.sampled.AudioSystem;

import javax.sound.sampled.UnsupportedAudioFileException;

import edu.iitb.frontend.audio.util.AudioPreProcessor;

import edu.iitb.frontend.audio.util.MFCC;

import java.io.BufferedWriter;

import java.io.FileWriter;

import java.io.IOException;

 

 

public class FeatureFileExtractor {

    static float sampleRate = 8000;

    public static int newWindowSize = 205;

    public static int hopsize = 80;

    static int numberCoefficients = 13;

    static double minFreq = 133;

    static double maxFreq = 3500;

    static int numberFilters = 31;

    /*    테스트 코드

    public static void main(String argv[]) throws IOException, IllegalArgumentException, UnsupportedAudioFileException {

        FeatureFileExtractor t = new FeatureFileExtractor();

        t.computeFeatures("siren15", "/Users/KCE/Desktop/capstone/total_train_wav/siren", "/Users/KCE/Desktop/capstone/total_train_wav/siren");

    }*/

    static int label = 1;  //분류값

 

    public static void computeFeatures(String fileName, String inputFolder, String outputFolder)   //문제의 포맷팅 처리 부분..기존에 visual stuio로 수정했지만 eclipse에서도 수정할 수 있게 됐다!

            throws IllegalArgumentException, IOException, UnsupportedAudioFileException {

 

        // WAV파일 읽음

        String wavFile = inputFolder + "/" + fileName + ".wav";

        System.out.println("converting " + wavFile + " to mfc");

        File soundfile = new File(wavFile);

        AudioInputStream audioIn = AudioSystem.getAudioInputStream(soundfile);

        AudioPreProcessor in = new AudioPreProcessor(audioIn, sampleRate);

        boolean useFirstCoefficient = true;

        

        //MFCC처리 

        MFCC feat = new MFCC(sampleRate, windowSize, numberCoefficients, useFirstCoefficient, minFreq, maxFreq,

                numberFilters);

        Vector<double[]> features = feat.process(in, audioIn);

        System.out.println("Vector Size :" + features.size());

 

        // 포맷팅

        BufferedWriter out = new BufferedWriter(new FileWriter("/Users/KCE/Desktop/capstone/not_trained_data/test.txt"));

        try {

            // create file output stream

            double arr[];

            for (int i = 0; i < features.size(); i++) {

                arr = features.get(i);

                if ((float) arr[0] < 30 && (float) arr[0] > -30) { // null

                    System.out.print(label + " "); // label

                    out.write(label + " ");        // label

                }

                for (int j = 0; j < arr.length; j++) {

                    if ((float) arr[j] < 30 && (float) arr[j] > -30) { // null

                        System.out.print(j + 1 + ":" + (float) arr[j] + " ");

                        out.write(j + 1 + ":" + (float) arr[j] + " ");

                        if (j == arr.length - 1)

                            System.out.println();

                        //String numberAsString = new Float((float) arr[j]).toString(); // float -> string

                        //out.write(numberAsString + " ");

                    }

                }

                if ((float) arr[0] < 30 && (float) arr[0] > -30) // null

                    out.write("\n");

            }

            out.flush();

            out.close();

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

}

 

 

 

 

[주요 코드 2]

 

import java.io.IOException;

import javax.sound.sampled.UnsupportedAudioFileException;

import edu.iitb.frontend.audio.feature.FeatureFileExtractor;

 

public class test {

 

    public static void main(String argv[]) throws IOException, IllegalArgumentException, UnsupportedAudioFileException

    {

        FeatureFileExtractor Feature = new FeatureFileExtractor();   

        Feature.computeFeatures("",                 // wavfile_name

                                "/Users/KCE/Desktop/capstone/total_train_wav/bark",     // input_file_dir

                                "/Users/KCE/Desktop/capstone/bark");    // output_file_dir

        svm_predict Predict = new svm_predict();

        String dir[] = {"/Users/KCE/Desktop/capstone/not_trained_data/test.txt",             // test_file(예측 시도해 볼 입력 파일)

                        "/Users/KCE/Desktop/capstone/model/traintrain.txt.model",    // model_file(모델파일이 있는 경로)

                        "/Users/KCE/Desktop/capstone/model/traintrain.txt.out"};        // output_file(예측 결과가 저장되는 경로)

        Predict.main(dir);   //만들어진 모델로 예측

        System.out.println(Predict.case_num);

        if(Predict.case_num==1)  //무슨 소리인지 분류 결과값 리턴

            System.out.println("baby");

        else if(Predict.case_num==2)

            System.out.println("bark");

        else if(Predict.case_num==3)

            System.out.println("drill");

        else if(Predict.case_num==4)

            System.out.println("fire");

        else if(Predict.case_num==5)

            System.out.println("siren");

    }

    

}

 

 

[프로젝트 진행사항 전달]

 

+참고자료: http://keunwoochoi.blogspot.kr/2016/01/blog-post.html : 다른 분류기를 사용하여 음악장르 분류 포스팅한 블로그

 

설명: 왼쪽부터 머신러닝 프로세스, 사용된 mfcc 파일,wav 파일이다.

원데이터는 분석을 위해 mp3아닌 wav파일 사용,프레임 길이 고려하여 5초 단위로 잘랐음. 축적된 데이터는 아기울음소리, 개짖는 소리, 사이렌소리,소방벨 소리 총 81개의 파일. 

 

 

 

 

 

'Project' 카테고리의 다른 글

[툰츄]  (0) 2019.11.06
[부귀영화-영화 추천 서비스]  (0) 2019.10.25
[WaterMelon-음원 사이트]  (0) 2019.10.25
[MARK- 길건너기 2D 게임]  (0) 2019.10.25
[hearable watch-청각장애인용 스마트 워치]  (0) 2019.10.25

+ Recent posts