Hugging Face Audio Course: 음성 데이터 다루기 PART 1

반응형

1. Hugging Face Audio Course 소개

 

Hugging Face에 "Audio Course"라는 Transformer모델의 오디오 분야 적용에 대한 코스가 있어서 시작해보려고 합니다.

 

https://huggingface.co/learn/audio-course/chapter0/introduction

 

Welcome to the Hugging Face Audio course! - Hugging Face Audio Course

Unit 0. Welcome to the course! Unit 1. Working with audio data Unit 2. A gentle introduction to audio applications Unit 3. Transformer architectures for audio Unit 4. Build a music genre classifier Unit 5. Automatic Speech Recognition Unit 6. From text to

huggingface.co

 

Speech recognition, Audio classification, generating speech from text 등의 주제에 관심이 있다면 코스를 시작해 보시면 좋을 것 같습니다! NLPDeep Reinforcement에 관심이 있다면 해당 내용과 관련된 코스도 있으니 링크를 확인해 보세요.

 

2023년 9월 1일 이전에 해당 코스의 실습 과제의 4개 중 3개를 통과하면 수료증을 받을 수 있고, 우수 인증서를 받기 위해서는 실습 과제의 4개 중 4개를 통과해야 합니다. 저는 9월 1일까지 Audio Course의 우수 인증서를 받기 위해서 달려보도록 하겠습니다! 😝

 

해당 코스는 Transformer의 audio data의 적용에 대해 다룹니다. 다양한 audio 관련 과제를 수행하면서, 커뮤니티에 있는 사람들과 소통하면서 배워나가면 됩니다.

 

코스는 총 7개의 챕터로 이루어져 있고, 각 챕터에 대한 내용은 아래와 같습니다.

 


Course Stucture

  1. Unit 1: learn about the specifics of working with audio data, including audio processing techniques and data preparation.
  2. Unit 2: get to know audio applications and learn how to use 🤗 Transformers pipelines for different tasks, such as audio classification and speech recognition.
  3. Unit 3: explore audio transformer architectures, learn how they differ, and what tasks they are best suited for.
  4. Unit 4: learn how to build your own music genre classifier.
  5. Unit 5: delve into speech recognition and build a model to transcribe meeting recordings.
  6. Unit 6: learn how to generate speech from text.
  7. Unit 7: learn how to build real-world audio applications with transformers.

 

이렇게 7개의 챕터로 구성된 이 코스는 오디오 데이터와 트랜스포머 모델을 활용하는 다양한 응용 분야에 대해 폭넓게 다루고 있습니다. 각 유닛들을 통해 음성 인식, 음성 생성, 음악 분류 등 다양한 주제를 탐구하며, 실제 문제 해결과 관련된 실습을 통해 실력을 향상할 수 있습니다. 이 코스를 통해 오디오 데이터와 트랜스포머 모델을 활용하는 흥미로운 프로젝트들을 경험하며, 다양한 음성 관련 분야에서 능력을 향상할 수 있을 것입니다.

 

소개는 여기까지 하고, 바로 Unit 1으로 들어가 보도록 하겠습니다. 본 포스팅은 Unit 1. Working with audio data의 첫번째 파트 "Introduction to audio data"의 내용을 요약/정리한 글입니다.

 

 


 

2. Introduction to Audio Data

 

 

모든 오디오 또는 음성 작업은 오디오 파일로부터 시작됩니다. Unit 1에서는 오디오 데이터와 관련된 기본 용어에 대해 배우게 됩니다. Waveform, sampling rate, spectrogram과 같은 용어에 대한 이해와 더불어, Audio datasets으로 일하는 방법, audio data의 로딩과 전처리, 그리고 대용량 데이터셋을 효율적으로 처리하는 방법에 대해 학습합니다.

 


 

음파(Sound wave)는 연속적인 신호로, 주어진 시간에 대해 무한개의 신호 값을 가지고 있습니다. 그러나 디지털 기기들은 유한한 개수의 값을 다룹니다. 그렇기 때문에 음파를 디지털 기기에서 처리, 저장, 전송하기 위해서는 연속적인 값들을 일련의 이산적인(discrete) 값, 즉 디지털 표현(digital representation)으로 변환해야 합니다. 간단히 말하면 디지털 변환은 음파를 디지털 기기가 이해할 수 있는 언어로 바꾸는 과정입니다. 

 

.wav(Waveform Audio File), .flac(Free Lossless Audio Codec), 그리고 .mp3(MPEG-1 Audio Layer 3)같이 다양한 포맷의 오디오 파일은 주로 오디오 신호의 디지털 표현을 압축하는 방식에서 차이가 있습니다.

 

 

