Matlab코딩한것을 해석하면서 진행합니다.

해밍윈도우 등은 Matlab함수로 구현 가능하지만 Java에서의 구현을 위하여 일일이 구현하였습니다.


사용한 음성은 umbrella.wav파일입니다.


%test STFT

clear


[Y,FS,NBITS, Readinfo]=wavread('umbrella.wav');

%umbrella.wav라는 파일을 볼러왔습니다. 

%Y      : 신호정보

%FS    : Sampling Frequency 22050Hz

%NBITS: BPS(Bit Per Sample), 16bit

%Readinfo : 파일헤더 구조체. 각종 정보 포함


sound(Y,FS);                                           %사운드 출력                 

len=length(Y);                                          %음성신호 길이

time=len/FS;                                            %파일의 재생시간: 초당 22050의 신호를 캡처하기 때문에 신호 Y의 길이가 20160이라면 재생시간은 0.9몇초가 된다.


figure;

x=linspace(1,time,len);                              %그래프의 시간축 설정. 0~0.9몇초를 신호의 길이만큼 분할

plot(x,Y);                                                 %신호 그래프 출력



%start stft

y=Y(1:len,1);                                        %음성신호를 y로 옮겨놓았음


%% windowing

R =2^9;                                                % R: window len. Windowing할 때의 창의 길이

W =0.54-0.46*cos(2*pi*(1:R)/R); W=W';   % w :해밍윈도우. 공식 적용한 값

N = 2^(nextpow2(length(W)));%2^9;        % N: FFT resolution.주파수 분해능,주파수, 그래프의 날카로움

L = ceil(R*0.1);                                    % L: number of non-overlap samples

overlap = R-L;                                     % Overlap(겹침처리)이 클수록 분해능이 좋음(속이 비거나 차는것) 현재 4

                                        

%%Type1


c=1;

h=(1+(len-R))/(1+R/2);                        %must be integer. 낮을수록 시간축 고분해능. R의 크기에 따라 자동으로 정수값으로 잡도록 하였음

h=fix(h*3/3);                                       %FS/h= overlap


d = zeros((1+R/2),1+fix((len-R)/h));


for b = 0:h:(len-R)                               %(b+1:b+R)의 길이=윈도우의 길이

  u = W.*y((b+1):(b+R));

  t = fft(u);                                           %해밍윈도우에 신호값을 곱해준 후 fft를 통하여 주파수도메인으로 분석

  d(:,c) = t(1:(1+R/2))';                         %각 윈도우 영역마다의 값을 대입

  c = c+1;

end;


time=linspace(0,timeleng,size(d,2));     %시간벡터. 재생시간을 그래프 배열크기에 맞추어 분할해줍니다.

freq=linspace(0,FS/2,size(d,1));          %주파수벡터. 위와 같은맥락

[X,Y]=meshgrid(time,freq);                  %3차원 그래프를 출력하기 위하여 2차원 평면 X와 Y 2개를 만듭니다.


figure;

mesh(X,Y,abs(d));                            %spectrogram 출력


STFT Type1

%%Type2

%Matlab내 함수 이용


[S F T] = spectrogram(y,W,overlap,N,FS);

%S : signal

%F : 관측할 수 있는 주파수배열

%T : 관측할 수 있는 시간배열. Overlap에 의한 분해능에 의존

                            %R에도 의존(Window 크기)

                            %R>Overlap

Z=abs(S);


[mX,mY]=meshgrid(T,F);    %2차원 평면 mX, mY 생성

figure;

mesh(mX,mY,Z);

figure;

contour(mX,mY,Z);            %등고선 그래프 출력


STFT_Type2

Contour 그래프



현재 Type1과 Type2의 Spectrogram의 정확도? 가 다르다는걸 눈으로 보아도 알 수 있습니다... 물론 보는 각도 때문에 그렇게 보일수도 있습니다만.


Type1의 경우 overlap을 계산하면 약290이 나옵니다.

반면 Type2의 경우 overlap을 490으로 설정해놓았습니다.

Type1의 h에 대한 식 h=fix(h*3/3); 에서 다음과 같이 바꾸어 보겠습니다.

h=2^(nextpow2(h));    이때 오버랩은 344정도 나옵니다. 그리고 그래프는



왼쪽이 Type1이고 오른쪽이 아까와 같은 오버랩의 Type2입니다. 거의 똑같죠?

굳이 nextpow쓸 필요는 없구요. h값을 낮추어주면 오버랩이 오릅니다. 오버랩이 클수록 그래프가 좀더 빽빽해지고 속이 덜 비겠죠?

Matlab함수에서 인수로 주는 오버랩 값 등의 제한에 대해서는 직접 함수를 사용해서 확인해보기 바랍니다.


