본문 바로가기
Matlab

[음성 처리] 1. 음성 파일(.wav) 녹음 및 정보 확인하기

by 두재 2019. 4. 21.

 

 

매트랩에서는 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의 데이터는 위와 같습니다.

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')

우선 결과는 다음과 같습니다.

Spectrogram은 이러한 그림을 그립니다.

스펙트로그램이란 쉽게 생각하면 긴 음성(3초)를 짧은 시간동안 푸리에 변환(Fourier transform)을 하여 긴 음성을 시간별로 어떠한 주파수가 많은지를 보여줍니다.

위 그래프를 참고하자면, 가로축이 0부터 3초이니 약 1.5초 쯤부터 정규화 주파수가 0.03정도인 부분의 크기가 -30dB/(rad/sample) 정도로 큰 값을 보여준다는 정보를 얻을 수 있습니다.

녹음한 plot을 보면 1.5초 쯤부터 큰 값이 들어온다는 점을 알 수 있고, 제가 이때부터 녹음을 했기 때문입니다. 때문에 처음과 끝에서는 특별히 들어온 소리가 없고, Spectrogram에서도 모두 파란빛으로 모든 주파수 영역대에서 특별히 눈에 띄는 주파수가 없다고 확인할 수 있습니다.

정규화 주파수는 저 음성 샘플에 존재하는 가장 큰 주파수를 기준으로 0부터 1로 정규화시킨 것을 의미합니다.


이 Spectrogram은 시간대 별로 주파수에 따른 음성 신호의 크기를 분석할 수 있습니다.

이는 후에 음성에 filter를 씌울 때 추가로 보도록 하겠습니다.