출처: https://www.movavi.io/what-audio-format-is-the-best-2/

 

아날로그 신호는 마이크에 의해 포착되어 음파에서 전기 신호로 변환됩니다. 이 전기 신호는 아날로그-디지털 컨버터(Analog-to-Digital Converter)를 거치며 샘플링(Sampling)을 통해 디지털화됩니다.

 

Sampling and Sampling rate

Sampling(샘플링)이란 연속적인 신호를 고정된 시간 간격으로 측정하는 과정입니다. 샘플링된 파형(Waveform)은 균일한 간격으로 유한개의 신호 값을 가지는 이산적인 형태로 변환됩니다.

 

출처: https://en.wikipedia.org/wiki/Sampling_(signal_processing)

 

Sampling rate(혹은 Smapling frequency)는 1초 동안 수집된 샘플의 수로, 헤르츠(Hz) 단위로 측정됩니다. Sampling rate는 주파수를 결정하는데 중요한 역할을 하며, 데이터셋과 모델의 샘플링 속도가 일치해야 오디오 데이터를 효율적으로 활용할 수 있습니다. 또한 Re-sampling은 서로 다른 샘플링 속도를 일치시켜 주는 전처리 과정입니다.

 

+ 오디오 데이터를 다룰 때, 특정 모델의 입력으로 오디오 데이터를 넣어주기 위해 오디오 파일의 sampling rate를 변환해야 했습니다. Sox라는 오디오 처리 도구를 사용하여 오디오 파일을 처리할 때, 4400Hz의 음성 파일을 1600Hz로 sample rate를 변환하기 위한 내용입니다.

 

Aplitude and Bit depth

소리는 사람이 들을 수 있는 주파수에서 Air pressure의 변화로 만들어집니다. 소리의 Amplitude(진폭)이란 특정 순간의 소리의 압력 수준을 나타내며 데시벨(dB)로 측정됩니다. 즉 진폭은 소리의 세기를 뜻합니다.

 

디지털 오디오에서, 각 오디오 샘플은 특정 시점의 오디오 파동의 진폭을 기록합니다. 샘플의 Bit depth(비트뎁스)는 이 진폭 값을 얼마나 정밀하게 기록할지 정합니다. Bit depth가 높을수록 디지털 표현이 원래의 연속 음파에 더 가까워집니다. 가장 일반적인 오디오 비트뎁스는 16비트와 24비트입니다. 이는 이진 용어(binary term)로, 진폭값을 연속값에서 이산값으로 변환할 때 양자화(quantized)할 수 있는 수를 나타냅니다. 16비트 오디오의 경우 65,356개, 24비트 오디오의 경우 16,777,216개에 달합니다. 양자화는 연속값을 이산값으로 바꾸는 과정에서 반올림이 일어나므로 샘플링 과정은 노이즈가 발생합니다. 보통 16비트만 되어도 양자화 노이즈는 들리지 않을 정도로 작아 굳이 더 높은 비트뎁스를 사용할 필요는 없습니다.

 

16비트나 24비트 오디오는 값을 정수로 저장하는 반면, 32비트는 샘플을 부동소수점 값으로 저장합니다. 부동 소수점 오디오 샘플은 [-1.0, 1.0] 범위의 값을 가집니다. 머신 러닝 모델은 기본적으로 부동 소수점 데이터에서 작동하므로 학습 전 먼저 오디오를 부동 소수점 형식으로 변환해야 합니다.

 

Audio as a waveform

출처: https://en.wikipedia.org/wiki/Waveform

소리가 파형(Waveorm)으로 시각화되는 것은 주변에서 흔히 발견할 수 있습니다. 통화를 할 때나, 핸드폰의 음성 인식 기능을 사용할 때, 말을 할 때마다 파형이 시시각각 변형이 됩니다. 이는 시간에 따른 샘플 값들을 그래프로 표현하여 소리의 진폭 변화를 보여주는 것입니다. 이를 소리의 시간 영역(time domain) 표현이라고도 합니다.

 

출처: https://medium.com/@thesanjeetc/want-to-control-something-with-siri-heres-how-bae98aceb586

 

오디오 신호를 파이썬 라이브러리 librosa를 사용해 직접 그려볼 수 있습니다. 먼저 colab이나 jupyter notebook 혹은 local 환경에 다음과 같이 라이브러리를 설치합니다.

 

pip install librosa

 

Librosa 라이브러리에서 제공하는 기본 소리들로 waveform을 그려보는 코드입니다. 오디오 시계열(array)과 샘플링 속도(sampling_rate) 튜플을 불러와, librosa의 waveshow() 함수를 통해 그려봅니다.

import librosa
import librosa.display
import matplotlib.pyplot as plt

