[2023 01 27] 목소리 더빙, 보이스 도와주는 프로그램 개발 연습 일지 (3) - Whitmem
[2023 01 27] 목소리 더빙, 보이스 도와주는 프로그램 개발 연습 일지 (3)
개발 기록
2023-01-28 02:32 게시 6c2f97c48a9f6611eabd

0
0
84
이 페이지는 외부 공간에 무단 복제할 수 없으며 오직 있는 그대로 게시되며 부정확한 내용을 포함할 수 있습니다. 법률이 허용하는 한 가이드 라인에 맞춰 게시 내용을 인용하거나 출처로 표기할 수 있습니다.
This page is not to be distributed to external services; it is provided as is and may contain inaccuracies.
이번 목표
목소리 녹음 소프트웨어의 PD Layer의 클래스 다이어그램을 마무리 짓고 문제점을 해결하기로 한다. 그리고 흐름을 구성하는 것이 다음 목표이다.
클래스 다이어그램
클래스 다이어그램을 조금 다듬었다. 원래 Scene은 UI 상에서 나눌 수 있는 데이터로 취급하려고 했고, 그렇기 때문에 PD Layer에 포함하지는 않았으나, 추후 설계 과정에서 Track을 각 Scene에 종속할 필요성이 생겼고 (추후 해당 장면 내에서 트랙의 순서 등을 제어하기 위함, 트랙의 순서는 단순 디자인뿐만 아니라 실제 처리에서 해당하는 순서의 인덱스를 가져와 처리하는 등 작업 추가 예정), 그렇기 때문에 Scene 이라는 클래스 자체를 구성해서 이 안에 Track을 종속하기로 하였다.

클래스 - Scene
Scene은 장면 하나를 의미하는 클래스! 이 장면 오브젝트 안에 각종 트랙을 인덱스 순서대로 넣을 수 있도록 한다. 이 Scene 인스턴스 하나는 Track을 여러개 담을 수 있다.
클래스 - Track
Track 은 소리 주석 등 원하는 타임라인에 오브젝트를 넣을 수 있도록 하는 부모를 의미한다. 이 트랙안에 여러개의 오브젝트를 시간상으로 배치함으로써 실제 흐름을 구성할 수 있도록 하는 것이 목표이다.
클래스 - Obj
Obj는 하나의 음성 또는 주석을 의미하는 것으로 특정 시간에 배치될 것인지에 대한 정보를 가지고 있다. 예를 들어, 안녕하세요 라는 목소리 녹음본이 있고, 이를 1 트랙의 15초경에 3초 간 재생하는 것이 목표라면, 이 Obj는 StartTime 15, EndTime 18을 가지게 된다. 이러한 Obj는 원하는 Track안에 배치된다.
클래스 - AudioData 또는 ImageData
Data 클래스는 어떤 이미지나 사운드가 처리될 때 버퍼의 역할을 한다. 예를 들어 음성 녹음 1000개가 존재할 때 이 음성 파형 Buffer을 모두 한 번에 로드하면 성능 상 문제가 발생하거나 메모리 사용량 초과의 문제가 발생할 수 있기에, 이를 적절하게 관리할 수 있도록 제어해야 할 필요가 있다. 특정 재생 시간이 되거나 일정 버퍼 내에 있을 때 자동으로 버퍼 로드 요청을 할 수 있고 동적으로 처리 할 수 있도록 클래스를 만들어 관리한다. 평소에는 자동으로 버퍼가 정리되고, 필요할 때 하드디스크로부터 메모리에 탑재할 수 있도록 도와주는 것을 목표로 한다
문제점
현재 클래스 다이어그램에서 존재하는 큰 문제점은 AudioData에 있다. 음성 Obj 클래스를 보면 트랙 내 음성이 시작되고 끝나는 시점은 명시되어 있지만, 내부 파형이 시작되는 위치, 종료되는 위치, 또 어떤 식으로 조작할 수 있도록 할 것 인지에 대한 구성 정보를 담고 있지 아니하다. 따라서 이러한 데이터를 관리할 수 있도록 Attributes를 기존 SoundObj에 넣어야 할 것으로 보인다. 이런 경우 추후 외부에서 사운드 재생이나 합성을 진행할 때 위치를 보간하는 수식 작업을 진행해야 하는데, AudioData 파형을 가져와 한번 더 수식 처리를 해주고 난 뒤의 데이터를 처리해야 하기 때문에 유지 보수가 매우 힘들어진다. 따라서 AudioData를 참조하는 AudioBufferData 라는 클래스를 만들어 원하는 버퍼를 구성할 수 있도록 구성하였다.

AudioBufferData가 추가된 모습
이로써 SoundObj는 AudioBufferData라는 것을 하나 거쳐서 AudioData에 도달한다. AudioData에 원본 목소리 wav 가 로드되어 있다면, 비로소 AudioBufferData가 그 파형의 시작점, 끝 점, 기타 설정 사항을 반영하고 Play나 getBuffer에서 알아서 반환하도록 한다.
특히 여기서 신경 써야 할 점이 하나 있는데, 상기 언급한 AudioBufferData 역시 여러 Obj에 참조할 수 있도록 할 것인지, 아니면 SoundObj가 하나 만들어지면 이는 1대1 대응으로 고정될 것인지 구성해야 하는데, 이는 요구 사항에 따라 달라질 것으로 보인다.
지금 여기서는 AudioBufferData 한 개를 복수 개 이상의 SoundObj에서 참조할 수 있도록 구성하면 고려해야 할 사항이 많아지기 때문에, 1대1 대응으로 구성하기로 한다. 따라서, 변경 사항은 다음과 같다.

AudioBufferData는 1대1 대응으로 구성

전반적인 클래스 다이어그램
이로써 전반적인 구성은 완료되었다. 이제 각 클래스의 흐름을 글로써 명시하고 (정확히는 시퀀스 다이어그램이나 액티비티 다이어그램으로 나타내는 것이 먼저지만, 시간 상 생략하기로 한다.) PD Layer 부분의 프로그램 개발을 시작하기로 한다.
댓글 0개
댓글을 작성하는 경우 댓글 처리 방침에 동의하는 것으로 간주됩니다. 댓글을 작성하면 일회용 인증키가 발급되며, 해당 키를 분실하는 경우 댓글을 제거할 수 없습니다. 댓글을 작성하면 사용자 IP가 영구적으로 기록 및 부분 공개됩니다.
확인
Whitmemit 개인 일지 블로그는 개인이 운영하는 정보 공유 공간으로 사용자의 민감한 개인 정보를 직접 요구하거나 요청하지 않습니다. 기본적인 사이트 방문시 처리되는 처리 정보에 대해서는 '사이트 처리 방침'을 참고하십시오. 추가적인 기능의 제공을 위하여 쿠키 정보를 사용하고 있습니다. Whitmemit 에서 처리하는 정보는 식별 용도로 사용되며 기타 글꼴 및 폰트 라이브러리에서 쿠키 정보를 사용할 수 있습니다.
이 자료는 모두 필수 자료로 간주되며, 사이트 이용을 하거나, 탐색하는 경우 동의로 간주합니다.