AI가 있었기에 시작한 네 번째 앱, 소리한편 출시기

네 번째 안드로이드 앱을 출시했다. 이름은 ‘소리한편 – 시·소설·고전문학 낭독’이다. 저작권이 만료된 시를 화면으로 읽고 TTS로 듣는 작은 앱을 생각했는데, 개발하면서 단편소설과 고전 산문까지 담게 됐다.

AI가 없었다면 이 앱은 만들 생각조차 하지 못했을 것 같다. 개발을 도와준 것은 물론, 처음에 몰랐던 기술과 구현 방법을 함께 찾아가는 과정 자체가 앱의 방향을 바꿨다.

스마트폰 안에서 문학을 읽어주는 AI

처음에는 안드로이드 기본 TTS를 쓸 생각이었다. 스마트폰에서 직접 실행할 만큼 작은 오픈소스 음성합성 모델이 있는지도 몰랐다.

AI와 앱 구조를 이야기하다가 기기 안에서 음성을 만드는 방법을 찾았고, Supertonic 3 INT8 모델을 sherpa-onnx로 실행하는 방식을 적용했다. 음성 모델은 필요할 때 Play Asset Delivery로 내려받고, 사용할 수 없으면 안드로이드 기본 TTS로 전환한다.

굳이 시만 읽어줘야 할까?

한 번에 듣기 좋은 단편소설과 산문도 모으기 시작했다.

작품을 모으는 일보다 확인하는 일이 컸다

퍼블릭 도메인 작품이라도 인터넷에서 찾은 글을 그대로 넣을 수는 없었다. 작가의 저작권과 원문 판본을 확인해야 했고, 해외 작품은 번역문 저작권도 따로 살펴야 했다.

수집한 한국 시 중에서는 출처로 기록한 위키문헌 페이지가 없거나 본문이 맞지 않는 작품 26편을 격리했다. 이후 작품마다 원문 출처, 권리 상태, 번역과 해설을 기록하고, 내가 검수·승인한 콘텐츠만 앱에 들어가도록 바꿨다. 승인 뒤에 본문이나 번역이 수정되면 다시 확인하게 했다.

시 몇백 편을 모으는 줄 알았는데, 어느새 작은 문학 데이터베이스를 관리하고 있었다.

클라우드 한도를 피하니 16GB 메모리가 기다렸다

해외 작품은 기존 출판사의 번역본을 쓰는 대신 원문을 바탕으로 새로 번역했다. 처음에는 Claude와 ChatGPT Codex를 번갈아 썼지만, 긴 소설을 번역하고 원문과 대조하는 작업이 늘면서 두 서비스 모두 사용량 한도에 걸렸다.

대안으로 Mac mini에 TranslateGemma를 띄워 초벌 번역을 맡겼다. 쿼터 때문에 작업을 완전히 멈추는 일은 줄었지만, 이번에는 16GB 메모리가 빠듯했다. 다른 작업을 함께 하기 어렵고, 여러 작품을 연속으로 번역하는 것도 부담스러웠다. 앱 개발용으로 살 때는 로컬 AI까지 계속 돌리게 될 줄 몰랐다.

클라우드 AI의 한도에서 벗어나려고 했더니 이번에는 내 컴퓨터의 한도를 만난 셈이다.

번역 품질도 별개의 문제였다. 문학 특유의 문맥과 표현은 다시 손봐야 했다. 로컬 AI 덕분에 상용 AI 사용량이 줄었는지, 초벌 번역을 검수하느라 전체 작업이 늘었는지는 아직 정확히 모르겠다. 다만 작업을 이어갈 수 있다는 점은 도움이 됐다.

번역도 낭독도 실제로 확인해야 했다

AI에 전문 번역을 요청해도 일부가 축약되거나 같은 문장이 반복되는 문제가 있었다. 러시아 고전은 다섯 차례 다시 작업했고, 축약된 번역 14편을 전문으로 다시 번역하기도 했다.

