AI/음성인식

[음성 인식/STT] 음성 신호의 변환(sampling, quantization, coding)

mingchin 2023. 2. 26. 23:59
728x90
반응형

소리와 소리의 표현, waveform

소리의 본질은 공기의 진동이다. 인간의 귀(고막)은 공기 분자의 움직임을 감지해 이를 소리로 인식하며, 해당 진동이 '얼마나 빠르게', '얼마나 크게' 일어나느냐에 따라 다른 소리로 인식하게 된다.

이러한 공기 분자의 움직임을 표현하는 방법 중 하나가 waveform이며, x축에 time y축의 amplitude를 표현해 시간에 따른 공기 분자의 움직임의 폭을 나타낸다. waveform의 각 점은 일렬의 공기 분자의 움직임을 대표하는 값이라고 볼 수 있다. 이러한 움직임은 주기성을 가지고 나타나며 진동수(frequency), 진폭(amplitude)에 따라 소리의 특성(크기, 높낮이 등)이 달라지게 된다. STT(Speech to Text)은 waveform의 형태로 연속적으로 표현(analog)된 소리를 컴퓨터가 인식할 수 있는 discrete한 형태로 변환(digital)하고, 해당 소리로부터 특성(features)을 잘 추출해서 각각의 소리에 해당하는 text에 대한 alignment를 찾아가는 것이기 때문에, 음성을 변환하고 특성을 뽑아내는 과정에 대한 이해가 선행되어야 한다.

 

  • 진동수(frequency), 주기(period)

공기 분자가 1초에 몇 번 진동하는가. Hz 단위를 사용. 8kHz라 하면 1초에 8천번 진동하는 소리다. 소리의 높낮이와 관련이 있으며 진동수가 클 수록 높은 소리다. 주기 = 1 / 진동수.

인간의 가청 주파수는 20Hz ~ 20KHz 정도이며 STT의 대상이 되는 인간 발화의 음성의 경우 대부분 4kHz 안에서 발생한다. 

 

  • 진폭(amplitude)

공기 분자가 진동하는 범위. 소리의 크기와 연관. 진폭이 클 수록 소리의 크기가 큰 경향.

 

Analog to Digital, Sampling(표본화) & Quantization(양자화) and Coding(부호화) + channels

컴퓨터는 모든 정보를 이진화하므로, 연속적인 정보를 그대로 인식하거나 뱉어낼 수 없다. 따라서 음성 신호를 discrete한 값으로 변환하는 과정이 필요하고 그 방법이 Sampling과 Quantization이다. Sampling은 시간 축(x축), Quantization은 amplitude축(y축)에 대해 수행하는 변환이라 생각할 수 있다. Coding은 이렇게 digital 신호로 전환된 음성을 주고받기 용이하게 또는 저장하기 좋게 압축하는 방법으로, 손실 압축과 무손실 압축 방법이 있다.

 

  • Sampling(표본화) & Nyquist theorem

waveform을 나타낼 수 있는 대표값을 n개 골라내는 것. 이때 대표값의 수 n을 sampling rate이라 칭한다. Sampling rate 역시 Hz 단위로 표현하여, 가령 8kHz 음성에 대해 sampling rate = 16kHz라 하면 1초에 8000번 진동하는 전체 waveform을 16000개의 점으로 나타내는 것을 의미한다. waveform은 한 번의 진동에서 두 개의 극점을 가지게 되는데, 주기성을 고려하면 이 극점의 위치만 정확하게 표현해도 전체 파동의 모양을 유추할 수 있다는 것이 바로 Nyquist theorem의 의미이며, 다시 말해 음성의 본래 주파수의 2배 만큼의 sampling rate로 음성을 discrete하게 표현하는 경우 데이터의 손실 없이 원본 waveform을 복원할 수 있다. (이에 인간의 가청 주파수의 최대 20kHz의 두 배에 오차를 더한 44100Hz가 주로 우리가 듣는 음원의 주파수로 채택된다.)

 

