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 e descarregue os pesos do modelo.
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 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
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:
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:
Depois disso obterá um ficheiro fake.wav.
Drama 3
O Drama 3 faz tudo num comando; --output escreve diretamente o áudio descodificado:
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
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
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çãotorch.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:
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):
curl -X POST http://127.0.0.1:8080/v1/references/add \
-F id=my-speaker \
-F "[email protected];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.
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 (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.
- Entre no diretório
awesome_webui: - Instale as dependências:
- Construa a WebUI:
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):
Acesso:
Com o servidor a correr, aceda pelo browser a:
http://localhost:8888/ui