[2023 02 13] 목소리 더빙, 보이스 도와주는 프로그램 개발 연습 일지 (11) - 렌더러 구성 - Whitmem
[2023 02 13] 목소리 더빙, 보이스 도와주는 프로그램 개발 연습 일지 (11) - 렌더러 구성
개발 기록
2023-02-13 06:43 게시 a213b4fcaf90e496466f

0
0
87
이 페이지는 외부 공간에 무단 복제할 수 없으며 오직 있는 그대로 게시되며 부정확한 내용을 포함할 수 있습니다. 법률이 허용하는 한 가이드 라인에 맞춰 게시 내용을 인용하거나 출처로 표기할 수 있습니다.
This page is not to be distributed to external services; it is provided as is and may contain inaccuracies.
작업 목표
여러 트랙을 한 트랙으로 압축하는 렌더러를 구성하고, 소리를 내보낼 수 있도록 구성한다.
단일 트랙의 렌더러
먼저 사용자가 생성한 트랙이나 시스템에서 생성된 VTrack에 대하여 AudioPackage로 추출하거나 렌더링할 수 있다. 이는 트랙에 생성된 오디오 스트림을 모두 합쳐 하나의 AudioPackage로 꺼내는 작업이며, 소리 파일을 내보내거나 소리를 재생할 때 필요한 스트림의 역할을 한다.

단일 트랙의 렌더러

문제점이 하나 존재 하는데, 단일 트랙의 렌더러는 하나의 트랙만 전체 소리 스트림으로 내보내기 때문에 다수의 트랙이 있는 경우 각 트랙을 하나씩 처리한 뒤 최종 스트림을 모두 합쳐야 한다.

여러 트랙을 하나의 트랙으로

하지만 위 구현에 따르면, 스트림이 만들어진 이후에야 트랙을 서로 합칠 수 있게 되므로, 오디오가 없는 부분에서는 성능 낭비가 발생할 수 있다.


트랙 내 오디오 처리

상기 그림 처럼, 약 2분 가량의 프로젝트에 중간에만 Object가 존재한다고 가정하자. 이 때 좌우로는 아예 오브젝트가 존재하지 않기 때문에 소리 샘플은 없는 상태이다. 하지만 위 렌더러를 통해 하나의 트랙을 처리하고 나면, Object는 사라지고 긴 소리 데이터로 바뀌게 된다. Object가 존재하는 부분은 오디오 샘플이 존재하겠지만, Object가 존재하지 않는 부분은 0인 오디오 데이터로 존재하게 된다. 즉 Object가 존재하지 않는 위치에까지 소리 샘플 0으로 자리를 채우고 있게 되는 셈이다. 이런 경우, 빨간 박스까지 작업을 처리해야하는 문제가 발생하며, 약 40초의 0 샘플을 덧셈 연산해야 하는 시간 낭비가 발생할 수 있다.
만약 sample rate 44100hz, 2channel 인 경우, 44100 * 40 * 2 번의 CPU 연산 작업을 헛으로 사용하게 된다. 따라서, 무작정 VTrack들을 단일 Stream으로 변환하기 보다, 겹쳐있는 스트림들을 다시 VObject로 묶어서 최종적으로 VTrack 하나로 만든 뒤, 이 VTrack 하나를 렌더링하는 방법을 사용하기로 결정하였다.
VTrack Compressor
즉, 대량의 VTrack이 존재할 때, 해당 VTrack 내에 있는 Object들을 먼저 조사한 뒤, 겹쳐 있는 VObject들의 스트림 연산을 먼저 진행하고, 하나의 트랙에 존재하는 것 처럼 만든 뒤 새로 만들어진 트랙을 반환해준다.

VTrack Compressor

이렇게 반환된 VTrack을 비로소 VTrack Renderer에 요청함으로써 불필요한 작업을 최소한으로 줄일 수 있다.
아래 사진은 vObject간의 소리 샘플을 합치는 부분을 나타낸 것이다. 성능 문제점이 하나 존재 하는데, 이 역시도 zero sample인 부분을 더하게 된다는 것이다.

VObject Mixer 클래스
예를 들어, 두 개의 오브젝트를 더하는 상황일 때, 겹치는 부분은 반드시 덧셈 연산이 필요하다.



두 VObject의 덧셈 연산
이 상황에서는 겹치지 않는 부분까지 배열에 데이터를 새로 만들고 그대로 for을 돌아가며 데이터를 쌓아가는 작업을 진행하고 있기 때문에, 비교적 시간이 낭비될 수 있다. 물론, 하나의 데이터만 존재할 때에도 복사를 하기 위해서는 for을 돌아야 하지만, 위 소스코드에서는 단순히 for만 도는 것이 아닌 내부에서 시간 위치 및 변수를 생성하고 더해야 하는 대상이 맞는지 확인하는 절차가 추가되어 있기 때문에 대량의 데이터를 처리하는데에는 비교적 더 많은 시간이 소요될 수 있을 것으로 추정된다. 하지만 이 부분까지 고려하기에는 시간이 촉박하고 단기 프로젝트를 빨리 마무리 짓기 위해서 내비두기로 결정하였다.
다음 목표
소리 재생 처리자를 구성하고 UI를 구성한다. UI를 구성하고 PD-Layer을 테스트 해 본다.
댓글 0개
댓글을 작성하는 경우 댓글 처리 방침에 동의하는 것으로 간주됩니다. 댓글을 작성하면 일회용 인증키가 발급되며, 해당 키를 분실하는 경우 댓글을 제거할 수 없습니다. 댓글을 작성하면 사용자 IP가 영구적으로 기록 및 부분 공개됩니다.
확인
Whitmemit 개인 일지 블로그는 개인이 운영하는 정보 공유 공간으로 사용자의 민감한 개인 정보를 직접 요구하거나 요청하지 않습니다. 기본적인 사이트 방문시 처리되는 처리 정보에 대해서는 '사이트 처리 방침'을 참고하십시오. 추가적인 기능의 제공을 위하여 쿠키 정보를 사용하고 있습니다. Whitmemit 에서 처리하는 정보는 식별 용도로 사용되며 기타 글꼴 및 폰트 라이브러리에서 쿠키 정보를 사용할 수 있습니다.
이 자료는 모두 필수 자료로 간주되며, 사이트 이용을 하거나, 탐색하는 경우 동의로 간주합니다.