AI 모델 및 추론 서버 개발 가이드
목차
소개
ZONOS는 Zyphra에서 개발한 오픈소스 텍스트-음성 변환(TTS) 솔루션입니다. 사용자 음성 등록부터 감정을 포함한 음성 합성까지 다양한 기능을 제공합니다.
ZONOS GitHub 레포지토리: https://github.com/Zyphra/Zonos
주요 기능
- 화자 등록: 사용자 음성을 등록하여 개인화된 음성팩 생성
- 음성 합성: 텍스트를 사용자 음성으로 변환
- AI 리포터: 카테고리와 작성 스타일에 맞는 응답 생성 및 음성 합성
- 감정 표현: 음성에 다양한 감정 부여 가능
기술 스택
- 언어: Python 3.10
- 프레임워크: FastAPI
- AI/ML: PyTorch, Transformers
- 인프라: Docker, AWS(S3, SQS)
- 음성 처리: torchaudio, SudachiPy, Phonemizer
디렉토리 구조
AI/
├── zonos/ # 핵심 모델 및 알고리즘
│ ├── backbone/ # 백본 모델 구성요소
│ └── ... # 기타 모델 관련 파일
├── utils/ # 유틸리티 함수
│ ├── voice_synthesizer.py # 음성 합성 핵심 로직
│ ├── storage_manager.py # S3 스토리지 관리
│ ├── sqs_handler.py # AWS SQS 메시지 처리
│ ├── synthesis_handler.py # 음성 합성 및 AI 리포터 요청 처리
│ ├── text_converter.py # 텍스트 변환 및 전처리
│ └── voice_registration_handler.py # 화자 등록 및 음성팩 생성
├── config/ # 설정 파일 디렉토리
├── main.py # API 서버 진입점
├── Dockerfile # 도커 이미지 정의
└── pyproject.toml # 프로젝트 의존성 정의
API 엔드포인트
AI 서버는 다음과 같은 주요 API 엔드포인트를 제공합니다:
1. 화자 등록
POST /register_speaker
- 음성 파일 업로드 및 화자 ID 등록, 음성팩 생성 및 저장, 샘플 보이스 합성
2. 음성 합성
POST /synthesize
- 텍스트를 사용자 음성으로 변환, 감정 조절 가능, S3에 결과 저장 및 SQS로 알림
3. AI 리포터
POST /assistant
- 프롬프트, 카테고리, 작성 스타일 기반 응답 생성, 생성된 응답을 음성으로 합성, S3에 결과 저장 및 SQS로 알림
4. 상태 확인
GET /health
- 서비스 상태 모니터링
환경 변수 설정
프로젝트 루트에 .env
파일을 다음과 같이 생성합니다:
# OpenAI API 키
OPENAI_API_KEY=sk-your-api-key-here
# AWS S3 설정
AWS_ACCESS_KEY_ID=your-access-key
AWS_SECRET_ACCESS_KEY=your-secret-key
AWS_DEFAULT_REGION=ap-northeast-2
AWS_BUCKET_NAME=your-bucket-name
# AWS SQS 설정
AWS_SQS_REGISTER_QUEUE_URL=https://sqs.ap-northeast-2.amazonaws.com/your-account-id/your-queue-name
AWS_SQS_SYNTHESIZE_QUEUE_URL=https://sqs.ap-northeast-2.amazonaws.com/your-account-id/your-queue-name
AWS_SQS_ASSISTANT_QUEUE_URL=https://sqs.ap-northeast-2.amazonaws.com/your-account-id/your-queue-name
설치 및 실행
# 도커 이미지 빌드
docker build -t zonos-tts .
# 도커 컨테이너 실행 (환경 변수 포함)
docker run -p 8080:8080 --env-file .env zonos-tts
Cloud Run 배포
ZONOS 서비스는 Google Cloud Run을 통해 배포됩니다. 모델의 성능을 위해 GPU를 사용하는 배포 과정은 다음과 같습니다:
GPU 사용을 위한 사전 준비
# GPU 할당량 확인
gcloud compute quotas list --project=[프로젝트-ID] | grep -i gpu
해당 링크에서 GPU 할당량 증가 요청을 승인받아야 합니다: https://console.cloud.google.com/iam-admin/quotas
컨테이너 이미지 빌드 및 푸시
# 이미지 빌드
docker build -t gcr.io/[프로젝트-ID]/zonos-tts-gpu:latest .
# Container Registry에 이미지 푸시
docker push gcr.io/[프로젝트-ID]/zonos-tts-gpu:latest
Secret Manager에 환경 변수 등록
Cloud Run은 .env 파일을 직접 지원하지 않기 때문에, Google Secret Manager를 사용하여 민감한 환경 변수를 저장합니다. 다음 명령어로 필요한 비밀들을 등록합니다:
# OpenAI API 키 등록
gcloud secrets create openai-api-key --data-file=- <<< "sk-your-api-key-here"
# AWS 자격 증명 등록
gcloud secrets create aws-access-key --data-file=- <<< "your-access-key"
gcloud secrets create aws-secret-key --data-file=- <<< "your-secret-key"
# S3 버킷 및 SQS URL 등록
gcloud secrets create s3-bucket-name --data-file=- <<< "your-bucket-name"
gcloud secrets create sqs-url --data-file=- <<< "https://sqs.ap-northeast-2.amazonaws.com/your-account-id/your-queue-name"
Cloud Run 서비스 배포
등록한 Secret Manager의 비밀들을 환경 변수로 사용하여 GPU가 지원되는 Cloud Run 서비스를 배포합니다:
gcloud run deploy zonos-tts \
--image gcr.io/[프로젝트-ID]/zonos-tts-gpu:latest \
--platform managed \
--region us-central1 \
--memory 4Gi \
--cpu 4 \
--gpu 1 \
--gpu-type=nvidia-tesla-t4 \
--allow-unauthenticated \
--set-secrets="OPENAI_API_KEY=openai-api-key:latest,AWS_ACCESS_KEY_ID=aws-access-key:latest,AWS_SECRET_ACCESS_KEY=aws-secret-key:latest,S3_BUCKET_NAME=s3-bucket-name:latest,SQS_URL=sqs-url:latest"
GPU 활용 확인 및 모니터링
- Nvidia-SMI 명령어를 통한 GPU 사용량 확인
- Cloud Monitoring을 통한 GPU 사용량 모니터링
- Cloud Logging을 통한 로그 확인
비용 최적화
- 최소 인스턴스 설정 (–min-instances)
- 자동 스케일링 설정 (–max-instances)
- GPU 사용량에 따른 비용 모니터링
FAQ
Q: API 문서는 어떻게 확인할 수 있나요?
A: 서버 실행 후 http://localhost:8080/docs
에서 API 문서를 확인할 수 있습니다.
Q: 샘플 보이스로 만들어지는 텍스트를 변경할 수 있나요?
A: config/sample_texts.json
파일에 리스트 형식으로 텍스트를 추가해주세요.
Q: 로컬에서 GPU를 사용하지 않고 실행할 수 있나요?
A: 현재는 RTX 3070에서 실행됨을 확인했습니다. GPU가 없는 환경에서는 실행을 하지 않는 것이 추천됩니다.
Q: 사용할 수 있는 감정을 추가할 수 있나요? 감정을 추가하기 위해서는 어떻게 하면 되나요?
A: AI/utils/voice_synthesizer.py
의 EMOTION_PROFILE 리스트를 수정하는 식으로 진행할 수 있습니다.
총 8개의 세부 감정 파라미터를 조정할 수 있으며 각 파라미터는 순서대로 Happiness, Sadness, Disgust, Fear, Surprise, Anger, Other 및 Neutral입니다.
Q: Cloud Run 배포를 GUI로 진행하는 방법이 알고싶어요!
A: 노션 페이지 를 참고하시면 됩니다.
Q: Cloud Run을 통해 배포를 진행했는데 서버가 켜지는 데에 시간이 오래 걸려요. 자동으로 서버가 닫히기도 하는데 정상인가요?
A: 정상입니다.
Cloud Run은 Auto Scaling을 통해 일정 시간 동안 트래픽이 없으면 자동으로 컨테이너를 종료하고, 다시 요청이 들어오면 종료된 컨테이너를 재실행하는 데에 초기화하는 과정이 필요합니다.
이 초기화하는 과정 및 자동 종료가 불편하다면, 최소 인스턴스 수를 1로 설정하여 서버가 계속 켜져있게 하는 방법도 존재합니다.