array, sampling_rate = librosa.load(librosa.ex("trumpet"))

plt.figure().set_figmwidth(12)
librosa.display.waveshow(array, sr=sampling_rate)

librosa "trumpet" 소리의 waveform

이 그래프의 X축은 시간을, Y축은 진폭을 나타냅니다. 각 점은 이 소리를 샘플링할 때 취한 값에 해당합니다. librosa가 이미 오디오를 부동소수점 값으로 변환했으며 진폭값이 [-1.0, 1.0] 범위 내에 있습니다.

 

Frequency spectrum

오디오 데이터를 시각화하는 또 다른 방법은 오디오 신호의 주파수 스펙트럼을 그리는 것입니다. 이는 주파수 영역(frequency domain) 표현이라고도 합니다. 스펙트럼은 이산 푸리에 변환(Discrete Fourier Transform, DFT)을 사용하여 계산할 수 있습니다. 이를 통해 신호를 구성하고 있는 각각의 주파수들과 그 세기를 알 수 있습니다.

 

numpy rfft() 함수를 쓰면 DFT를 계산할 수 있습니다. 이를 아까의 트럼펫 소리에 적용시켜 주파수 스펙트럼을 그려봅니다. 전체 소리의 스펙트럼을 그릴 수도 있지만, 그보다는 작은 영역에 집중하는 것이 더 낫습니다. 여기서는 첫 4096개의 샘플에 적용시켜 보겠습니다. 이는 대략적으로 연주의 첫 음표의 길이에 해당합니다:

 

import numpy as np

dft_input = array[:4096]

# calculate the DFT
window = np.hanning(len(dft_input))
windowed_input = dft_input * window
dft = np.fft.rfft(windowed_input)

# get the amplitude spectrum in decibels
amplitude = np.abs(dft)
amplitude_db = librosa.amplitude_to_db(amplitude, ref=np.max)

# get the frequency bins
frequency = librosa.fft_frequencies(sr=sampling_rate, n_fft=len(dft_input))

plt.figure().set_figwidth(12)
plt.plot(frequency, amplitude_db)
plt.xlabel("Frequency (Hz)")
plt.ylabel("Amplitude (dB)")
plt.xscale("log")

librosa "trumpet" 소리의 frequency spectrum

이 그래프는 이 오디오 구간에 존재하는 다양한 주파수의 세기를 보여줍니다. 보통 X축에 로그스케일로 주파수를, Y축엔 진폭을 표시합니다.

 

librosa.amplitude_to_db()는 진폭값을 데시벨 스케일로 변환합니다. 이로 인해 스펙트럼의 더욱 세밀한 부분까지 쉽게 확인이 가능합니다. 때때로는 파워 스펙트럼(power spectrum)을 쓸 때도 있습니다. 진폭보다 에너지를 측정하기 위해 쓰는데, 이는 단지 진폭에 제곱을 취한 값으로 나타낸 스펙트럼입니다.

 

오디오 신호의 파형과 주파수 스펙트럼은 동일한 정보를 지닙니다. 단지 같은 데이터(여기서는 트럼펫 소리의 첫 4096개의 샘플)를 바라보는 두 가지 방법일 뿐입니다. 파형은 시간에 따른 오디오 신호의 진폭을 표시하며, 스펙트럼은 고정된 시점의 개별 주파수들의 진폭을 시각화합니다.

 

Spectrogram

트럼펫 소리는 여러 음으로 구성돼 있어서 여러 다른 주파수들로 이뤄져 있습니다. 스펙트럼의 문제는 주어진 한 순간만의 주파수들을 보여준다는 것입니다. 이에 대한 해결법은 시간을 작은 구간들로 나누어 DFT를 적용하고, 그 결과인 스펙트럼들을 쌓아 스펙트로그램을 만드는 것입니다.

 

스펙트로그램은 오디오 신호의 주파수를 시간에 따라 변화하는 형태로 그립니다. 이를 통해 시간, 주파수, 진폭을 그래프에서 한눈에 볼 수 있습니다. 이 계산을 수행하는 알고리즘을 STFT(Short Time Fourier Transform)라 합니다.

 

스펙트로그램은 오디오를 다루는데 가장 유용한 툴 중 하나입니다. 예를 들어, 음악 녹음 작업을 다룰 때 다양한 악기와 보컬 트랙이 어떻게 전체 사운드에 기여하는지 볼 수 있습니다. 음성 작업의 경우, 모음을 발음할 때 각각의 모음들은 고유 주파수가 있기 때문에 서로 다른 모음인 것을 식별할 수 있습니다.

 

librosa stft() specshow() 함수를 이용해 트럼펫 소리의 스펙트로그램을 그려봅니다:

 

