# Inferência
O Fish Audio disponibiliza dois modelos: **S2-Pro** e **Drama 3**. Ambos partilham a mesma linha de comandos e o mesmo servidor API, e o tipo de modelo é lido do `config.json` do diretório de pesos, pelo que cada secção abaixo está organizada como "tarefa → comando de cada modelo".
Conclua primeiro a [Instalação](install.md) e descarregue os [pesos do modelo](install.md#baixar-pesos).
!!! warning "Limites de execução do Drama 3"
O Drama 3 só funciona em GPUs NVIDIA: CPU, Apple MPS e AMD ROCm não são suportados, tal como `--compile`. Veja os [Requisitos](install.md#requisitos) para a memória GPU.
!!! note
A V100 e outras GPUs anteriores a SM80 não têm bfloat16, pelo que o Drama 3 passa a float16 (mantendo o fluxo residual em fp32). Este caminho ainda não foi testado em hardware real; se obtiver silêncio, ruído ou um erro "non-finite logits", abra uma issue.
## Inferência por Linha de Comando
### S2-Pro
O S2-Pro usa um pipeline de três passos: "tokens VQ → tokens Semânticos → áudio".
!!! note
Se quer deixar o modelo escolher aleatoriamente o timbre, pode saltar o passo 1.
**1. Obter tokens VQ do áudio de referência**
```bash
python fish_speech/models/dac/inference.py \
-i "test.wav" \
--checkpoint-path "checkpoints/s2-pro/codec.pth"
```
Deverá obter um `fake.npy` e um `fake.wav`.
**2. Gerar tokens Semânticos a partir do texto:**
```bash
python fish_speech/models/text2semantic/inference.py \
--text "O texto que quer converter" \
--prompt-text "O seu texto de referência" \
--prompt-tokens "fake.npy" \
# --compile
```
Este comando cria um ficheiro `codes_N` no diretório de trabalho, onde N é um inteiro a partir de 0.
!!! note
Pode querer usar `--compile` para fundir kernels CUDA e acelerar a inferência. No entanto, recomendamos a nossa otimização de aceleração de inferência sglang.
Se não planeia usar aceleração, comente o parâmetro `--compile`.
!!! info
Em GPUs sem suporte a bf16, pode precisar do parâmetro `--half`.
**3. Gerar voz a partir dos tokens semânticos:**
```bash
python fish_speech/models/dac/inference.py \
-i "codes_0.npy" \
```
Depois disso obterá um ficheiro `fake.wav`.
### Drama 3
O Drama 3 faz tudo num comando; `--output` escreve diretamente o áudio descodificado:
```bash
python fish_speech/models/text2semantic/inference.py \
--checkpoint-path checkpoints/drama-3 \
--text "O texto que quer converter" \
--prompt-audio "reference.wav" \
--prompt-text "O seu texto de referência" \
--output "output.wav" \
--device cuda:0
```
Em GPUs mais antigas, indique vários dispositivos, por exemplo `--device cuda:0,cuda:1,cuda:2,cuda:3`; o último fica com o descodificador de áudio e o codec. Apenas `--device cuda` usa até às quatro primeiras GPUs visíveis.
## Servidor API
### Iniciar o S2-Pro
```bash
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
```
### Iniciar o Drama 3
```bash
python tools/api_server.py \
--listen 0.0.0.0:8080 \
--llama-checkpoint-path checkpoints/drama-3 \
--device cuda:0
```
!!! note
O Drama 3 não suporta `--compile`. Em GPUs mais antigas, liste vários dispositivos com `--device`; o último fica com o descodificador de áudio e o codec.
Opções de arranque partilhadas por ambos os modelos:
- `--compile`: ativa a otimização `torch.compile` (apenas S2-Pro)
- `--half`: usa o modo fp16
- `--api-key`: exige autenticação por bearer token
- `--workers`: define o número de processos de trabalho
- `--max-text-length`: limita o comprimento do texto de um pedido; 0 significa sem limite
Verificação de saúde:
```bash
curl -X GET http://127.0.0.1:8080/v1/health
```
A resposta `{"status":"ok"}` indica que o serviço está operacional.
### Endpoints da API
| Método | Caminho | Descrição |
| --- | --- | --- |
| `POST` | `/v1/tts` | Texto para voz; o corpo do pedido é msgpack |
| `GET` | `/v1/tts/defaults` | Valores de amostragem predefinidos do modelo carregado |
| `GET` | `/v1/health` | Verificação de saúde |
| `POST` | `/v1/vqgan/encode` | Áudio de referência → tokens VQ |
| `POST` | `/v1/vqgan/decode` | Tokens VQ → áudio |
| `POST` | `/v1/references/add` | Guarda uma voz de referência; campos `id`, `audio` (ficheiro), `text` |
| `GET` | `/v1/references/list` | Lista as vozes guardadas |
| `POST` | `/v1/references/update` | Renomeia; campos `old_reference_id`, `new_reference_id` |
| `DELETE` | `/v1/references/delete` | Remove; campo `reference_id` |
| `GET` | `/ui` | WebUI (incluída na imagem Docker; tem de ser construída em execução a partir do código) |
Depois de guardar a voz, use-a com `--reference_id` (o campo de áudio precisa do tipo MIME, caso contrário o servidor não o reconhece):
```bash
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="Transcrição do áudio de referência"
python tools/api_client.py --url http://127.0.0.1:8080/v1/tts \
--text "Hello" --reference_id my-speaker --output demo
```
### Enviar um pedido
O modelo usado depende dos pesos carregados pelo servidor no arranque; não há campo de modelo no pedido.
```bash
python tools/api_client.py \
--url http://127.0.0.1:8080/v1/tts \
--text "Hello from Fish Speech" \
--output demo
```
Parâmetros mais usados:
| Parâmetro | Descrição |
| --- | --- |
| `--reference_audio` / `--reference_text` | Áudio de referência e a respetiva transcrição; ambos precisam do mesmo número de valores |
| `--reference_speaker` | ID do falante (0–15) de cada áudio de referência, escrito como prefixo <|speaker:N|> (o uso principal no Drama 3) |
| `--reference_id` | Usa uma voz de referência guardada, por exemplo `my-speaker` |
| `--format` | Formato de saída: `wav`, `pcm`, `mp3` ou `opus`; predefinição `wav` |
| `--streaming` | Devolve o áudio em fluxo |
| `--single_chunk` | Gera o texto todo de uma vez, sem dividir em blocos (apenas Drama 3) |
| `--chunk_length` | Comprimento do bloco, 200 por predefinição (apenas S2-Pro) |
| `--max_new_tokens` | Máximo de frames por bloco; se vazio usa a predefinição do servidor, 1024; 0 usa o limite do próprio modelo |
| `--temperature` / `--top_p` | Amostragem; se vazio usa as predefinições do modelo (0.7 / 0.7) |
| `--seed` | Fixa a semente aleatória (não serve para fixar o timbre) |
| `--api_key` | Obrigatório quando o servidor usa `--api-key` |
| `--no-play` | Não reproduz o áudio no final (por predefinição reproduz; necessário em máquinas sem dispositivo de áudio) |
!!! note
`repetition_penalty` existe apenas por compatibilidade; o S2-Pro e o Drama 3 ignoram-no e usam amostragem com perceção de repetição incorporada.
!!! tip
Para iniciar o servidor com Docker, veja [Configuração do Docker](install.md#configuração-do-docker) (a imagem do servidor já inclui a WebUI: abra `http://localhost:8080/ui` depois de arrancar).
## Diferenças entre modelos
| Item | S2-Pro | Drama 3 |
| --- | --- | --- |
| Hardware | GPU / CPU | apenas NVIDIA GPU, sem `--compile` |
| Texto longo | Dividido por `chunk_length` | Dividido automaticamente em blocos de cerca de 300 bytes (UTF-8) com no máximo três falantes, cortando nos fins de frase sempre que possível; o primeiro bloco e o mais recente são reenviados como contexto |
| Limite por passagem | 1024 frames por lote por padrão; `max_new_tokens=0` gera até o comprimento do contexto | 1024 frames (cerca de 47 segundos) por bloco por padrão, o que com `single_chunk` vale para o texto inteiro; `max_new_tokens=0` significa 600 frames por bloco, ou 2048 (cerca de 95 segundos) com `single_chunk`; sempre limitado a 10.240 frames menos o comprimento do prompt |
| Falantes | A ordem das referências define o papel | As etiquetas <|speaker:0|>–<|speaker:15|> definem o papel; a ordem das referências não importa |
| `chunk_length` | Tem efeito | Não tem efeito |
| Amostragem predefinida | temperature 0.7, top-p 0.7, top-k 30 | Igual |
| `repetition_penalty` | Ignorado | Ignorado |
O Drama 3 tem ainda duas variáveis de ambiente: `FISH_DRAMA3_FP8_EXPERTS=0` ou `1` força especialistas desquantizados ou em FP8, e `FISH_DRAMA3_CUDA_GRAPH=0` desativa a descodificação com CUDA graphs.
## Inferência WebUI
### Awesome WebUI
A Awesome WebUI é uma interface Web moderna construída com TypeScript, com funcionalidades mais ricas e melhor experiência de utilização.
As imagens Docker do servidor já incluem a WebUI construída: abra `http://localhost:8080/ui` depois de o contentor arrancar. Os passos abaixo aplicam-se a execução a partir do código.
**Construir a WebUI:**
Precisa de ter Node.js e npm instalados na sua máquina ou servidor.
1. Entre no diretório `awesome_webui`:
```bash
cd awesome_webui
```
2. Instale as dependências:
```bash
npm install
```
3. Construa a WebUI:
```bash
npm run build
```
**Iniciar o servidor backend:**
Depois de construir a WebUI, volte à raiz do projeto e inicie o servidor API (`--compile` é apenas para o S2-Pro; remova-o ao carregar o Drama 3):
```bash
python tools/api_server.py --listen 0.0.0.0:8888 --compile
```
**Acesso:**
Com o servidor a correr, aceda pelo browser a:
`http://localhost:8888/ui`