추론
Fish Audio는 두 가지 모델을 제공합니다: S2-Pro와 Drama 3. 두 모델은 동일한 명령줄과 API 서버를 공유하고, 모델 종류는 가중치 디렉터리의 config.json에서 자동으로 판별되므로 아래 각 절은 "작업 → 모델별 명령" 순으로 구성되어 있습니다.
Drama 3 실행 제한
Drama 3는 NVIDIA GPU에서만 동작합니다. CPU, Apple MPS, AMD ROCm은 지원되지 않고 --compile도 사용할 수 없습니다. GPU 메모리는 요구 사양을 참고하세요.
Note
V100 등 SM80 이전 GPU에는 bfloat16이 없어 Drama 3는 float16으로 전환됩니다(잔차 스트림은 fp32 유지). 이 경로는 실제 하드웨어에서 아직 검증되지 않았습니다. 무음, 노이즈 또는 "non-finite logits" 오류가 발생하면 이슈를 열어 주세요.
명령줄 추론
S2-Pro
S2-Pro는 "VQ 토큰 → Semantic 토큰 → 오디오"의 3단계 파이프라인입니다.
Note
모델이 임의로 목소리 톤을 고르게 하려면 1단계를 건너뛸 수 있습니다.
1. 참조 오디오에서 VQ 토큰 가져오기
python fish_speech/models/dac/inference.py \
-i "test.wav" \
--checkpoint-path "checkpoints/s2-pro/codec.pth"
fake.npy와 fake.wav를 얻게 됩니다.
2. 텍스트에서 Semantic 토큰 생성:
python fish_speech/models/text2semantic/inference.py \
--text "변환할 텍스트" \
--prompt-text "참조 텍스트" \
--prompt-tokens "fake.npy" \
# --compile
작업 디렉터리에 codes_N 파일이 생성됩니다(N은 0부터 시작하는 정수).
Note
--compile로 CUDA 커널을 융합해 추론을 빠르게 할 수 있습니다. 다만 저희는 sglang 추론 가속을 권장합니다.
가속을 사용하지 않을 계획이라면 --compile 파라미터를 주석 처리하세요.
Info
bf16을 지원하지 않는 GPU에서는 --half 파라미터가 필요할 수 있습니다.
3. 시맨틱 토큰에서 음성 생성:
그 후 fake.wav 파일을 얻게 됩니다.
Drama 3
Drama 3는 한 번에 끝나며, --output이 디코딩된 오디오를 바로 씁니다:
python fish_speech/models/text2semantic/inference.py \
--checkpoint-path checkpoints/drama-3 \
--text "변환할 텍스트" \
--prompt-audio "reference.wav" \
--prompt-text "참조 텍스트" \
--output "output.wav" \
--device cuda:0
구형 GPU에서는 --device cuda:0,cuda:1,cuda:2,cuda:3처럼 여러 장을 지정할 수 있습니다. 마지막 장이 오디오 디코더와 codec을 담당합니다. --device cuda만 쓰면 보이는 GPU 중 최대 4장을 사용합니다.
API 서버
S2-Pro 시작
python tools/api_server.py \
--listen 0.0.0.0:8080 \
--llama-checkpoint-path checkpoints/s2-pro \
--decoder-checkpoint-path checkpoints/s2-pro/codec.pth \
--decoder-config-name modded_dac_vq
Drama 3 시작
python tools/api_server.py \
--listen 0.0.0.0:8080 \
--llama-checkpoint-path checkpoints/drama-3 \
--device cuda:0
Note
Drama 3는 --compile을 지원하지 않습니다. 구형 GPU에서는 --device에 여러 장을 나열하세요. 마지막 장이 오디오 디코더와 codec을 담당합니다.
두 모델이 공유하는 시작 옵션:
--compile:torch.compile최적화 활성화(S2-Pro 전용)--half: fp16 모드 사용--api-key: bearer 토큰 인증 요구--workers: 워커 프로세스 수 설정--max-text-length: 요청 한 건의 텍스트 길이 제한(0은 제한 없음)
헬스 체크:
{"status":"ok"}가 반환되면 정상입니다.
API 엔드포인트
| 메서드 | 경로 | 설명 |
|---|---|---|
POST |
/v1/tts |
텍스트 음성 변환(요청 본문은 msgpack) |
GET |
/v1/tts/defaults |
로드된 모델의 샘플링 기본값 |
GET |
/v1/health |
헬스 체크 |
POST |
/v1/vqgan/encode |
참조 오디오 → VQ 토큰 |
POST |
/v1/vqgan/decode |
VQ 토큰 → 오디오 |
POST |
/v1/references/add |
참조 음성 저장(폼 필드 id, audio(파일), text) |
GET |
/v1/references/list |
저장된 음성 목록 |
POST |
/v1/references/update |
이름 변경(폼 필드 old_reference_id, new_reference_id) |
DELETE |
/v1/references/delete |
삭제(폼 필드 reference_id) |
GET |
/ui |
WebUI(Docker 이미지에 포함, 소스 실행 시에는 먼저 빌드) |
음성을 저장한 뒤에는 --reference_id로 사용합니다(오디오 필드에 MIME 타입이 필요하며, 없으면 서버가 인식하지 못합니다):
curl -X POST http://127.0.0.1:8080/v1/references/add \
-F id=my-speaker \
-F "audio=@reference.wav;type=audio/wav" \
-F text="참조 오디오의 전사 텍스트"
python tools/api_client.py --url http://127.0.0.1:8080/v1/tts \
--text "Hello" --reference_id my-speaker --output demo
요청 보내기
어떤 모델이 쓰이는지는 서버가 시작할 때 로드한 가중치로 결정되며, 요청에 모델 필드는 없습니다.
python tools/api_client.py \
--url http://127.0.0.1:8080/v1/tts \
--text "Hello from Fish Speech" \
--output demo
주요 파라미터:
| 파라미터 | 설명 |
|---|---|
--reference_audio / --reference_text |
참조 오디오와 그 전사 텍스트. 둘의 개수는 같아야 합니다 |
--reference_speaker |
참조 오디오별 화자 ID(0–15). <|speaker:N|> 접두사로 기록(Drama 3의 주요 사용법) |
--reference_id |
저장된 참조 음성 사용(예: my-speaker) |
--format |
출력 형식: wav, pcm, mp3, opus(기본값 wav) |
--streaming |
오디오를 스트리밍으로 반환 |
--single_chunk |
청크로 나누지 않고 전체를 한 번에 생성(Drama 3 전용) |
--chunk_length |
청크 길이, 기본값 200(S2-Pro 전용) |
--max_new_tokens |
청크당 최대 프레임 수. 미지정 시 서버 기본값 1024, 0은 모델 자체 상한 |
--temperature / --top_p |
샘플링. 미지정 시 모델 기본값(0.7 / 0.7) |
--seed |
랜덤 시드 고정(음색 고정에는 사용할 수 없음) |
--api_key |
서버가 --api-key를 사용할 때 필수 |
--no-play |
생성 후 오디오를 재생하지 않음(기본은 재생. 오디오 장치가 없는 환경에서는 지정) |
Note
repetition_penalty는 호환용으로만 남아 있으며, S2-Pro와 Drama 3 모두 사용하지 않고 내장된 반복 인식 샘플링을 씁니다.
Tip
Docker로 서버를 띄우려면 Docker 설정을 참고하세요(server 이미지에는 WebUI가 포함되어 있어 컨테이너를 띄운 뒤 http://localhost:8080/ui를 열면 됩니다).
모델 차이
| 항목 | S2-Pro | Drama 3 |
|---|---|---|
| 하드웨어 | GPU / CPU | NVIDIA GPU 전용, --compile 미지원 |
| 긴 텍스트 | chunk_length로 분할 |
약 300바이트(UTF-8), 청크당 최대 3화자로 자동 분할하고 가능한 문장 끝에서 절단. 첫 청크와 최신 청크를 컨텍스트로 재투입 |
| 1회 길이 상한 | 기본값은 배치당 1024프레임. max_new_tokens=0이면 컨텍스트 길이까지 생성 |
기본값은 청크당 1024프레임(약 47초)이며, single_chunk일 때는 전체 텍스트가 1024프레임. max_new_tokens=0이면 청크당 600프레임, single_chunk일 때 2048프레임(약 95초). 모두 "10,240프레임 − 프롬프트 길이"가 상한 |
| 화자 | 참조 순서가 역할을 결정 | <|speaker:0|>–<|speaker:15|> 태그가 역할을 결정하며 참조 순서는 무관 |
chunk_length |
동작 | 동작하지 않음 |
| 샘플링 기본값 | temperature 0.7, top-p 0.7, top-k 30 | 동일 |
repetition_penalty |
무시 | 무시 |
Drama 3에는 환경 변수 두 개가 있습니다: FISH_DRAMA3_FP8_EXPERTS=0 또는 1은 역양자화 / FP8 전문가를 강제하고, FISH_DRAMA3_CUDA_GRAPH=0은 CUDA graph 디코딩을 끕니다.
WebUI 추론
Awesome WebUI
Awesome WebUI는 TypeScript로 만든 현대적인 웹 인터페이스로, 더 풍부한 기능과 더 나은 사용 경험을 제공합니다.
server Docker 이미지에는 빌드된 WebUI가 포함되어 있어 컨테이너를 띄운 뒤 http://localhost:8080/ui를 열면 바로 됩니다. 아래 단계는 소스에서 실행할 때 해당합니다.
WebUI 빌드:
로컬 또는 서버에 Node.js와 npm이 설치되어 있어야 합니다.
awesome_webui디렉터리로 이동:- 의존성 설치:
- WebUI 빌드:
백엔드 서버 시작:
빌드가 끝나면 프로젝트 루트로 돌아가 API 서버를 시작합니다(--compile은 S2-Pro 전용이며, Drama 3를 로드할 때는 제거하세요):
접속:
서버가 시작되면 브라우저에서 다음 주소로 접속하세요:
http://localhost:8888/ui