위의 N은 nfft라고 FFT resolution입니다. 이 값이 낮으면 그래프가 삐죽빼죽 날카록게 되요. 덜 연속적이라서 그런거죠.

R값은 window길이인데, 매트랩 함수에서는 이 값도 잘 생각해줘서 넣어줘야 합니다. 높을수록 많은 정보를 담을 수 있겠지만 지나치면 연상량이 너무 많아지겠죠?


STF


2차원의 파워스펙트로그램입니다. 이걸 직접 구현할 수 있으면 좋겠는데 아직 거기까지는 잘 안되네요.

이부분은 추후에 구현하기로 하고 오늘 STFT는 여기서 끝!


다음편은 Mel-Filter bank 적용입니다.

'Project > 음성평가시스템' 카테고리의 다른 글

현재 진행상황  (0) 2013.08.19
특징추출3. Mef filter bank 영문설명  (0) 2013.08.14
특징추출1. Preemphasis  (0) 2013.08.12
과제진행순서  (0) 2013.08.08
Flow_chart  (0) 2013.08.07
Posted by 십자성군

영어발음 Apple에 Preemphasis를 해봅시다.


문제점 : 방음공간에서 된 샘플데이터라서 Preemphasis의 중요도가 낮아집니다. 잔기침 등등이 섞여있다면 좋겠습니다만..


추. Preemphasis 및 잡음제거는 나중으로 돌립니다.


우선은 특징추출부터 먼저 하고(음원이 깨끗하기 때문에) 유사도평가 후 잡음제거 및 Preemphasis를 하도록 하겠습니다

'Project > 음성평가시스템' 카테고리의 다른 글

특징추출3. Mef filter bank 영문설명  (0) 2013.08.14
특징추출2. 영어음성 STFT하기  (1) 2013.08.13
과제진행순서  (0) 2013.08.08
Flow_chart  (0) 2013.08.07
괜찮은 음성분석 소프트웨어 [Praat]  (0) 2013.08.07
Posted by 십자성군



Matlab을 이용한 구현 및 신뢰도 확부후 Java로 재구현

'Project > 음성평가시스템' 카테고리의 다른 글

특징추출2. 영어음성 STFT하기  (1) 2013.08.13
특징추출1. Preemphasis  (0) 2013.08.12
Flow_chart  (0) 2013.08.07
괜찮은 음성분석 소프트웨어 [Praat]  (0) 2013.08.07
개발환경준비  (0) 2013.08.06
Posted by 십자성군

설계부분. 미완성







'Project > 음성평가시스템' 카테고리의 다른 글

특징추출1. Preemphasis  (0) 2013.08.12
과제진행순서  (0) 2013.08.08
괜찮은 음성분석 소프트웨어 [Praat]  (0) 2013.08.07
개발환경준비  (0) 2013.08.06
프로젝트 개요  (1) 2013.08.06
Posted by 십자성군

굉장히 좋은 음향분석 소프트웨어가 있습니다.

Praat라고 합니다. 제가 목표로 하는 기능까지 포괄하고 있으며 홈페이지에서 각종 음성학적 기술 소개 및 알고리즘이 있습니다. 거기에 소프트웨어도 오픈소스로 이를 분석하면 과제에 대해 여러가지로 도움이 될 듯 합니다.


http://www.fon.hum.uva.nl/praat/


관련 메뉴얼(2003 년도) 함께 첨부하며 이 역시 음성학 공부에 도움이 되겠습니다.


추가로 과제를 위해서 약간 추려놓은 워드파일을 함께 첨부합니다.


여기서 메뉴얼을 받을 수 있습니다.

http://fonetiks.info/praat/



Praat 기반 학습내용 정리.docx


'Project > 음성평가시스템' 카테고리의 다른 글

과제진행순서  (0) 2013.08.08
Flow_chart  (0) 2013.08.07
개발환경준비  (0) 2013.08.06
프로젝트 개요  (1) 2013.08.06
프로젝트로 음성평가 시스템을 만들어야 합니다.  (0) 2013.08.06
Posted by 십자성군

개발환경


1. Matlab

2. Java, Android SDK

3. JMat(Java Matlab)


.Java설치


http://www.oracle.com/technetwork/java/javase/downloads/index.html

에서 최신버전의 Java JDK를 설치합니다. 32비트, 64비트를 잘 고려합시다.


시스템 환경변수를 설정합니다.

환경변수-시스템 변수로 들어가서 경로를 넣어줍시다.

저같은 경우 C:\Program Files\Java\jdk1.7.0_25\bin; 입니다.


cmd에서 javac를 확인합니다.


.Eclipse설치

안드로이드 앱을 만들것이기에 http://www.eclipse.org/에서 Eclipse for Mobile Developers를 설치했습니다.