인간의 말은 주로 4kHz 내의 진동수로 표현되는 경향이 있고, 이에 전화망은 8kHz의 sampling rate으로 음성 신호를 주고 받도록 설계되었다. 또한 늘 음원의 손실을 방지하기 위해 원본 음성의 최대 진동수의 2배 이상의 sampling rate으로 sampling을 하는 것은 아니고, 경우에 따라 일부 손실을 감수하고도 더 낮은 sampling rate을 설정하거나 이미 16kHz로 sampling된 음성을 다시 8kHz로 sampling하는 down sampling 기법이 활용되기도 한다.

 

python 패키지 librosa, 리눅스의 ffmpeg, 오픈소스 프로그램 sox(Sound eXchange) 등으로 음원의 정보를 확인 sampling 등을 할 수 있다.

 

  • Quantization(양자화)

출처: 위키백과

waveform의 각 지점의 amplitude를 유한개(2의 거듭제곱) 지점에 맵핑하여 표현. 이때 2의 k승 개의 지점에 맵핑한다면 k를 양자화 bit라 칭한다. 양자화 bit가 8이라면 전체 amplitude를 64개 지점으로 나누고, 각 sampling된 지점의 amplitude값을 64개 중 하나에 맵핑하는 것을 의미하고 양자화 bit가 16이라면 2의 16승인 65536개 중 하나에 맵핑한다. 양자화 bit를 낮게 할수록 음성이 필요로 하는 저장 공간이 줄어들지만 양자화로 인한 오차인 양자화 잡음(quantization noise)이 클 가능성이 높고, 양자화 bit를 크게 할수록 오차는 줄어들지만(원본의 음성을 잘 보존) 음성의 크기가 너무 커지는 문제가 있다.

 

이를 해결하기 위해 전체 amplitude를 동일한 크기의 구간으로 나누지 않고 저주파(낮은음 구간)는 더 촘촘하게, 진행하고 고주파(높은음 구간)는 덜 촘촘하게 나누는 기법인 Non-linear PCM 방식을 사용하기도 한다. 이것이 가능한 이유는 사람의 귀가 저주파(1000Hz 이하)에 민감하고 고주파에 둔감하기 때문.

 

  • Channels, mono & streo

녹음 채널의 수. 채널이란 음성을 녹음할 때 사용한 마이크의 수라고 생각해도 무방하다. mono는 1개의 마이크, streo는 2개의 마이크를 사용해 녹음한 음성을 말한다.

 

  • 음성 파일의 표현과 크기 계산

8kHz, LinearPCM, 16bit, mono, 3min

= 8kHz의 sampling rate을 가지는, LinearPCM 방식의 16bit로 양자화한 3분짜리 1채널 음성

= 8000(Hz) * 16(bit) * 1(mono) * 3(min) * 60(sec) = 23040000bit ≈ 2880kB

 

  • Coding(부호화)

sampling, quantization을 통해 discrete하게 변환된 음성 신호를 보다 압축된 형태로 변환하는 기법. sampling, quantization 그리고 압축 과정을 모두 묶어 coding이라 칭하기도 한다. 런렝스 부호화, 허프만 부호화 등 완벽하게 복원이 가능한 무손실 압축 기법과 DPCM(Differential PCM), DM(Delta Modulation), FFT(Fast Fourier Transformation), DCT(Discrete Cosine Transformation) 등의 손실 압축 기법이 있다.

 

무손실 압축의 경우 2~4:1의 압축이, 손실 압축의 경우 10~25:1 혹은 그 이상의 압축이 가능하다. 손실 압축에 한해 압축 비율과 손실량은 trade-off 관계에 있다.

 

음성 신호의 이해

 

대부분 sampling, quantization, coding까지 완료된 상태로 음성 신호를 주고 받기 때문에, 각 음성의 정보가 어떤 의미인지 알기 위해서는 위의 내용을 이해하고 있어야 한다. 음성의 크기(용량)과 품질은 어느 정도 trade off 관계에 있음을 인지해야 STT 모델링 시에도 상황에 따라 적절한 input의 형태를 택할 수 있다.

 

이제 이렇게 변환된 음성으로부터 특성(features)을 뽑아내는 과정이 뒤따르게 된다.

728x90
반응형