Extract the voice-cloning feature from jamiepine/voicebox (Qwen3-TTS Base engine) into a small standalone app: FastAPI backend (engine.py + app.py) wrapping create_voice_clone_prompt/generate_voice_clone, and a single-page UI (upload or mic-record a reference clip + transcript -> synthesize any text in that voice). Supports 10 languages incl. Korean; model loads lazily and downloads on first use.
80 lines
3.1 KiB
Markdown
80 lines
3.1 KiB
Markdown
# voice_copy
|
|
|
|
참조 음성 몇 초만 있으면 아무 텍스트나 **그 목소리로** 합성해 주는 zero-shot 음성 클로닝 웹앱입니다.
|
|
[jamiepine/voicebox](https://github.com/jamiepine/voicebox)의 음성 클로닝 기능(Qwen3-TTS Base 엔진)만
|
|
떼어내 간단한 UI로 감쌌습니다.
|
|
|
|
- 엔진: **Qwen3-TTS-12Hz Base** (`qwen-tts` 패키지, zero-shot voice clone)
|
|
- 지원 언어: 한국어 · English · 中文 · 日本語 · 독일어 · 프랑스어 · 러시아어 · 포르투갈어 · 스페인어 · 이탈리아어
|
|
- UI: 파일 업로드 또는 마이크 녹음 → 전사 입력 → 합성할 텍스트 입력 → 생성/재생/다운로드
|
|
|
|
## 필요 사항
|
|
|
|
- Python 3.9+ (3.10~3.12 권장)
|
|
- NVIDIA GPU 권장 (CPU도 되지만 매우 느림). VRAM 6GB+ 권장.
|
|
- (선택) `ffmpeg` — mp3/m4a/webm 업로드를 디코딩할 때 필요. wav/flac와 브라우저 녹음(WAV)은 ffmpeg 없이 동작합니다.
|
|
|
|
## 설치
|
|
|
|
```bash
|
|
# 1) 자신의 환경에 맞는 torch를 먼저 설치
|
|
pip install torch --index-url https://download.pytorch.org/whl/cu128 # NVIDIA(CUDA 12.8)
|
|
# CPU만 있으면: pip install torch
|
|
|
|
# 2) 나머지 의존성
|
|
pip install -r requirements.txt
|
|
```
|
|
|
|
## 실행
|
|
|
|
```bash
|
|
python app.py
|
|
# 브라우저에서 http://localhost:8000 접속
|
|
```
|
|
|
|
첫 생성 요청 때 Qwen3-TTS 가중치(수 GB)가 HuggingFace에서 자동으로 다운로드됩니다. 이후에는 캐시됩니다.
|
|
|
|
### 환경 변수
|
|
|
|
| 변수 | 기본값 | 설명 |
|
|
|------|--------|------|
|
|
| `VOICE_COPY_MODEL_SIZE` | `1.7B` | 모델 크기. `1.7B`(품질↑) 또는 `0.6B`(가벼움) |
|
|
| `VOICE_COPY_DEVICE` | 자동 | `cuda` / `cpu` / `mps` 강제 지정 |
|
|
| `VOICE_COPY_HOST` | `0.0.0.0` | 바인드 호스트 |
|
|
| `VOICE_COPY_PORT` | `8000` | 포트 |
|
|
|
|
예: `VOICE_COPY_MODEL_SIZE=0.6B python app.py`
|
|
|
|
## 사용법
|
|
|
|
1. **참조 음성** — 클로닝할 목소리를 5~15초 정도 업로드하거나 마이크로 녹음합니다.
|
|
2. **전사** — 그 참조 음성에서 말한 내용을 그대로 텍스트로 적습니다. (클로닝 품질에 중요)
|
|
3. **합성할 텍스트** — 그 목소리로 말하게 할 문장을 입력하고 "목소리 생성"을 누릅니다.
|
|
|
|
## API
|
|
|
|
- `GET /api/health` — 디바이스/모델/언어 상태
|
|
- `POST /api/clone` — multipart form: `ref_audio`(파일), `ref_text`, `text`, `language`, `instruct`(선택), `seed`(선택) → `audio/wav` 반환
|
|
|
|
```bash
|
|
curl -X POST http://localhost:8000/api/clone \
|
|
-F ref_audio=@sample.wav -F ref_text="안녕하세요" \
|
|
-F text="복제된 목소리로 말합니다." -F language=ko \
|
|
--output cloned.wav
|
|
```
|
|
|
|
## 구조
|
|
|
|
```
|
|
app.py FastAPI 서버 (UI 제공 + /api/clone)
|
|
engine.py Qwen3-TTS 클로닝 래퍼 (voicebox pytorch_backend에서 추출/단순화)
|
|
static/index.html 단일 페이지 UI
|
|
requirements.txt
|
|
```
|
|
|
|
## 라이선스 / 출처
|
|
|
|
음성 클로닝 로직은 [jamiepine/voicebox](https://github.com/jamiepine/voicebox)에서 파생했습니다.
|
|
모델 가중치 및 사용은 각 모델(Qwen3-TTS)과 voicebox의 라이선스를 따르며, 목소리 클로닝은
|
|
반드시 본인 또는 동의를 받은 사람의 음성에만 사용하세요.
|