압축을 풀고 바로 사용하지는 못할것입니다. eclipse설치 폴더에서 ini확장자를 가진 파일을 열어줍니다.

javaw의 설치경로를 다음과 같이 넣어줍니다.

-vm

C:\Program Files\Java\jdk1.7.0_25\bin\javaw.exe

-startup plugins.......


안드로이드 개발환경 설정입니다.

http://mara.tistory.com/306

'Project > 음성평가시스템' 카테고리의 다른 글

과제진행순서  (0) 2013.08.08
Flow_chart  (0) 2013.08.07
괜찮은 음성분석 소프트웨어 [Praat]  (0) 2013.08.07
프로젝트 개요  (1) 2013.08.06
프로젝트로 음성평가 시스템을 만들어야 합니다.  (0) 2013.08.06
Posted by 십자성군

공부하고 준비한대로 발표가 되지 못해서 아쉬웠습니다...

이 페이지에서는 개략적인 설명을 하겠지만 프로젝트를 진행하면서 각 부분에 대해서 자세하게 설명하겠습니다.

PPT파일 딸랑 하나 올리는것보다 이쪽이 더 낳을것 같네요.


1

영어발음평가 시스템 개발부분을 맡게 됐습니다.


2


영어발음 학습 앱입니다. 학습자가 영어단어를 검색하고 이 발음을 TTS로 이루어진 음성으로 듣게됩니다.

발음평가를 실행하여 학습자의 발음을 녹음합니다.(여기까지는 일반적인 앱과 같습니다.)

TTS의 발음과 사용자 입력 음성간의 분석을 통하여 발음을 비교하고 수치적인 평가와 시각적인 파형을 출력해 줍니다.

음성이 저속으로 재생되면서 상태표시바가 움직이기 때문에 어느 지점에서 어떤식으로 발음이 다른지 알 수 있습니다.


피드백을 받았는데 특징추출 후의 단순한 파형매칭으로는 학습자에게 도움이 안됩니다. 음성학적인 접근에서 억양(pitch), 강세(intensity), 지속시간(duration), 음색(timbre) 특징의 매칭 비교가 필요합니다.


3.


분석부의 개략적인 흐름입니다. 음성신호가 입력된 후 잡음처리 및 전처리를 한 후, MFCC기법으로 특징을 추출합니다. DTW기법으로 특징 유사도를 평가한 후 평과결과 및 파형을 출력합니다.


4.


음성의 분석전에 두 신호의 빅에서 장해가 되는 잡음을 제거해야 합니다. 외부 잡음의 제거 기법으로 널리 사용되는 스펙트럼 차감법을 이용할 것입니다.


5.


스펙트럼 차감법은 '시간영역의 신호'를 '주파수영역 의 신호'로 변환 후 입력신호 스펙트럼 크기와 잡음 스펙트럼 크기를 추정하고 추정된 입력신호 스펙트럼 크기에서 잡음 스펙트럼 크기를 차감합니다.

그래프를 보면 음성인식분야의 경우 잡음제거를 했을 때의 인식률이 월등히 높다는 것을 알 수 있습니다.


6.


MFCC에 들어가기 전에 기침등의 가벼운 잡음을 제거합니다.

zcr(zero cross rate:영교차율)과 ster(short term energy rate:단기에너지율?)의 임계값을 설정하여 이를 벗어나는 값을 제합니다.

이를 통해 인간의 청각시스템이 1kHz이상의 스펙트럼 영역에 민감하다는 것을 어느정도 보상 가능합니다.


7.

MFCC를 통한 특징추출의 개략적인 진행입니다.

MFCC는 음성을 작은 구간으로 나누고 각각의 구간에서 특징을 추출하는 방법으로 MFCC의 mel은 인간의 귀가 갖는 비선형적인 주파수 특성(log)를 나타내는 단위입니다.

입력된 음성신호는 Pre-emphasis를 통하여 '음성부분'을 강화시키고, windowing과 STFT를 통해 시간.주파수영역의 파워스펙트로그램을 얻습니다. 이를 Mel filter Bank에 통과시킴으로 오디오스펙트로그램을 얻은 후 로그화를 통해 Envelope와 백색잡음을 분리하고 이에DCT(Descrete Cosine Transform)을 거쳐 '큐프렌시'영역의 MFCC를 구한다. 여기에 'liftering'을 하여 가중치를 보상한 후 에너지와 델타(속도) 및 더블델타(가속) 특징을 통해 특징추출을 보조합니다.


8.


Pre-emphasis : 전송 주파수의 특정 부분을 사전에 강조합니다. 이를 통하여 신호 대 잡음비, 주파수 특성, 일그러짐 특성을 개선하고 '포만트'를 강조합니다.

고역통과로 신호주파수가 높은쪽을 강하게 변조합니다. 사람의 발성구조에 숨겨진 고주파 성분의 보상과 '고주파 포만트의 중요도'를 강조합니다.


