728x90
728x90
연구 관련해서 음성 데이터를 사용할 일이 생겼다.
보통 음성 데이터를 Raw data로 사용하면 용량이 너무 커지므로 딥러닝에서는 음성의 feature를 추출하여 사용한다. 이때 가장 많이 사용하는 음성 특징 추출 방법이 mel spectrogram이다.
이번 글에서는 mel spectrogram이 무엇인지, 그리고 어떻게 뽑아내는지에 대해 알아보고자 한다.
1. mel spectrogram이란?
소리의 파형을 인간이 들을 수 있는 범위로 줄인 mel scale로 다운 스케일한 이후, 그 파형을 그림으로 그린 모양이다.
2. 어떻게 뽑아낼 수 있을까?
librosa library를 사용하면 된다. 스크립트를 보면 다음과 같다.
audio_file = "sound.wav"
y, sr = librosa.load(audio_file)
sr = 44100
mel_spec = librosa.feature.melspectrogram(y=y, sr=sr, n_fft=2048, hop_length=1024)
mel_spec = librosa.power_to_db(mel_spec, ref=np.max)
plt.figure(figsize=(8,6))
librosa.display.specshow(mel_spec, y_axis='mel', fmax=8000, x_axis='time')
plt.title('Mel Spectrogram' + audio_file)
plt.colorbar(format='%+2.0f dB')
간단한 스크립트지만, 하나하나씩 살펴보자.
1. librosa.load(audio_file, sr = ~~)
- 오디오 파일을 로드하는 코드이다.
- sample rate는 sr값으로 지정해줄 수 있는데 값을 지정해주지 않으면 디폴트 값인 22250으로 샘플링된다.
- 만약 원본 샘플 레이트를 유지하고 싶으면 sr = None을 넣어주면 된다.
- y와 sr을 return한다.
- y: numpy Ndarray의 형태로 주어진다. mel-spectrogram을 뽑기 위해서 y 값을 넣어주면 된다.
2. librosa.feature.melspectrogram(y = y, sr = sr, n_fft = ~~, hop_length = ~~)
- mel spectrogram을 만드는 코드이다.
- mel spectogram을 만드는 원리를 간단하게 살펴보면, 푸리에 변환을 사용하여 Time Domain s(t)를 Frequency Domain D(w)를 만든다고 한다.
- n_fft는 한번의 STFT를 적용하는 길이(window_length)를 말한다. 즉, 음성의 길이를 얼마만큼으로 자를 것인가? 라고 이해하면 될 것 같다.
- hop_length는 window 사이의 길이를 의미한다. 즉 (n_ftt - hop_length) 만큼 음성의 magnitude를 겹친 상태로 칸을 잘라준다고 생각하면 될 것 같다.
- hop_length보다 n_fft가 긴 경우에는 padding이 필요할 수 있다.
3. librosa.power_to_db(mel_spec, ref = np.max)
- 소리의 압력은 20 마이크로파스칼부터 20Pa까지 백만 정도의 스케일이 있는데, 인간이 귀로 들을 수 있는 소리는 작은 범위에 지나지 않는다고 한다.
- ref로 np.max를 넣어줘서, 소리의 최댓값은 0db으로 매칭시키고, 다른 값들은 -로 잡는다.
- 또한 범위의 한계가 디폴트값으로 80db로 되어있어서, -80db보다 낮은 값은 모두 -80db로 나온다.
- power_to_db를 했을 때와 안했을 때의 차이는 아래 그림과 같다.
참조)
https://walkaroundthedevelop.tistory.com/129
728x90
728x90
'연구 > 오디오' 카테고리의 다른 글
Learning Music Reprsentation with WAV2VEC 2.0 논문리뷰 (2) | 2023.12.05 |
---|---|
wav2vec 2.0: A Framework for Self-Supervised Learning of Speech Representations (1) | 2023.11.29 |
실시간으로 mel spectrogram 생성하기 (0) | 2023.10.10 |