취미가 개발인 개발자 신수형입니다.

개발에 큰 흥미를 느낀건 2021년 10월 해커톤에 참여하고 난 이후였습니다. 당시 42서울에서 교육을 받고있었는데 내부에서 교육자료를 만드는 해커톤에 참여하게 되었습니다. 해당 해커톤은 팀만의 교육과정을 직접 만들어 소개하는 것을 주제로 진행되었습니다. 2주간의 기간동안 진행되었는데 4일차 되던 날 한가지 의문이 들었습니다. “교육과정을 직접 만드는 것 까진 좋지만, 실제로 다른 학생들이 교육과정에 참여할 수 있으면 좋지 않을까?”

이후 저희팀은 해당 해커톤에 참여한 교육과정을 모아 소개하고 참여, 채점 등을 진행할 수 있는 교육 플랫폼을 개발하기로 하였습니다. 당시 서비스 개발을 처음 참여했지만, 이 문제를 해결하고 싶다는 의지를 가지고 남은 열흘 가량 몰입해서 개발을 진행했습니다. React 도 처음, 백엔드와 함께한 프로젝트도 처음이였지만 마지막날 결국 원하는 기능을 만들어 해커톤 당일 발표할 수 있었습니다. 실제로 해당 발표에서 평가단의 큰 호응을 받아 최우수상을 받았습니다.

해당 과정에서 개발에 몰입해서 성과를 내는 경험이 큰 자극제가 되었습니다. 이후 다양한 프로젝트를 진행하면서 새로운 문제를 찾고 팀원들과 함께 해결해 나갔습니다. 취업을 위해서가 아닌 개발의 모든 과정이 즐거워서 개발자를 목표로 삼았습니다.

다양한 프로젝트에서 적극적으로 수학 지식을 활용

최근 Canvas api를 활용한 차트 라이브러리(라이브러리 링크) 만들었습니다. 해당 과정에서 Frame Count에 따른 막대 그래프의 애니메이션을 적용하기 위해서 수학 지식을 적극적으로 활용했습니다. 막대의 시작 높이, 목표 높이와 증감함수, 속도 등을 사용자 설정으로 입력 받아서 추상화된 함수를 구현하였습니다.

또한 C언어를 사용해 간단한 Ray tracing을 구현(프로젝트 링크)하였습니다. 해당 프로젝트는 2차원상에 3차원 도형을 렌더링하는 프로젝트였습니다. Raytracing을 직접 구현하다 보니 수학적인 지식이 많이 필요했습니다. 충돌과 같은 경우 판별식을 활용하면 어렵지 않게 구현할 수 있었지만, 굴절률과 반사율을 계산하고 구현하는 것이 까다로웠습니다. 특히 반사의 경우 반사가 한 번 이루어질 때마다 흡수율이 존재해야 했고 굴절은 매질마다 굴절, 반사가 동시에 일어나야 했습니다. 한 번에 구현하는 것이 어려웠기 때문에, 100% 반사부터 구현하고, 흡수율 구현, 굴절 구현 등 작은 업무 단위로 쪼개어서 개발을 진행하였습니다.

학부에서는 기초수학 A, 미분적분학 A+ 성적을 받았습니다.

한국어 음성 딥러닝을 활용한 립싱크 프로젝트 제작 경험

코로나로 인해 화상회의를 사용이 증가했습니다. 하지만 화면을 가리거나 단순한 2D 캐릭터를 보여주는 경우 대화의 경험이 많이 떨어지는 것을 느꼈습니다. 그래서 2D 캐릭터를 보여주더라도 사용자의 발화에 따라 립싱크를 할 수 있다면 화상회의에 대한 사용자 경험이 조금 더 긍정적일 것이라고 생각했습니다.

영어 발화에 대한 립싱크 툴들의 정확도는 높았지만 한국어 음성에 대한 정확도는 높지 않아서 직접 한국어 음성에 대한 딥러닝을 해보기로 하였습니다. 우선 음성을 텍스트로 바꾸는 STT를 진행한 후, 텍스트에 대해 발음 기호로 변경하고 해당 발음에 맡는 이미지를 매핑하는 방식으로 구현하였습니다. STT는 OpenSpeech의 RNN-Transducer 모델을 활용해 학습을 진행했습니다. 해당 모델을 결정한 이유는 실시간 변환에서의 장점입니다. AI Hub의 한국어 음성 데이터를 활용해 학습을 진행했습니다.

하지만 실제로 화상 회의는 멀리 떨어진 서로 다른 클라이언트에서 진행됩니다. 따라서 추론 과정을 클라이언트에서 직접 진행했어야 하지만 서버에서 추론을 진행하고 클라이언트로 뿌려주는 방식을 사용하다보니 싱크가 안맞는 문제가 발생했습니다. 당시 딥러닝에 대한 지식이 부족해 모델의 사이즈를 줄이거나 추론 엔진을 포팅하는 것에 어려움을 느껴 아쉽게도 클라이언트 사이드에서의 추론 기능은 완성하지 못했습니다.