Voice Cloning + TTS API 시스템 PRD

목표:
사용자가 제공한 음성으로 개인화된 TTS 서비스를 제공하는 오픈소스 기반 API 시스템을 Google Cloud 위에 구축한다.

 

 핵심 기능 요약

기능 설명
음성 클로닝 사용자가 업로드한 음성(3~5초)을 기반으로 음색 임베딩 생성
텍스트 → 음성 합성 사용자가 입력한 텍스트와 임베딩을 사용하여 음성 생성
REST API 음성 업로드, 합성 요청, 결과 조회 API 제공
저장 Cloud Storage에 사용자 음성 및 합성 결과 저장
GPU 기반 추론 Vertex AI Custom Job을 활용한 TTS 처리 (필요 시 GCE로 확장)

 

 구성 요소 및 기술 스택

구성 요소 기술 설명
음성 클로닝 모델 xtts-v2, YourTTS, SV2TTS 음성 임베딩 생성 및 다국어 음성 합성 지원
TTS 엔진 xtts-v2 (by Coqui) 텍스트 + 임베딩 → 오디오 생성
API 서버 FastAPI + Docker + Cloud Run /upload, /synthesize REST API 제공
음성 저장소 Cloud Storage 원본 및 합성 음성 저장 (gs://.../voices/, .../results/)
TTS 실행 환경 Vertex AI Custom Job (GPU) 비용 효율적 배치 처리용
향후 확장 가능 환경 GCE GPU 인스턴스 + FastAPI 실시간 추론 서비스 필요 시 확장
임베딩 관리 Firestore 또는 Redis (옵션) user_id별 speaker embedding 저장
배포 자동화 Cloud Build + Artifact Registry + YAML CI/CD 구성
인증 및 보안 Firebase Auth / Cloud IAM / API Key 사용자 인증, 호출 제한
모니터링 Cloud Logging, Error Reporting 상태 추적 및 장애 감지

 

 아키텍처

graph TD
  A[사용자] -->|음성 업로드| B[Cloud Run API 서버]
  B --> C[Cloud Storage (원본 음성 저장)]
  B --> D[Vertex AI Custom Job (XTTS 추론)]
  D --> E[Cloud Storage (합성 결과 저장)]
  B -->|합성 음성 URL 반환| A

 

 폴더 및 Docker 구조

voice-clone-backend/
├── cloudrun-api/                        # Cloud Run용 경량 API 서버
│   ├── app/
│   │   ├── main.py                      # /synthesize 요청 수신
│   │   ├── trigger_job.py              # Vertex Job 실행용 wrapper
│   │   ├── voice_encoder.py            # 사용자 음성 임베딩
│   │   ├── storage.py                  # GCS 입출력
│   │   └── config.py                   # 환경 설정
│   ├── requirements.txt                # ⚠️ TTS 제거
│   ├── Dockerfile                      # Cloud Run용
│   └── deploy/
│       └── cloudrun.yaml               # 배포 스크립트
└── vertex-job/                         # Vertex AI Custom Job 실행 코드
    ├── job/
    │   ├── run_batch.py                # text + voice_id → 음성 생성
    │   ├── tts_engine.py              # XTTS 호출 wrapper
    │   ├── voice_encoder.py           # 동일하지만 Vertex 버전
    │   ├── storage.py
    │   └── config.py
    ├── requirements.txt                # ⚠️ TTS 포함 (TTS, torch 등)
    ├── Dockerfile                      # Vertex Job용
    └── deploy/
        └── xtts-job.yaml              # Custom Job 정의 YAML

 

처리 흐름

1. 사용자 음성 업로드

  • 클라이언트 → /upload-voice 호출 (파일 포함)
  • Cloud Run → GCS /voices/{user_id}/sample.wav 저장
  • (선택) speaker embedding 생성 후 Firestore/캐시에 저장

2. 텍스트 → 음성 합성

  • 클라이언트 → /synthesize 호출 (text, user_id)
  • Cloud Run → Vertex AI Custom Job 실행 요청
  • XTTS 모델 실행: sample.wav + text.wav 결과 생성
  • 결과 파일 gs://.../results/{user_id}/{uuid}.wav 저장
  • Cloud Run → 결과 URL 반환

 

 비용 전략

실행 방식 장점 월 예상 비용 (T4 기준)
Vertex AI Custom Job 사용한 시간만큼만 과금 (비용 효율) $30$50/월 (1일 12시간 기준)
GCE GPU 인스턴스 실시간 API 서버 운영 가능 $390~400/월 (상시 실행 기준)

 

 

구현 내용

https://github.com/blcktgr73/VoiceCloning

📚 PDF 책 읽기 앱: 기능 요약

기능 설명

  • 📖 책 목록 화면 등록된 PDF 책들의 표지를 보여주고, 읽은 비율을 ProgressBar로 표시
  • ➕ 등록 기능 파일 선택(File Picker)으로 PDF를 등록
  • 🗑 삭제 기능 등록된 책을 삭제할 수 있음
  • 📄 책 읽기 화면 선택한 책의 내용을 페이지 단위로 표시, 이전/다음 페이지 이동 가능
  • 🔊 TTS 기능 현재 페이지 내용을 TTS로 읽어줌 (기기 TTS or 온라인 TTS 선택 가능)
  • ⚙️ 설정 메뉴 사용자가 TTS 엔진을 기기용/온라인용으로 선택 가능

🧱 프로젝트 폴더 및 파일 구조 (패키지 기준)

com.example.pdfreader
├── MainActivity.kt                  // 책 목록 UI (RecyclerView)
│
├── adapter
│   └── BookListAdapter.kt          // RecyclerView Adapter
│
├── data
│   ├── Book.kt                     // Room Entity
│   ├── BookDao.kt                  // Room DAO
│   └── BookDatabase.kt             // Room DB 생성
│
├── tts
│   ├── TtsService.kt            // TTS 호출 (기기/온라인 선택)
│   └── OpenAiTts.kt             // Open AI TTS 통신 API
│
├── ui
│   └── SettingsFragment.kt         // TTS 설정 메뉴
│   └── PdfReaderActivity.kt        // PDF 페이지 보기 + TTS
│
└── res
    ├── xml/preferences.xml         // TTS 선택 Preference 정의
    └── values/arrays.xml           // TTS 옵션 배열 정의

🛠️ Empty Project에서 단계별 구현 순서

🔹 1단계: 기본 구성 (Empty Project → 책 목록 화면 만들기)

  • MainActivity.kt 생성
    • RecyclerView 추가하여 등록된 책 표시
    • Book.kt, BookDao.kt, BookDatabase.kt 구성
    • BookListAdapter.kt 작성
    • 책 등록 버튼 → FilePicker 구현
    • PDF 썸네일 추출 (PdfRenderer) → Room에 저장

📦 관련 기술: Room, RecyclerView, PdfRenderer, ActivityResultContracts.OpenDocument

🔹 2단계: 책 읽기 화면 구성

  • PdfReaderActivity.kt 생성
  • PDF 페이지 표시 (AndroidPdfViewer 또는 PdfRenderer)
  • 페이지 이동 버튼 추가 (이전/다음)
  • 읽은 페이지 비율 저장 → Book.progress 업데이트

📦 관련 기술: PdfRenderer, Intent 전달, 상태 저장

🔹 3단계: TTS 기능 연결

  • PdfReaderActivity에서 진행하면, Background 재생이 안됨. Foreground Service를 이용해서 TtsService.kt 생성
  • 현재 페이지의 텍스트 추출 (PdfTextStripper 또는 PdfBox-Android)
  • TextToSpeech 기본 연동
  • 테스트용 더미 온라인 TTS 연동 (나중에 실제 API로 교체 가능)

📦 관련 기술: TextToSpeech, Coroutine, MediaPlayer (온라인 TTS 음성 재생)

🔹 4단계: 설정 화면 구성

  • SettingsFragment.kt 생성
    • preferences.xml에 ListPreference 구성
    • SharedPreferences를 통해 tts_engine 설정값 저장
    • TtsService.kt와 OpenAiTts.kt의 연동

📦 관련 기술: PreferenceFragmentCompat, SharedPreferences, OpenAiTts 연동

📎 참고 라이브러리

라이브러리 기능 링크
AndroidPdfViewer PDF 페이지 표시 https://github.com/barteksc/AndroidPdfViewer
Room 로컬 DB 저장소 https://developer.android.com/training/data-storage/room
TextToSpeech 음성 출력 Android SDK 기본 포함
PdfBox-Android PDF 텍스트 추출 https://github.com/TomRoush/PdfBox-Android
OkHttp 온라인 TTS 호출 시 https://square.github.io/retrofit/

참고링크

https://github.com/blcktgr73/BookPlay
https://www.facebook.com/share/v/162RyBjF7A/

+ Recent posts