Audio
샘플링 속도 (Sampling Frequency)
- 1초 동안 수집된 샘플의 수로, 헤르츠(Hz) 단위로 측정됨
- 음성 모델 학습에 주로 쓰이는 샘플링 속도는 16000Hz(16kHz)
- 신호에서 얼마나 큰 주파수까지 캡쳐할 수 있는지를 결정하는데 큰 역할
- 신호에서 캡쳐 가능한 최고 주파수의 한계는 샘플링 속도의 절반 = Nyquist Limit
- 더 높은 샘플링 속도를 사용하여도 얻을 수 있는 추가 정보는 없을 것이며, 오히려 파일 처리에 대한 계산 비용만 증가시킴
- 너무 낮은 샘플링 속도는 정보의 손실로 이어짐
- 모든 예제가 동일한 샘플링 속도로를 가지고 있는지 확인하는 것이 중요
- Resampling : 서로 다른 샘플링 속도를 일치시켜주는 작업 ➡ 오디오 전처리 과정 중 하나
- Bit-Depth : 특정 시점의 오디오 파동의 진폭을 기록할 때, 얼마나 정밀하게 기록할 지를 정하는 것
- Bit-depth 가 높을 수록 디지털 표현이 기존의 Continous Wave에 더 가까워짐
- 가장 일반적인 오디오 비트뎁스는 16, 24 비트
- 〰 진폭 값을 Continous에서 Discrete로 바꿀 때 양자화(Quantize)할 수 있는 수
오디오 신호 파형 그리기
pip install librosa
- 신호의 모양, 패턴 관찰, 노이즈나 왜곡 발견 가능
- 정규화, 리샘플링, 필터링 등의 방법을 통해 데이터 전처리를 했다면 전처리가 제대로 되었는지 시각적 확인 가능
- 모델 학습 완료 후 어디서 오류가 발생했는지 디버깅하기 위해 샘플을 시각화 할 수 있음. (ex. 오디오 분류 작업 문제 등)
주파수 스펙트럼(Frequency Spectrum)
- 스펙트럼은 이산 푸리에 변환(DFT)를 사용하여 계산할 수 있음
- numpy의 rftf() 함수를 사용하면 DFT 계산 가능
💡 실무에서 고속 푸리에 변환(FFT - Fast Fourier Transform)이라는 용어와 DFT를 혼용해서 쓰이는 경우를 볼 수 있음. DFT를 계산하는 유일한 효율적인 방법이 FFT 를 사용하는 것이기 때문
스펙트로그램(Spectrogram)
: 오디오 신호의 주파수를 시간에 따라 변화하는 형태로 그림
- 소리는 시간에 따라 변하는 압력 변화 ➡ 이 압력 변화를 그래프로 그리면 단순한 waveform이 됨. 하지만 이 파형만으로는 소리의 특성을 잘 파악하기 어려움
- 스펙트로그램은 소리를 시간과 주파수 두 가지 측면에서 동시에 보여줌
- 가로축은 시간을, 세로축은 주파수를 나타냄 (각 시간-주파수 지점의 밝기(혹은 색상)은 그 시점에서의 소리 강도를 의미)
- 저음역대의 밝은 부분은 그 시간대에 낮은 주파수 성분이 강했다는 것을 보여줌. 반대로 고음역대가 밝다면 높은 주파수가 강했음을 알 수 있음.
- 음성인식, 음성정보 추출 등 다양한 분야에서 매우 유용하게 사용
- 오디오 신호에서 주파수가 어떻게 변화하는지 보기 위함
- 시간을 작은 구간들로 나누어 DFT를 적용하고, 그 결과인 스펙트럼들을 쌓아 스펙트로그램을 만드는 것
- 오디오를 다루는 데 가장 유용한 툴 중 하나, 예를 들어 음악 녹음 작업을 다룰 때 다양한 악기와 보컬 트랙이 어떻게 전체 사운드에 기여하는 지 볼 수 있음.
- 음성 작업의 경우, 모음을 발음할 때 각각의 모음들은 고유 주파수가 있기 때문에 서로 다른 모음인 것을 식별할 수 있음.
- 머신러닝 모델에 의해 만들어진 스펙트로그램을 파형으로 바꾸기
- Vocoder라는 신경망을 이용해 스펙트로그램에서 파형을 재구성 할 수 있음
- 머신러닝 모델에 의해 만들어진 스펙트로그램은 위상 정보가 없어 역 STFT(Shor Time Fourier Transform)을 쓸 수 없음
멜스펙트로그램(Mel Spectrogram)
- 스펙트로그램의 한 종류로 음성작업이나, 머신러닝 작업에 주로 쓰임
- 오디오 신호를 시간에 따른 주파수로 보여준다는 점에서 스펙트로그램과 비슷하지만, 다른 주파수 축을 사용함
- 표준적인 스펙트로그램에선 주파수 축이 선형(linear)이며 헤르츠(Hz) 단위로 측정됨
- Mel Scale : 사람의 비선형 주파수 반응을 근사(approximate)한 지각 스케일(perceptual scale)
오디오 데이터셋 전처리하기
- 오디오 데이터 리샘플링
- 데이터셋 필터링
- 오디오 데이터를 모델의 입력에 맞게 변환
Load_dataset 함수는 오디오 데이터를 published 샘플링 속도에 맞춰 다운로드함 ➡ 샘플링 속도 간 불일치가 있다면, 모델이 기대하는 샘플링 속도에 맞춰 리샘플링을 할 수 있음
- 나이퀴시트 샘플링 정리에 의해서, 만약 오디오 신호가 8kHz로 샘플링 되었다면 4kHz보다 높은 주파수는 없음을 알 수 있음.
- 샘플링 지점들간의 원래의 연속적인 신호는 항상 부드러운 커브임을 확신할 수 있음
- 더 높은 샘플링 속도로의 업샘플링은 이 커브를 근사하여 기존 점들 사이의 값을 찾아내는 것
- 다운 샘플링의 경우 새로운 샘플을 결정하기 전, 새로운 나이퀘스트 한계보다 높은 주파수를 먼저 걸러내는 작업이 필요함
- 단순히 샘플을 버리는 식으로 하게 되면 왜곡이 생길 수 있음. : Alias
- 따라서 리샘플링하기는 꽤 까다롭기 때문에 Librosa나 huggingface datasets 과 같은 잘 테스트 된 라이브러리를 쓰는 것이 나음
오디오 데이터셋 전처리
- Raw data는 샘플 값들의 배열로 제공됨
- Pre-trained Model의 경우, 원시 데이터를 입력 feature에 맞추어야 함
- 이런 입력 feature의 요구 사항은 모델마다 다를 수 있음
- Huggingface Transformers에서 모든 모델에 대해 원시 데이터를 모델이 원하는 입력 feature로 바꿔주는 feature extractor 클래스 제공
Feature Extractor
- 모델이 원시 오디오 데이터를 직접 처리하기 어렵기 때문에 중간 전처리 단계로 사용됨
- 원시데이터 (raw data)를 모델이 원하는 포멧으로 변경하는 작업 처리
- 대개의 오디오 작업은 Multimodal임
- 이런 경우 Huggingface Transformers는 텍스트 입력을 처리하기 위해 모델별 토크나이저(Tokenizer)를 제공함
- 모델의 성능과 효율성을 높이기 위해 적절한 feature size와 feature dimension을 선택해야 함
- Feature Size : 오디오 신호를 일정한 크기의 시간 프레임으로 잘라 특징을 추출할 때, 프레임의 크기를 의미함. (일반적으로 10-25ms 범위에서 설정)
- Feature Dimensoin : 각 시간 프레임에서 추출된 특징 벡터의 차원을 의미 (ex. 80차원, 512차원 등이 있음.)
from transformers import AutoProcessor
processor = AutoProcessor.from_pretrained("openai/whisper-small")
Audio Dataset Streaming
- 당장 필요로 하는 데이터만을 불러올 수 있음
- 디스크 공간 : 데이터는 데이터셋을 순회하며 메모리에 하나씩 불러와짐(로컬에 다운로드 하지 않으므로 저장공간의 제약 없이 임의의 크기의 데이터셋을 다룰 수 있음.)
- 다운로드 시간과 처리 시간 : 처리와 불러오는 것이 즉석에서 이뤄지기 때문에 데이터가 준비되는 대로 시작할 수 있음
- 실험의 간편함 : 전체 데이터셋을 다운로드 받을 필요 없이 몇 개의 데이터에 대해 스크립트가 잘 작동하는지 실험하기 쉬움
- 스트리밍 모드에서는 데이터가 디스크에 저장되지 않기 때문에, 데이터셋을 재사용하기 원하면 스트리밍 단계를 반복해야 함. (여러 번 사용할 데이터셋은 다운로드 하는 것이 좋음)
gigaspeech = load_dataset("speechcolab/gigaspeech", "xs", streaming = True)
- 더 이상 파이썬 인덱싱으로 데이터에 접근하지 못함
- 데이터셋을 순회해서 접근해야 함
next(iter(gigaspeech["train"]))
# 여러 개의 데이터를 보고 싶을 때
gigaspeech_head = gigaspeech["train"].take(2)
list(gigaspeech_head)
# n번째 데이터만 가지고 오고 싶다
data_list = dataset["train"].take(3)
example = list(data_list)[-1]
example
Audio를 위한 트랜스포머 아키텍쳐
- 오디오 작업의 경우 입력, 출력, 전체 혹은 각각의 시퀀스가 텍스트가 아닌 오디오일 수 있음
- 자동 음성인식(ASR, Automatic Speech Recognition) : 입력은 음성, 출력은 텍스트
- 음성 합성(TTS) : 입력은 텍스트 출력은 음성
- 오디오 분류(Audio Classification) : 입력은 오디오, 출력은 클래스 확률(시퀀스의 각 요소에 대해 하나씩 또는 전체 시퀀스에 대해 단일 클래스 확률)
- 음성 변환(Voice Conversion), 음성 향상(Speech Enhancement) : 입력과 출력 모두 오디오
💡고려해야 할 점 : 오디오를 원시형태(파형)으로 사용할 지, 아니면 스펙트로그램으로 처리할 지 여부
모델 입력
: 입력을 트랜스포머 아키텍처에서 처리할 수 있는 임베딩 벡터로 변환하기
- 자동 음성 인식 모델은 오디오를 입력으로 받아 변환, ASR에 트랜스포머를 사용하려면 먼저 오디오를 어떤 식으로든 임베딩 벡터 시퀀스로 변환해야 함
- 파형 입력
- wav2vec2, HuBERT와 같은 모델은 오디오 파형을 모델에 대한 입력으로 직접 사용
- 1차 정규화 : 파형은 부동 소수점 숫자의 1차원 시퀀스이며, 각 숫자는 주어진 시간에 샘플링 된 진폭을 의미함
- 원시 파형은 평균과 단위 분산이 0으로 정규화되어 다양한 음량(진폭)의 오디오 샘플을 표준화하는데 도움
- 정규화 후 오디오 샘플 시퀀스는 feature encoder로 알려진 작은 컨볼루션 신경망을 사용하여 임베딩으로 변환 (CNN 이용)
- 최종 오디오 25ms 마다 임베딩이 포함된 512 차원의 벡터를 출력할 때까지 처리
- Whisper 모델은 파형을 로그 멜 스펙토그램으로 변환
- ASR, TTS 등의 다양한 오디오 작업을 수행하려면, 입력을 임베딩으로 전처리하는 레이어를 교체하고, 예측된 임베딩을 출력으로 후처리하는 레이어를 교체하면 되며, 트랜스포머 백본은 그대로 유지
CTC Architecture
- CTC(Connectionist temporal classification) : 자동 음성 인식을 위한 인코더 전용 트랜스포머 모델에 사용되는 기법
- 기존에 RNN 기반 음성 인식 모델에서 주로 사용되던 기술
- 입력 Sequence와 출력 Sequence 간의 길이 불일치 문제를 해결
- CTC 모델을 사용하면 은닉 상태 시퀀스에 추가 선형 매핑을 적용하여 클래스 레이블 예측을 얻음
- 작은 분류 헤드로 대상 언어의 모든 단어를 예측할 수 있음
- 구성
- 오디오 특징 추출 : 오디오 파일로부터 MFCC, 스펙트로그램 등의 특징을 추출
- Transformer Encoder : 추출한 오디오 특징을 Transformer Encoder에 입력 (Encoder는 SSL 매커니즘을 통해 특징 간 관계를 학습)
- Transformer Decoder : 텍스트 시퀀스를 입력하지만, 실제로는 출력하고자 하는 텍스트가 아닌 Blank 토큰과 문자 토큰으로 구성된 특수한 시퀀스 사용
- CTC 손실함수 : Decoder의 출력과 실제 텍스트 시퀀스간의 손실을 계산하기 위해 CTC 손실 함수 사용. (CTC는 입출력 길이 불일치를 효과적으로 다룰 수 있음)
'AI (인공지능) Paper Review > Audio' 카테고리의 다른 글
[Contextual ASR] CTC-Assisted LLM-Based Contextual ASR 논문 리뷰 (0) | 2024.11.20 |
---|