신호처리

[신호처리] 3. 음성 파일 읽는 법, 샘플링/샘플링주파수/양자화

mhiiii 2025. 1. 8. 13:02
728x90

음성 파일

  • 압축 음성

    예) mp3

  • 비압축 음성
    정보 손실이 적음 $\to$ 음성인식 시스템에서 선호
    예) wav

마이크에 감지된 음파가 컴퓨터에 보관되기 전까지의 과정

 

 

728x90

 

소리 자체는 공기의 진동이며, 소리가 마이크에 감지되어 전기 신호로 변환되는 구조

 

마이크의 개수는 채널 수라고도 하며,

채널 수가 1인 음성은 모노 음성, 채널 수가 2인 음성은 스테레오 음성으로 불림

 

일반적으로 음성인식에서는 채널 수가 1인 음성을 주로 사용

 

그림의 왼쪽 아날로그 파형은 가로축을 시간, 세로축을 음압으로 표시


 

마이크에 감지된 시점의 파형은 연속적인 값, 이러한 값을 연속치라고 함

일반적으로 연속치와 같이 무한히 존재하는 값을 컴퓨터로 표현할 수 없음

 

연속치를 일정한 간격으로 구분하여(샘플링, Sampling) 취급 

이렇게 간격이 존재하는 값을 이산치라고 함

 

마이크로 감지된 연속치 파형의 가로 축(시간)을 일정 시간을 간격으로 순간 음압치를 기록

이때 샘플링하는 시간 간격을 "샘플링 주기"라고 함

이를 역수 취하면 샘플링 주파수가 되는 것(단위는 헤르츠)

 

샘플링 주파수는 '1초 동안 몇개의 음압치를 샘플링 하는지'를 의미

이 값이 클 수록, 정보량이 많은 것을 의미

 

그 다음 세로 축(음압)도 이산치로 변환해야 함

 

세로 축도 일정한 간격으로 눈금을 새겨 각 음압치에 가장 근접한 눈금값을 기록(양자화)

이때 새긴 눈금 개수를 "샘플링 사이즈"라고 함(일반적으로 2의 승수를 사용)

 

마찬가지로 이 값이 클 수록 정보량이 많아짐  

 


 

import wave
import numpy as np
import matplotlib.pyplot as plt

if __name__ == "__main__":
	wav_file = '../../0001.wav'
    
    with wave.open(wav_file) as wav:
    	sampling_freq = wav.getframerate() #샘플링 주파수 확인
        sample_size = wav.getsampwidth() #샘플 사이즈 확인[바이트]
        num_channels = wav.getnchannels() # 채널 수 확인
        num_samples = wav.getframes() # wav 데이터 샘플 수 확인
        waveform = wav.readframes(num_samples) # wav 데이터 읽기
        waveform = np.frombuffer(waveform, dtype=np.int16) #바이너리 값에서 정수로 변경

 

샘플 사이즈는 비트가 아닌 바이트임을 주의 

 

sampling_freq : 16000

sample_size : 2

num_channels : 1

num_samples : 51040

 

만약 위와 같이 값이 저장되었다면,

 

1초 안에 포함되는 샘플 개수는 16000개 이므로,

이 음성 시간 길이는 51040/16000 = 3.19초 

 

References

https://mz-moonzoo.tistory.com/62

 

[Voice] 디지털 신호(음성) 처리 개념 정리

0. 기초 용어 Frequency: 주파수 (높이) Amplitude: 진폭 (세기) Phase: 위상 (맵시) 1. 컴퓨터가 소리를 인식하는 방식 연속적인 아날로그 신호를 표본화(Sampling), 양자화(Quantizing), 부호화(Encoding)을 거쳐 이

mz-moonzoo.tistory.com

 

728x90