개요
Owncast 프로젝트를 마무리했다.
UMC에서 시작한 첫 사이드 프로젝트였고 애정을 갖고 꽤 오랫동안 개발했었는데,
이제 보내준다는 마음으로 회고를 적는다.
프로젝트 주제
말을 잘하고 싶은 당신을 위한, 나만의 오디오 OWNCAST
Owncast는 외국어 회화 학습 효율화를 위한 LLM 기반 팟캐스트 생성 서비스이다.
사용자의 관심사와 배우고 싶은 언어, 입력한 키워드를 바탕으로 팟캐스트를 만들어 청취할 수 있고,
마음에 드는 문장은 저장해서 따로 공부하거나 다른 사람의 팟캐스트도 검색할 수 있다.
UMC 프로젝트는 기획자가 낸 아이디어에 개발자들이 신청하는 방식이다.
외국어 팟캐스트를 생성한다는 주제가 신선해서 1순위로 신청했었다.
이런 서비스가 있으면 써보고 싶다는 생각도 있었고, CRUD 외의 새로운 경험을 하고 싶기도 했다.
그렇게 결성된 인원은 기획 1명, 안드로이드 3명, 백엔드 5명 총 9명이다.
인원이 너무 많다고 생각할 수 있는데 어쩔 수 없었다. UMC 6기는 백엔드 개발자 풍년이였다.
(사실 디자인 파트도 1명 있었는데, 첫 회의 직후에 그만 뒀다 🤔)
아무튼 이 인원이서 작년 여름 방학 약 두 달 동안 개발했고,
이번 겨울방학 때 약간의 리팩토링을 거쳤다.
개발
개발 기간 동안의 이야기를 주저리주저리 해보자면,,
나는 캐스트 관련 API를 맡았다.
정확히는 캐스트 생성과 저장, 재생, 수정과 삭제 API를 맡았다.
ChatGPT API를 통해 외국어 팟캐스트 스크립트를 만들고, 한국어로 번역해서 문장 별로 매핑하고,
TTS 맡기고, DB에 저장하고,, 이런저런 기능을 만들었던 기억이 새록새록 난다.
지금 생각하면 크게 어려울 게 없을 거 같은데, 당시엔 머리를 싸매고 고민할만한 이슈가 많았다.
이슈
팟캐스트 스크립트를 만드는 게 제일 힘들 줄 알았는데, 의외로 후처리가 더 어려웠었다.
스크립트 생성은 처음엔 어떻게 만들지 몰라서 '서론 본론 결론으로 나누고 각 문단을 따로 생성해야하나..?' 이런 고민을 했었는데
막상 GPT를 써보니까 '~라는 내용으로 팟캐스트 생성해줘!' 까지만 얘기해도 알아서 척척 만들어줘서 참 신기했다.
핵심 기능 중에 문장 북마크 기능이 있다.
이걸 위해 Sentence 엔티티를 따로 만들었는데, 이 Sentence 저장을 위해 문장을 처리하는 게 은근히 머리아팠다.
우선 팟캐스트는 외국어기 때문에 한국어로 번역을 해둔다.
그리고 Sentence는 외국어 문장과 대응되는 한국어 문장을 함께 저장한다.
근데, 자연스러운 번역을 위해 외국어 한 문장이 한국어로 두 개의 문장으로 쪼개지는 경우가 가끔 있다.
(ex. Welcome to the podcast, where we discuss the recent researches of AI! => 저희 팟캐스트에 오신 것을 환영합니다! 이번 시간에는 AI의 최근 연구에 대해서 다뤄보겠습니다.)
단순히 구두점 등으로 문장을 나누면 이런 경우가 대처가 안됐다.
그런데 이때쯤 번역기를 여러 개 써보면서, 대부분의 번역기는 문장 사이에 있는 특수문자는 번역하지 않고 그냥 넘어간다는 걸 알아냈다. (@#$등)
여기서 아이디어를 내서, 번역 전의 외국어 문장 끝에마다 특수문자를 삽입했다.
한국어로 번역하더라도 특수문자는 동일한 위치에 남아있었고, 외국어 문장 하나가 한국어 문장 여러개로 번역되더라도 마찬가지였다.
그래서 특수문자를 기준으로 한국어를 파싱햬서 저장하는 식으로 문제를 우회한 기억이 있다.
UMC 데모데이 / 너디너리 데모데이
어영부영 시간이 지나 데모데이의 시간이 왔다.
데모데이 당일까지도 버그가 있어서 아침에 데모데이 장소 앞 카페에서 다 같이 모여서 불꽃 코딩을 했다.
우리만 그런 줄 알았는데, 다른 조랑 얘기해보니까 다들 마찬가지더라. 🙂
주제가 신선해서 나름 주목을 받았고, 응원 메시지도 많이 받았다.
'혹시 수상도 가능하지 않을까?' 살짝 기대했지만 설레발 쳐서 그런지 그런 건 없었다.
(UMC 6기는 데모데이 점수 형평성에 이슈가 있었다고 전해 듣긴 했다)
아쉽긴 했지만 사람들이 직접 앱을 써보면서 남겨준 응원이 큰 힘이 되었다.
수상은 못했어도 주제가 괜찮았고 완성시켜보니 앱의 만듦새도 꽤 좋았기에 UMC의 상위 조직? 개념인
너디너리 데모데이에 출품할 수 있었다.
너디너리 데모데이는 부산에서 열렸다.
너디너리 측에서 버스를 대여해줬다.
물론 가는 길에도 불꽃코딩했다.
UMC 데모데이 떄와는 다르게 다양한 사람들이 방문했다.
UMC는 데모데이 참가자들 + 참가자들의 친구들이 대부분이였던 반면에
너디너리 데모데이는 그냥 이런 데모데이 자체에 관심이 많아서 구경 온 사람들이 많았다.
현직자 분들도 드물게 계셨다.
우리 부스에 오셔선 목표가 어떻게 되는지 (사이드 프로젝트로 끝나는 건지 출시까지 할 예정인지)를 여쭤보셨다.
프로젝트의 비전이 궁금했던 거 같은데 다들 크게 생각 안하고 있던지라 제대로 대답하지 못하고 얼버무렸던 기억이 있다.
너디너리 데모데이는 수상식이 없다. 그저 서비스를 보여주는 게 끝이었다.
데모데이가 끝나고 팀원들이랑 광안리에서 회 먹고, 바닷구경하다가 새벽에 픽업 버스 타고 기숙사로 돌아왔다.
정리
좋았던 점
첫 사이드 프로젝트인 만큼 배운 게 많았다.
특히 ChatGPT 신봉자가 되었다.
내가 맡은 기능이 기능인 만큼 ChatGPT를 정말 많이 썼었는데, '지피티가 이런 것도 해주네??' 하는 생각이 많이 들었다.
그래서 팀원이 어떤 걸 물어보던 '그거 그냥 지피티 돌리면 될 걸??'라고 얘기하곤 했었다.
기능을 구현하면서 프롬프팅 관련해서도 문제가 많았는데, 해결하는 과정에서
어떻게 질문해야 잘 대답해주는지에 대해서도 느낄 수 있었다.
유지할 점
API의 응답 시간을 고려하기 시작했다.
캐스트 생성 시간은 생각보다 길다. 5분짜리 캐스트 생성하려면 30초를 넘게 기다려야 했다.
캐스트 생성에 꽤 많은 API가 필요하기 때문이다.
사용자가 입력한 키워드를 외국어로 번역하고, GPT로 스크립트를 생성하고, 스크립트 한국어로 번역하고, 문장 별로 분리하고, TTS 생성하고, DB에 저장하고 등등등
처음 개발하는 입장에서는 30초 뭐 기다릴 수도 있지! 싶었는데, 사용자의 입장에서 생각하니까 말이 안되더라.
프로젝트 데모하면서 팟캐스트 생성 시간동안 사용자 주의를 돌리기 위해 열심히 입을 놀리느라 꽤 힘들었다...
응답 시간을 줄이기 위해 함수 비동기 처리도 도입했다.
GPT 스크립트 생성이 시간의 대부분을 차지했어서 극적인 효과는 없어서 아쉽긴 했다.
GPT 스크립트 생성 시간을 줄이려고 스크립트를 문단 별로 병렬적으로 만든다거나, GPT API 스트리밍을 찾아보는 등 이것저것 고민해봤지만, 개발이 마무리되면서 그럴 일이 사라졌다 😩
아쉬운 점
팟캐스트 프롬프팅 쪽을 더 건드려볼걸 하는 생각이 든다.
ChatGPT 자체가 너무 똑똑해서 '팟캐스트 만들어줘잉'하면 알아서 스크립트를 짜주긴 하지만, 계속 듣다보면 비슷한 형식이 반복되는 느낌이 있다.
그래서 스크립트 생성 프롬프트를 여러 개 만들어두고, 여러 개를 랜덤하게 조립해서 지피티한테 건네주긴 했는데 근본적인 해결책은 아니라고 생각한다.
앱 출시에 대한 아쉬움도 남는다.
프로젝트의 목표를 확실히 세우고 팀원들이 서로 인지했어야 했다.
회의 초기 땐 다들 빈말로라도 '출시까지 해야지!' 라고 얘기했었는데 막상 출시에 대해 진지하게 고민한 적은 없는 것 같다.
데모데이가 끝난 직후, 2학기는 각자 보내고 겨울방학 동안 다시 개발해서 출시까지 가보자고 얘기가 나왔지만
반 년이 지나는 동안 몇몇 팀원도 나가고 각자 Owncast 외의 중요한 일들이 생겼다.
각자 더 중요한 일들이 자리잡은 와중에 이미 우선순위가 낮아진 Owncast를 다시 올려두긴 힘들었다.
저번 주에 이 프로젝트를 어떻게 끝낼지 길게 회의했고, 결국 여기서 마무리짓는 걸로 결론이 났다.
프로젝트에 대해 열정이 있고 출시까지 하고 싶다면, 열정이 흩어지기 전에 마무리를 짓는 게 좋을 것 같다.
'회고' 카테고리의 다른 글
[삼성전자 DX] 2025 상반기 S/W 알고리즘 특강 합격 후기 (1) | 2025.02.01 |
---|---|
[프로젝트] 이슈있슈 - 이슈관리시스템 회고 (8) | 2024.11.04 |