매트랩에서는 audioread, audiowrite을 통해서 음성 파일 입출력이 가능합니다.
1. 녹음하기
recorder1 = audiorecorder(48000,16,1)
disp('Start');
recordblocking(recorder1, 3);
disp('End');
위 코드는 3초 동안 컴퓨터에 연결된 마이크를 통하여 3초간 음성을 입력받습니다.
코드를 보면,
recorder1 = audiorecorder(48000,16,1)
48000Hz의 Sampling Rate, 16비트로 Quantization(Bits per sample)하며, 1개의 채널로 입력받는 recorder1을 생성합니다. 이 명령의 결과는 다음과 같습니다.
recorder의 상세한 정보를 볼 수 있습니다.
disp('Start');, disp('End');
이는 녹음을 시작하기 전, 끝난 후에 명령 창에 시작했다 끝났다를 알려주기 위하여 추가하였습니다. disp('**') 명령은 따옴표 안의 문자열을 display 합니다.
recordblocking(recorder1, 3);
이것이 녹음을 하는 부분인데, 앞서 만들었던 recorder1이라는 recorder로 3초간 녹음을 하겠다는 명령입니다.
2. .wav 파일 생성
filename1 = '48000Hz16bit.wav';
y1 = getaudiodata(recorder1);
audiowrite(filename1, y1, 48000);
filename1 = '48000Hz16bit.wav';
우선 filename1이라는 변수에 string 값으로 이름을 지어줬고, 이것이 우리가 .wav로 만들 파일명입니다. 뒤에 '.wav'를 추가시켜야 합니다. 여기서 저 filename을 단순히 이름과 .wav로 지으면 matlab의 현재 작업공간 아래에 파일이 생성됩니다. 저 filename에는 경로(상대 경로, 절대 경로) 지정을 통하여 파일 생성 위치를 바꿀 수 있습니다.
예를 들면,
1. filename1 = './48000Hz16bit.wav' - 상대경로, 현재 작업공간 디렉토리 바로 위 층에 저장
2. filename1 = 'C:/Sound/48000Hz16bit.wav' - 절대경로, 저 디렉토리 경로에 저장, 저 경로, 폴더가 존재해야 합니다.
y1 = getaudiodata(recorder1);
recorder1에는 앞서 recordblocking을 통하여 3초간 녹음을 하여 데이터가 저장되어있고, getaudiodata를 통하여 y1이라는 배열 변수에 그 데이터를 불러옵니다.
y1의 결과에 대해서 잠깐 살펴보자면, 다음과 같습니다.
y1은 144000*1 double형 변수로 저장되었습니다. 여기서 144000은 앞서 결정했던 초당 Sample수인 48000이 3초간 녹음되어 48000*3으로 결정된 숫자입다.
audiowrite(filename1, y1, 48000);
마지막으로 audiowrite를 통하여 앞서 결정한 filename1과 y1을 합쳐, .wav 파일로 만들 수 있습니다.
3. .wav 파일 읽기
[readY, Hz] = audioread(filename1)
plot(readY)
읽기는 더욱 단순합니다.
[readY, Hz] = audioread(filename1)
이 명령은은 readY라는 변수에는 앞서 만든 y1과 같은 double형 배열을 입력하고, Hz에는 Sampling Rate를 반환합니다.
결과는 다음과 같습니다.
이를 더 눈에 잘 들어오게 보기 위해서는 그래프를 그리는 것이 더 나을 것입니다. Matlab에는 여러 plot들이 존재하고, 다양한 방식으로 plot의 형태, 특성, 표시를 바꿀 수 있지만,
plot(readY)
여기서는 이 한 문장으로 그래프를 그릴 수 있습니다. 이 또한 plot이기 때문에 색 지정 등도 할 수 있습니다.
결과는 다음과 같습니다.
가로축은 아까 나온 144,000으로 단순히 readY라는 배열에 있는 데이터를 1부터 144,000까지 그래프로 그린 것입니다.
4. 스펙트로그램 (Spectrogram)
spectrogram(readY, 'yaxis')
우선 결과는 다음과 같습니다.
스펙트로그램이란 쉽게 생각하면 긴 음성(3초)를 짧은 시간동안 푸리에 변환(Fourier transform)을 하여 긴 음성을 시간별로 어떠한 주파수가 많은지를 보여줍니다.
위 그래프를 참고하자면, 가로축이 0부터 3초이니 약 1.5초 쯤부터 정규화 주파수가 0.03정도인 부분의 크기가 -30dB/(rad/sample) 정도로 큰 값을 보여준다는 정보를 얻을 수 있습니다.
녹음한 plot을 보면 1.5초 쯤부터 큰 값이 들어온다는 점을 알 수 있고, 제가 이때부터 녹음을 했기 때문입니다. 때문에 처음과 끝에서는 특별히 들어온 소리가 없고, Spectrogram에서도 모두 파란빛으로 모든 주파수 영역대에서 특별히 눈에 띄는 주파수가 없다고 확인할 수 있습니다.
정규화 주파수는 저 음성 샘플에 존재하는 가장 큰 주파수를 기준으로 0부터 1로 정규화시킨 것을 의미합니다.
이 Spectrogram은 시간대 별로 주파수에 따른 음성 신호의 크기를 분석할 수 있습니다.
이는 후에 음성에 filter를 씌울 때 추가로 보도록 하겠습니다.
'Matlab' 카테고리의 다른 글
[프로젝트 1] 이미지 지도 - 2 (테이블과 셀형 배열) (6) | 2019.06.30 |
---|---|
[프로젝트 1] 이미지 지도 (like 스마트폰 앨범) - 1 (2) | 2019.06.29 |
[이미지처리] 2. 이미지에 각종 효과 적용하기 (Conv2, Spatial filter; Gamma, Blur) (0) | 2019.06.10 |
[이미지처리] 1. 이미지 파일(.jpg) 읽고 다루기 (매트랩의 각종 함수) (0) | 2019.06.09 |
[음성 처리] 3. 음성의 높낮이, 발음 구분하기 (Speech recognition) (5) | 2019.04.22 |
[음성 처리] 2. 음성에서 노이즈 제거하기 (Noise suppression) (3) | 2019.04.22 |