서울사람의 꽃은 음성데이터 처리이다!
프로젝트 초반 일주일은 이 부분만 팠다.
간단한 것 같지만 막상 시작하려고 하니 이런 점들이 걱정되고 궁금했다.
1. 음성 데이터가 뭐지.. 어케 생겼지? <-- 이번편에서 다룬다!!
2. 아니 일단 브라우저에서 마이크 접근이 가능???
3. 그래서 이제 음성을 어떻게 받아서 저장하지?..
아주 무지했다^^
구글링하면 다 나오는 내용이긴 했지만
나름대로 공부하고 머릿속으로 정리해야하는 부분들이 있어서 오히려 재밌었다!!!
Step by step으로
먼저 음성 데이터가 컴퓨터에서는 어떻게 구성되고 처리되는지부터 이해를 해야했다.
거의 프로젝트 초반에 찾아보고 공부한 내용이라서...
기억이 잘나지 않지만..
기억을 더듬어보자.. 😅...
음성데이터 기본 지식
Amplitude
음성데이터는 그래프화하면 이렇게 생겼다.
x축은 쓰여있진 않지만 time(sec)이고
y축은 amplitude로 진폭이다. 보통 진폭이 클수록 소리가 크다.
그리고 frequency는 amplitude가 1초당 몇 번 동일한 주기(음성의 떨림)로 반복되느냐이다.
frequency가 클수록 pitch(음성의 높이)가 높다고 한다.
어찌 되었든 컴퓨터에서는
음성데이터를 y축이되는 amplitude 값을 float 배열로 저장하는 방식으로 처리한다.
Bit depth
float 값 한 개를 저장하기 위해서는 많은 0과 1으로의 인코딩이 필요하다. (float는 언어별로 다르지만.. 보통 4byte기 때문에 32bit)
그래서 진폭 하나를 n개의 비트로 나타내는데 그걸 pcm이라고 하고 그 비트 수를 bit depth라 한다.
Sample rate
그런데 신호는 연속적이기 때문에...;;
모두 저장할순 없다^^
그래서 음성신호를 sampling 하게 되는데
Sample rate(Hz)는 1초에 몇 개의 amplitude를 sampling 하는지를 의미한다.
인간의 최대 가청 주파수 20kHz이다.
표본화 정리에 따라서 두 배인 40kHz 이상을 저장하는게 보통이라고 한다.
그 결과, 디지털 오디오 샘플링은 44,100Hz을 기본으로 한다.
Channel
Channel은 오디오 데이터 입력받고 출력받는 채널..을 의미한다.
채널이 1개이면 모노 스테레오고 2개이면 스테레오이다.
사람의 귀는 두 개이고 또 더 입체적으로 소리를 듣기 위해 스테레오를 쓰게 된다.
(Right와 Left에서의 amplitude가 서로 다른 값을 가질 수 있다)
그래서 보통은 2개의 Channel이 필요하다.
하지만 스테레오를 지원하는 마이크와 스피커가 있어야만
두 개의 오디오 데이터를 쌓거나 들을 수 있을 것이다.
데이터의 사이즈
앞에서 정리한 것을 종합해보자.
32 bit depth와 sample rate은 44,100Hz, 그리고 2 channel로 오디오 데이터를 10초간 저장한다고 하면,
4byte * 44,100 * 2 * 10sec = 3.528MB 가 필요하다...
짱 크다...
그러다 보니 데이터 손실을 감수하고도 압축을 하는 다양한 방법들이 생겨났다.
서울사람의 경우 웹페이지에서 음성데이터를 받아
다른 서버로 보내야 하기 때문에 용량이 커지는건 원치 않았다.
그럼 데이터를 받아서 .mp3로 변환을 하는 과정을 거쳐야 하나 고민했다.
구글링을 이리저리해보니,
보통 음성인식에 사용되는 데이터 포맷은 .wav였다.
.wav
wav는 무손실 무압축 오디오 저장 포맷으로
순수한 pcm 데이터 뭉탱이들을 메타데이터와 함께 저장해버리는 통큰 녀석이다.
.mp3를 이용하면 따로 전처리가 필요한지 여부까지는 모르겠지만...
(사실 깊이 찾아보지도 고민하지도 않음..-_-)
1. 우리 음성데이터는 최대 10초까지만 허용할 생각이었다.
2. 서비스에 사용한 카카오 STT api에서도 .wav를 쓰고 있었다.
3. bit depth와 sample rate도 줄이기로 결정했다.
그러고 보니 용량도 많이 줄어들었고
굳이 번거로운 과정을 거칠 필요가 없다고 여겨졌다.
그래서 .wav로 결정했다 >< (급 결론)
다음편에서는 Web 환경에서 마이크 접근 & 오디오 데이터 처리에 대해서 회고해보쟈~~
'개발 > 회고' 카테고리의 다른 글
[SS회고] Node.js와 Express (ft. multipart/form-data) (0) | 2021.09.22 |
---|---|
[SS회고] Web 환경에서 음성데이터 처리, Web Audio API와 Web Worker (0) | 2021.09.20 |
[SS회고] React와 React Router (0) | 2021.09.09 |
[SS회고] I'm 서울사람 프로젝트 회고 시작 (0) | 2021.09.09 |