티스토리 뷰
[Pytorch] 음성 신호 전처리 (spectrogram, melspectrogram)
JG Ahn 2020. 7. 15. 03:16본 게시글은 Dacon에서 JunhoSun님이 공유해주신 음성 신호 기본 정보를 바탕으로 작성되었습니다.
모든 코드와 음성 파일은 Github에서 확인하실 수 있습니다.
목차
- Intro
- Import
- Data Load
- Spectrogram, Melspectrogram 변환
- 주요 개념
- 푸리에 변환
- STFT
- Melspectrogram
- Function and Option
- win_length
- n_fft
- hop_length
- n_mels
- Spectrogram, Melspectrogram 구하기
- 해상력
- 주요 개념
Intro
음성 신호에 대한 기본적인 내용을 설명하고 torchaudio를 사용하여 spectrogram과 melspectrogram feature를 만드는 과정에 대해 알아보겠습니다.
Import
Data Load
음성 파일(wav)을 torchaudio로 읽겠습니다. 음성 파일은 일정한 시간 간격을 가지고 어떤 지점의 음압을 측정한 것을 말합니다.
이때 일정한 시간 간격으로 음압을 측정하는 주파수를 sampling rate이라고 합니다.
torchaudio를 사용해 음성을 읽으면 음성 데이터와 sampling rate을 반환하는데, 아래의 음성에서는 sampling rate가 22050Hz임을 알 수 있습니다. 음성 데이터의 크기를 보면 [1, 661794]으로 나와 있는데 1은 채널의 개수(녹음한 마이크의 개수)를 의미하고 661794는 데이터의 길이를 의미합니다.
데이터의 길이를 sampling rate으로 나누어 주면 음성 파일의 시간을 알 수 있습니다.(아래의 데이터는 30초)
아래는 음성 데이터를 시각화한 것입니다. 가로축은 시간, 세로축은 음압을 나타냅니다.
음압이 큰 부분에 어떤 목소리, 큰 소리가 있음을 추측할 수 있습니다.
Spectrogram, Mel_Spectrogram 변환
음성 데이터를 Spectrogram이나 Melspectrogram으로 변환하는 방법에 대해 알아보겠습니다.
간단히 중요한 개념들을 설명하고 넘어가겠습니다.
주요 개념
1. 푸리에 변환
음성 신호에 푸리에 변환을 적용하면 각 진동수 성분이 그 음성에 얼마나 들어있는지 알 수 있습니다.
쉽게 설명하면 음성 신호에 저음이 얼마나 있고, 고음이 얼마나 있는지를 정량적으로 구할 수 있습니다.
2. STFT(Short Time Fourier Transform)
음성을 작게(0.01초 수준) 잘라서 각 작은 조각에 푸리에 변환을 적용할 수 있습니다.
이것을 STFT라고 부르고 일반적으로 이 결과의 L2 norm을 Spectrogram이라고 부릅니다.
3. Melspectrogram
Melspectrogram은 Spectrogram에 mel-filter라는 필터를 적용해서 얻어집니다. 이는 사람의 청각 기관이 저음에서 주파수 변화에 민감하고 고음에서는 주파수의 변화에 덜 민감한 특징을 반영하고 있습니다.
딥러닝과 사람의 청각 반응은 관련 없어 보일 수 있으나 음성 처리나 자연어 처리 분야에서도 Melspectrogram은 널리 사용되고 있으며 좋은 성능을 보여줍니다. 또한, Melspectrogram은 Spectrogram보다 크기가 작아서 학습 속도 등에서 유리한 점이 있습니다.
Function and Option
torchaudio에서는 다음과 같이 Spectrogram과 Melspectrogram을 얻을 수 있는 프로세스를 정의할 수 있습니다.
AmplitudeToDB는 power단위의 Spectrogram 또는 Melspectrogram을 dB(로그) 단위로 변환해 줍니다.
1. win_length
음성을 작은 조각으로 자를 때 작은 조각의 크기를 의미합니다.
자연어 처리 분야에서는 25ms의 크기를 기본으로 하고 있으며 16000Hz인 음성에서는 400에 해당하는 값입니다. (16000/40)
22050Hz의 파일이기 때문에 552로 설정하겠습니다. (22050/40, 소수점 올림)
2. n_fft
win_length의 크기로 잘린 음성의 작은 조각은 0으로 Padding 되어서 n_fft로 크기가 맞춰집니다. 그렇게 padding 된 조각에 푸리에 변환이 적용됩니다. 따라서 n_fft는 win_length보다 크거나 같아야 하고 일반적으로 속도를 위해서 \(2^n\) 값으로 설정합니다.
win_length의 크기가 552이기 때문에 512는 될 수 없고, 1024는 너무 크다고 생각하여 win_length와 똑같이 552로 설정하겠습니다.
3. hop_length
음성을 작은 조각으로 자를 때, 자르는 간격을 의미합니다. 즉, 이 길이만큼 옆으로 밀면서 작은 조각을 얻습니다.
일반 적으로 10ms의 크기를 기본으로 하고 있으며 16000Hz인 음성에서는 160에 해당하는 값입니다. (16000/100)
22050Hz의 파일이기 때문에 221로 설정하겠습니다. (22050/100)
4. n_mels
적용할 mel filter의 개수를 의미합니다.
Spectrogram, Melspectrogram 구하기
음성 데이터로부터 Spectrogram과 Melspectrogram을 얻어 보겠습니다.
각각의 크기는 채널을 무시하면 [277, 2995], [80, 2995]인데 2995는 시간축 방향 성분 수, 277과 80은 주파수 방향 성분 수를 의미합니다.
n_mel이 80이었으므로 Melspectrogram의 주파수 방향 성분 수는 80인 것입니다.
Spectrogram의 경우 \(\frac{n_fft}{2}+1\)개의 주파수 방향 성분이 얻어지게 됩니다.
주파수 성분은 0Hz부터 Sampling rate의 절반까지를 나타내게 됩니다. Sampling rate의 절반까지 밖에 표현하지 못하는 이유는 Nyquist Frequency에 대해 알아보시면 이해할 수 있습니다.
해상력
마지막으로 Spectrogram과 Melspectrogram의 해상력에 대해 설명하겠습니다.
win_length가 커질수록 주파수 성분에 대한 해상력은 높아지지만(정밀해진다) 시간 성분에 대한 해상력은 낮아지게 됩니다.
즉, 더 정밀한 주파수 분포를 얻을 수 있으나 시간에 따른 주파수 변화를 관찰하기가 어려워집니다.
반대로 win_length가 작은 경우에는 주파수 성분에 대한 해상력은 낮아지지만, 시간 성분에 대한 해상력은 높아지게 됩니다.
따라서 적절한 값을 찾는 것이 중요합니다.
또한 n_fft를 키우는 경우 주파수 성분의 수는 증가할지 몰라도 실제 주파수의 해상력은 증가하지 않습니다.
'Audio Signal Processing > Practice' 카테고리의 다른 글
librosa를 이용한 Audio 전처리 (0) | 2020.07.07 |
---|
- Total
- Today
- Yesterday
- Introduction to Algorithm
- 6.006
- TF2.0
- RNN
- 인공지능 스피커 호출
- MIT
- 알고리즘
- 오디오 전처리
- nlg
- S3
- MFCC
- keras
- librosa
- 모델 시각화
- nlp 트렌드
- AWS
- tensorflow
- 시계열
- netron
- stft
- LSTM
- boto3
- wavenet
- 알고리즘 강의
- BOJ
- lambda
- aws cli
- Tensorflow2.0
- 핵심어 검출
- nlp
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |