본문 바로가기
개발언어/NAudio

[Digital Audio] 4. Audio Signal Chains

by 창용이랑 2021. 7. 8.
728x90

강의 introduce를 보고, 이거 나랑 너무 별 상관없는 주제 아닌가? 싶어서 적당히 넘기려던 순간, '프로그래머의 경우 특히 이 내용을 아는 것이 중요합니다' 라고 하는 걸 듣고 각잡고 앉았다.

...그러나 강의 내용은 정말, 정말, 정말, 내 흥미와는 매우 거리가 멀었다....

아니, 나도 프로그램의 flow가 중요한 건 아는데, 그래도 이걸 프로그래머에게 중요하다고 하는 건 좀 그렇지 않나... 저자가 말하는 '프로그래머'는 아무래도 '음악 프로그램을 작성하고자 하는' 프로그래머인가 보다. 나는 아니었다. 흠.

 

1~3강은 그런 적이 없었는데, 4강은 중간에 흥미가 떨어져서 2번이나 딴짓을 했다. 순수 재생 시간은 40분짜리를. (뭐 중간에 멈추고 되돌려보고 필기하고 뭐하고 하다보니 2시간은 걸리지만)

 

그래도 오디오에 대한 (솔직히 음악에 대한 이라고 해야할 것 같긴 한데) 전반적인 지식으로서의 가치는 있을테니 열심히 정리해 보도록 하자. 그래도 일부 내게 무의미하다고 판단되는 내용은 좀 스킵했다. 필요하게 되면 다시 찾아보도록 하자.

 

 

Audio Signal Chains

Audio Pipeline 이라고도 불린다. 

signal input 으로부터 output 까지의 일련의 과정으로, 입력이 들어와 이런저런 과정을 거쳐 출력되기까지의 과정이다.

어떤 경로로 들어온 signal 이 원하는 결과물로 출력되기까지의 과정이라고 할 수 있겠다.

 

 

 

위의 그림이 signal chain의 한 예이다. 기타가 input, amp가 output 이다.

 

 

 

위 그림은 여러 개의 signal chain이 전개된 그림을 보여준다.

파랑이 input(source), 보라가 output(sink) 이다. 주황은 오디오 형식 수정, 녹색은 effect 이다.

 

처음에 마이크로 입력을 받아 오디오 파일로 출력하고, 그 오디오 파일에 이펙트를 입히고 코덱을 써서 mp3로 만들고, 또 mp3를 스트리밍하여 다른 이의 사운드카드에서 출력되게 하는 과정을 보여준다.

 

 

Signal Chain Input

일반적으로 사용되는 signal chain의 input은 네 가지이다.

1. audio file (기존에 녹음된 디지털 파일)

2. streaming audio (네트워크를 통해 수신되고 있는 사운드)

3. soundcard input (마이크 등으로 입력받는 소리 신호)

4. synthesis (특정 알고리즘을 사용하여 컴퓨터가 합성하여 제작한 신호)

 

그럼 각각의 성질을 알아보도록 하자. 대부분 생각해보면 당연한 이야기지만, 그 당연한 것은 '추론을 거쳐' 나온 결과이므로, 굳이 매번 추론하지 않도록 써놓는 것이 중요하다. 매 순간 추론하는 것도 정신과 시간의 낭비이고, 어느 순간 추론을 실수할수도 있으니.

 

Input from Audio Files

오디오 파일로 들어온 것을 편집하기 위해서는 일단 PCM으로 되어야 한다. 그러므로 압축된 file일 경우, codec을 사용해 pcm으로 압축해제하는 과정이 선행된다.

그와 함께 작업의 편의성을 위해 보통 floating point로 변환하게 되는데, 그렇지 않을 경우 overflow의 위험이 있을 수 있기 때문이다.

 

장점으로는 다른 방법에 비해 가장 빠르다는 점이다. 이미 처음부터 끝까지에 대한 정보를 가지고 있기에, cpu가 허락하는 한 아주 빠른 속도로 작업을 처리할 수 있다. 다른 방법은 input을 기다려야 하니까.

 

Input from Network

네트워크를 통해 들어오는 streamed audio는 보통 PCM이 아니다. 그러므로 decoder에 넣어 PCM을 획득해야 한다.

이때 보통은 buffer가 필요한데, 예를 들어 MP3의 경우 frame 단위로 구분되어 있는데 1.5프레임을 넣었다간 반 프레임은 제대로 재생될 수 없기 때문에 버퍼에 넣었다가 한 프레임이 모이면 그때 디코더로 넣는 등의 작업이 필요하다.

일부 프로그램에서는 PCM 버퍼도 사용하여 PCM이 일정 수준 이상(5초 이상 등)이 버퍼에 모여야 재생이 가능해지게 하는 작업을 하기도 한다. (유튜브도 비슷한 방식을 쓴다)

 

Input from Soundcard

마이크 등으로 녹음되어 사운드카드로 들어오는 input. 결과물은 보통 오디오 파일인 경우가 많다.

일부 경우 이펙트를 입힌 최종 결과를 바로바로 듣기 위해서 헤드폰 등으로 재생하면서 녹음하는 경우도 있다. (모니터링)

다만 모니터링을 제대로 하기 위해서는 사운드카드의 latency가 낮은(10ms 이하) 장비여야 한다. 그렇지 않으면 소리가 끊겨서 매우 불쾌한 소리가 될 수 있다.

 

Input from Synthesis

synthesis란 합성이라는 뜻이다. 그리고 디지털 오디오에서 합성이란 무엇인가 하면, 현실의 신호를 녹음하여 만든 소리가 아니라 특정 알고리즘을 통해 컴퓨터 내부에서 만들어낸 소리를 말한다.

대표적인 예로는 사람의 목소리를 흉내내어 글씨를 읽어주는 TTS 라던가, 물리적인 소리를 모델링한다던가, 신디사이저 등의 Virtual analouge (VA)를 말한다.

개인적으로는 사람의 목소리를 녹음 후 조교하여 쓰는 보이스로이드나 보컬로이드가 synthesis에 해당하는지 조금 궁금하다.

 

꽤 비중있게 설명하였는데, 내 입장에서는 이 합성의 가치가 잘 와닿지 않아서, 이미지로 대체한다.

 



 

 

위와 같은 파형을 임의로 제작, 재생할 수 있다는 것 같다.

피아노 소리를 흉내낼 수 있는 기계인 키보드 등으로 만들어낸 소리도 synthesis인 것 같다.

 

Mixing

둘 이상의 소리를 하나로 합치는 작업을 말한다. 즉 여러 개의 input을 하나로 합쳐 단일 output으로 만들어내는 작업이다.

 

 

당연하다면 당연하겠지만, mixer의 input은 sound 이고 output도 sound 이다. (모든 작업이 그렇듯이) 그러므로 mixer의 output은 다시 mixer의 input으로 사용될 수 있다. 즉 단계적으로 합칠 수 있다는 뜻이다. 아래와 같이.

 

 

 

 

구현 방법은 생각 외로 심플한데, 단순하게 각 샘플을 합하는 것이다.

언뜻 생각하기로는 그걸로 되나 싶은데, 되는 모양이다. 파형으로 생각해 보면, 예전에 물리를 배울 때도 다른 파형을 합하는 건 그냥 각 값을 더하는 걸로 상쇄-보강을 배웠잖은가? 같은 원리인 모양이다.

 

다만 몇 가지 유의사항이 있는데, 이 과정은 float pcm으로 진행하는 것이 좋다. 정수 pcm도 불가능하진 않으나 여러 개를 합치는 것이므로 높은 소리들이 섞일 경우 overflow의 위험이 있다. float이어야 합친 후 전체적으로 소리를 줄인다던가, 그 부분만 천장에 맞게 깎는다던가 할 수 있다.

또한 sample rate가 다른 소리들은 합칠 수 없다. 다르다면 동일하게 리샘플링 과정을 거쳐야만 한다.

마찬가지로 channel count가 달라도 합칠 수 없는데, 다를 경우 panning 등을 사용해서 동일한 채널 수로 맞춰줘야 합칠 수 있다.

 

Busses

처음엔 이게 뭘까 싶었는데, 컴퓨터에서 쓰는 버스와 유사한 (...?) 개념으로 보인다.

하나의 input 에서부터 여러 개의 output으로 나가는 것으로, 단순하게 사운드를 복제하는 것 같다.

단일 사운드를 여러개의 사운드카드로 보내거나(대체 어떨 때 이런 작업이 일어나는 걸까...) 하나의 소리를 (원본 소리) + (이펙트로 수정된 소리)로 합치고자 할 때 사용된다는 것 같다.

나처럼 음알못은 대체 언제 이런 경우가 있는 건지 잘 상상도 안 간다. 이런 게 있다고만 알아두자.

 

 

Signal Chain Outputs

일반적인 output은 input과 유사하다. 양쪽 다 sound 이기때문에 당연한 현상이다. output 이 sound 인 이상 input이 될 수 있으니까.

 

1. 파일에 쓰기 (audio file)

2. soundcard 로 재생 (스피커 등, pcm으로 전달되어야 함)

3. 네트워크를 통해 스트리밍 (코덱을 사용)

 

key considerations (고려사항)

1. codecs

2. buffering

3. latency

 

Visualization (시각화)

오디오를 귀로 듣고 파악하는 것보다 신속하고 정확하게 문제 해결을 할 수 있다. 분석하기에도 훨씬 용이하다.

청각은 한번에 하나밖에 들을 수 없는 반면에 시각은 여러개를 파악할 수 있고, 소리 전체를 볼 수 있으며, 컴퓨터의 분석력을 빌릴 수 있기 때문이다.

물론 청각보다 시각이 정밀하다는 건 말할 필요도 없으리라.

 

일반적인 시각화 방법

1. Volume Meters

2. Waveform

3. Spectrum Analyzers

4. Tuners

 

Volume Meters

소리의 크기를 데시벨로 표현한다. 물론 0db가 표현 가능한 최대치(천장)이다.

여러 signal chain에서 표시되며, output이 1.0f 를 넘어 clipping의 위험이 있을 경우 경고해주는 역할을 하기도 한다.

물론 기본 기능은 현재의 소리가 어느 정도인지를 표시해주는 역할이다.

 

Waveform

 

가장 일반적이고, 일반인들도 '소리 시각화' 하면 떠올릴법한 시각화 방법이다.

전체 소리의 파형을 나타내는 방법으로, x축은 시간이고 y축은 소리의 크기(진폭)다. 소리의 높낮이나 음색은 확인할 수 없다.

 

x축이 시간으로 전체 오디오를 보여주기 때문에, 소리를 편집하는 데 주로 사용된다. 어느 순간 소리가 나고 어느 순간 침묵하는지 등의 위치를 구분하여 단어의 어절을 구분하거나 할 때도 유용하게 사용할 수 있다.

 

Spectrum Analyzer

위 파형과 다르게 x가 주파수, y가 음량(진폭)이다.

 

 

 

어떤 주파수에 어느 정도의 에너지가 있는지 표현해준다. 다만 시간 정보가 없어서 한 순간의 소리만을 파악할 수 있다는 게 단점이다.

음의 높낮이를 구분할 수 있으며, 예를 들자면 피아노에서 '도' , '시' 를 친다면 다른 위치에 에너지가 쏠리는 걸 볼 수 있을 것이다.

 

Spectrogram

강의에 나오진 않았지만, 내가 필요한 개념이라 찾아보고 추가했다.

파형과 스펙트럼을 합친 개념이라고 볼 수 있다.

 

 

 

x축이 시간, y축이 주파수이고 진폭을 색상으로 표현하였다. 일종의 3차원 그래프라고 볼 수 있겠다.

위 예시에서 보면 밝을수록 높은 진폭(큰 소리) 이고, 3차원 공간에 모델링한다면 아래쪽이 높은 산맥같은 형태가 될 것이다.

 

Tuner

들어오는 소리를 듣고, 어떤 음계인지 파악하는 도구이다.

이펙트를 입힌 후에는 감지하기 어려우므로 입력 바로 다음에 들어가도록 배치된다.

자세한 사용 예는 나오지 않았지만 파악하기만 하는것인지, 파악하여 조작가능하게 하는 것인지는 모르겠다.

다만 파악 후 if문처럼 원하는 값이면 내보내고, 아니면 조작하는 식으로 작동할 수는 있을 것 같다.

 

 

 

디지털 오디오 강의는 여기까지이다.

순 재생 시간은 4시간이 채 되지 않는 짧은 강의였지만, 내가 필요한 기본적인 지식의 공급원으로서의 역할은 충분히 한 것 같아서 만족스럽다. (실제로는 한 12시간 넘게 썼다. 되돌려보고 필기에 검색에 블로그까지 정리하다 보니.)

물론 모르는 건 모르는 것조차 모르는 것이기에 기본적이고 내게 도움이 되는 정보가 여기 담겨있지 않을 가능성은 상당히 높지만, 그렇다고 본격적으로 책 따위를 사다가 공부할 생각은 없으니까. 그건 너무 효율이 나쁘다.

 

실제 작업을 시작하기에 앞서서, 다음 NAudio 강의를 보면서 이와 마찬가지로 정리해볼 예정이다.

작업에서 내가 필요한 게 뭔지는 대충 알고 있으니만큼 필요한 정보가 없다면 그때 보면 되겠지.

 

그럼, 이만.

 

 

출처 : https://m.blog.naver.com/luku756/221879658522