작업 과정은 Codex로 번역하고 Claude에 원문 전체와 대조·교정을 맡긴 뒤, 해설을 작성하고 내가 최종 검수·승인하는 순서로 자리 잡았다. 해설도 작품 이름만 다르고 내용이 비슷한 경우가 있어 다시 썼다. 인용문이 실제 본문에 있는지, 다른 해설과 같은 문장이 반복되는지 검사하는 도구도 만들었다.

낭독 기능에서는 속도와 배터리가 문제였다. 긴 첫 문단은 앞부분부터 합성해 재생을 시작하도록 했다. 작품 전체를 미리 합성했더니 배터리 사용량 경고가 나와, 현재 위치에서 몇 문단만 앞서 준비하는 방식으로 바꿨다. 문장 사이의 쉼도 별도 처리로 조정했다.

근대 한국문학의 ‘×××’, ‘○○’ 같은 검열 표시는 기호 수에 맞춰 ‘모’라고 읽게 했다. 지원하지 않는 언어는 안드로이드 기본 TTS로 넘기고, 음성 캐시의 저장과 무효화 조건도 정해야 했다. 모델 하나를 붙인 뒤에도 실제 낭독에 필요한 규칙은 계속 늘어났다.

‘글소리’에서 ‘소리한편’으로

개발 중 이름은 ‘글소리’였다. 출시를 준비하면서 같은 이름이 이미 다른 용도로 쓰이고 있다는 것을 알게 됐다. 시와 소설, 산문을 함께 담는 앱에 맞춰 ‘한 편의 문학을 소리로 듣는다’는 뜻의 ‘소리한편’으로 바꿨다.

패키지명 com.next2great.geulsori는 유지했다. 이미 비공개 테스트를 진행한 상태에서 바꾸면 새로운 앱으로 다시 시작해야 했기 때문이다.

게시를 요청하고 11일을 기다렸다

9월 3일 비공개 테스트를 시작하고 번역과 TTS, 성능을 계속 고쳤다. 음성 모델로 번들 크기가 200MB를 넘어 대용량 업로드 처리도 두 차례 수정했다.

9월 20일 프로덕션 액세스를 승인받았고, 다음 날 AdMob 광고를 적용해 게시를 요청했다. 읽기와 낭독을 방해하고 싶지 않아 본문 읽기와 낭독 화면에는 광고를 넣지 않았다.

출시는 금방 될 줄 알았는데 검토가 길어졌다. 열흘이 넘어가니 작품의 저작권을 하나씩 확인하는 것은 아닌가 하는 생각까지 들었다. 실제 이유는 알 수 없었다. 10월 2일, 게시 요청 후 11일 만에 0.7.6 버전이 공개됐다.

기다리는 동안에도 작업했다. 9월 말 기준 검수·승인한 콘텐츠는 시 1,010편, 산문 421편, 해설 1,431편이었다. 출시 바로 다음 날에는 긴 문단 낭독 순서와 문장 강조, 쉼을 손본 0.8.2 버전을 업데이트 심사에 제출했다.

네 번째 앱이지만 이번에도 처음 겪는 문제가 많았다. 특히 콘텐츠를 믿을 수 있게 만드는 데 손이 많이 갔다. AI가 번역하고 해설한 결과를 원문과 대조하고, 음성이 실제로 어떻게 들리는지 확인하는 일은 내가 맡아야 했다.

아직 추가할 작품도, 고칠 것도 많다. 그래도 이번에는 일단 여기까지 왔다. 이제 소리한편을 좋은 문학 한 편을 부담 없이 읽거나 들을 수 있는 앱으로 조금씩 다듬어가려 한다.

소리한편 — Google Play에서 설치하기

P.S. 당시에는 TranslateGemma로 초벌 번역을 맡겨 상용 AI 사용량이 줄었는지 확신하지 못했다. 번역을 검수하느라 전체 작업이 늘어난 것은 아닌지도 판단하기 어려웠다. 이후 번역 품질과 전체 AI 사용량을 함께 살펴보니, ChatGPT만 사용하는 편이 확실히 낫다고 느낀다. 이번 문학 번역 작업에서 로컬 AI 모델의 한계를 체감했다.