import numpy as np

D = librosa.stft(array)
S_db = librosa.amplitude_to_db(np.abs(D), ref=np.max)

plt.figure().set_figwidth(12)
librosa.display.specshow(S_db, x_axis="time", y_axis="hz")
plt.colorbar()

librosa "trumpet" 소리의 spectrogram

스펙트로그램은 오디오 신호의 주파수 스펙트럼을 시간에 따라 시각화한 것입니다. X축은 시간을, Y축은 주파수를 나타내며, 색상의 강도는 해당 시간과 주파수에서의 진폭 또는 파워를 데시벨(dB)로 나타냅니다. 스펙트로그램은 오디오 신호를 짧은 구간으로 나누어서 각 구간에서 주파수 스펙트럼을 계산하고 이를 시간축으로 쌓아서 생성됩니다.

 

스펙트로그램과 파형은 같은 데이터를 다른 방식으로 볼뿐이므로, 스펙트로그램을 다시 원래의 파형으로 돌리는 역 STFT(inverse STFT)가 가능합니다. 그러나, 이를 위해선 진폭 정보뿐만 아니라 위상(phase) 정보 또한 필요한데, 스펙트로그램이 머신러닝 툴에 의해 생성됐다면 대부분 단순히 진폭만 출력하게 됩니다. 이런 경우, 위상 재구성 알고리즘(phase reconstruction algorithm)인 vocoder라는 신경망이나 고전적인 Griffin-Lim 알고리즘을 사용하여 스펙트로그램에서 파형을 재구성할 수 있습니다.

 

Mel Spectrogram

멜 스펙트로그램은 스펙트로그램의 한 종류로 음성 작업이나 머신러닝 작업에 주로 쓰입니다. 오디오 신호를 시간에 따른 주파수로 보여준다는 점에서 스펙트로그램과 비슷하지만, 다른 주파수 축을 사용합니다.

 

표준적인 스펙트로그램에선 주파수 축이 선형(linear)이며 헤르츠(Hz) 단위로 측정됩니다. 그러나, 사람의 청각 시스템은 고주파보다 저주파에 더 민감하며, 이 민감성은 주파수가 증가함에 따라 로그함수적으로 감소합니다. 멜 스케일(mel scale)은 이런 사람의 비선형 주파수 반응을 근사한(approximate) 지각 스케일(perceptual scale)입니다.

 

멜 스펙트로그램을 만들려면 전처럼 STFT를 사용하고 오디오를 여러 짧은 구간으로 나눠 일련의 주파수 스펙트럼들을 얻어야 합니다. 그 후 추가적으로, 각 스펙트럼에 mel filterbank라고 불리는 필터들을 적용시켜 주파수를 멜 스케일로 변환합니다.

 

S = librosa.feature.melspectrogram(y=array, sr=sampling_rate, n_mels=128, fmax=8000)
S_dB = librosa.power_to_db(S, ref=np.max)

plt.figure().set_figwidth(12)
librosa.display.specshow(S_dB, x_axis="time", y_axis="mel", sr=sampling_rate, fmax=8000)
plt.colorbar()

librosa "trumpet" 소리의 mel spectrogram

멜 스펙트로그램은 스펙트로그램을 멜 스케일로 변환하여 사람의 귀가 주파수에 어떻게 반응하는지 모방한 것입니다. 이를 통해 주파수 성분을 더 의미 있는 방식으로 표현할 수 있으며 음성 인식, 화자 식별, 음악 장르 분류 등 다양한 작업에서 활용됩니다. 멜 스펙트로그램은 주파수 성분의 진폭을 데시벨로 표현한 로그-멜 스펙트로그램으로 흔히 사용되며, 이를 생성하기 위해 주파수 범위를 멜 스케일로 나누어 필터를 적용합니다. 이렇게 생성된 멜 스펙트로그램은 인간의 청각에 더 적합하고 음성 작업에 많이 활용됩니다.

 

 


 

 

이번 포스팅에서는 Hugging Face Audio Course의 Unit 1 Introduction to audio data 파트를 공부해 보았습니다. 다음 포스팅에서는 음성 데이터 다루기의 나머지 파트를 다뤄보도록 하겠습니다.

 

 

참고: 

https://huggingface.co/learn/audio-course/en/chapter1/audio_data

 

Introduction to audio data - Hugging Face Audio Course

Unit 0. Welcome to the course! Unit 1. Working with audio data Unit 2. A gentle introduction to audio applications Unit 3. Transformer architectures for audio Unit 4. Build a music genre classifier Unit 5. Automatic Speech Recognition Unit 6. From text to

huggingface.co

 

반응형