9.


FFT를 사용하면 주파수 도메인에 대하여 신호를 처리하게 됩니다. 그러나 이 경우에는 시간적인 변화가 많이 반영되지 않을 수 있기에, windowing과 함께 STFT를 통하여 스펙트럼 성분이 변하지 않는 짧은 순간의 연속을 분석하여 시간영역에 따른 정보도 함게 얻게됩니다. 이렇게 시간-주파수 도메인에 근거한 Spectrogram을 구하게 됩니다.


10.


STFT한 결과는 프레임당 샘플량이 많습니다. 이 많은 데이터 양에서 적절한 파라메터를 뽑아주어야 합니다. Mel-scale filter bank에 통과시켜 음성신호의 주파수 대역을 다수개의 대역통과 필터에 의해 분할하여 필터뱅크 에너지를 구합니다. 이것이 Audio Spectrogram 입니다. 멜주파수와 주파수는 1kHz 이상부터 로그함수의 관계를 가지고 이는 청각기관의 주파수에 따른 반응과 유사합니다.


11.


앞에서 구한 Audio Spectrogram 에서 log화를 시키면 곱해져 있는 두 성분의 분리가 가능합니다.

log화를 통하여 음성신호를 엔빌로프와 백색잡음으로 나눕니다. 이 엔빌로프에 대하여 DCT를 곱해줌으로 Mel-주파수 도메인을 '큐프렌시'도메인으로 표현하게 됩니다.

이 과정에서 DCT에 의한 과도한 압축에 의해 저순위의 캡스트럼 계수에 과도한 가중치가 주어질 수 있는데요. 이를 liftering을 통하여 보상할 수 있습니다.


이후 Delta와 Double-Delta특성을 구하여 특징추출을 더 정확히 하는데, 이 부분은 실험을 하면서 설명해야겠습니다.


12.


발음평가부분입니다. DTW로 발음평가를 하기전에 끝점추출을 통해 시작부분과 끝부분을 검출합니다.

실시간 음섬검출에서, 고립단어 등에서 상당히 중요합니다.

영교차율과 구간에너지를 통하여 끝점을 추출합니다만 실시간 영역에서는 부적한 면이 있다고 하니 이에 맞는 변형이 필요하다고 합니다.


13.


발음평가 부분입니다. 음성인식에서는 사용자 입력음성과 비교하여 가장 거리가 짧은 참조패턴을 찾아내는데 사용되었으나 이와같이 대사상이 되는 참조패턴이 명백한 상태에서 패턴간의 거리를 측정하여 발음 유사도 평가에 반영한다는 것이 애초의 목표였습니다. 그러나 피드백을 받은 후, 억양, 강세등의 음성학적 특징을 따로 골라내어 발음평가를 하도록 합니다. 각 음성학적 요소에 가중치를 줍니다. 이부분이 굉장히 미묘하고 복잡한 부분입니다. 단순히 DTW를 사용해서는 단순 매칭이 될 수 밖에 없으며 성대모사가 목표가 아니니까요. 발음(강세, 억양, 속도, 높이, 음색)을 반영해야 하는것입니다.


1. 입력된 발음이 대상과 같은 의미를 지니는 지를 먼저 판별합니다. 여기에서는 STT가 사용될 수도 있습니다.

2. 위와 같은 의미로 엔빌로프의 비교를 행합니다.

3. 강세 억양등 각각의 음성학적 특징벡터를 추출하고 서로 비교하도록 합니다.



-----------------------------------------------------

아직 여러가지 면에서 부족하고 진행중에 방향을 바꾸는 부분이 생길거라 생각합니다. 이는 프로젝트를 진행하면서 반영하도록 하겠습니다.

'Project > 음성평가시스템' 카테고리의 다른 글

과제진행순서  (0) 2013.08.08
Flow_chart  (0) 2013.08.07
괜찮은 음성분석 소프트웨어 [Praat]  (0) 2013.08.07
개발환경준비  (0) 2013.08.06
프로젝트로 음성평가 시스템을 만들어야 합니다.  (0) 2013.08.06
Posted by 십자성군

프로젝트로 음성평가 시스템을 만들어야 합니다...

3개월이라서 열심히 꼬박꼬박 해야합니다. 퀄리티도 중요하기 때문에 이 프로젝트가 끝났을 무렵에는 블로그가 풍성할듯.

'Project > 음성평가시스템' 카테고리의 다른 글

과제진행순서  (0) 2013.08.08
Flow_chart  (0) 2013.08.07
괜찮은 음성분석 소프트웨어 [Praat]  (0) 2013.08.07
개발환경준비  (0) 2013.08.06
프로젝트 개요  (1) 2013.08.06
Posted by 십자성군