Ir para o conteúdo

Ajuste Fino (Fine-tuning)

Obviamente, ao abrir esta página, você não estava satisfeito com o desempenho do modelo pré-treinado em modo zero-shot. Você deseja fazer um ajuste fino em um modelo para melhorar seu desempenho em seu conjunto de dados.

Na versão atual, você só precisa fazer o ajuste fino da parte 'LLAMA'.

Ajuste Fino do LLAMA

1. Prepare o conjunto de dados

.
├── SPK1
│   ├── 21.15-26.44.lab
│   ├── 21.15-26.44.mp3
│   ├── 27.51-29.98.lab
│   ├── 27.51-29.98.mp3
│   ├── 30.1-32.71.lab
│   └── 30.1-32.71.mp3
└── SPK2
    ├── 38.79-40.85.lab
    └── 38.79-40.85.mp3

Você precisa converter seu conjunto de dados para o formato acima e colocá-lo no diretório data. O arquivo de áudio pode ter as extensões .mp3, .wav ou .flac, e o arquivo de anotação deve ter a extensão .lab.

Info

O arquivo de anotação .lab precisa conter apenas a transcrição do áudio, sem necessidade de formatação especial. Por exemplo, se hi.mp3 contiver "Olá, adeus.", então o arquivo hi.lab conterá uma única linha de texto: "Olá, adeus.".

Warning

Recomenda-se aplicar a normalização de volume (loudness) ao conjunto de dados. Você pode usar o fish-audio-preprocess para fazer isso.

fap loudness-norm data-raw data --clean

2. Extração em lote de tokens semânticos

Certifique-se de que você baixou os pesos do VQGAN. Se não, execute o seguinte comando:

huggingface-cli download fishaudio/openaudio-s1-mini --local-dir checkpoints/openaudio-s1-mini

Em seguida, você pode executar o seguinte comando para extrair os tokens semânticos:

python tools/vqgan/extract_vq.py data \
    --num-workers 1 --batch-size 16 \
    --config-name "modded_dac_vq" \
    --checkpoint-path "checkpoints/openaudio-s1-mini/codec.pth"

Note

Você pode ajustar --num-workers e --batch-size para aumentar a velocidade de extração, mas certifique-se de não exceder o limite de memória da sua GPU.

Este comando criará arquivos .npy no diretório data, como mostrado abaixo:

.
├── SPK1
│   ├── 21.15-26.44.lab
│   ├── 21.15-26.44.mp3
│   ├── 21.15-26.44.npy
│   ├── 27.51-29.98.lab
│   ├── 27.51-29.98.mp3
│   ├── 27.51-29.98.npy
│   ├── 30.1-32.71.lab
│   ├── 30.1-32.71.mp3
│   └── 30.1-32.71.npy
└── SPK2
    ├── 38.79-40.85.lab
    ├── 38.79-40.85.mp3
    └── 38.79-40.85.npy

3. Empacote o conjunto de dados em protobuf

python tools/llama/build_dataset.py \
    --input "data" \
    --output "data/protos" \
    --text-extension .lab \
    --num-workers 16

Após a conclusão da execução do comando, você deverá ver o arquivo protos no diretório data.

4. Finalmente, ajuste fino com LoRA

Da mesma forma, certifique-se de que você baixou os pesos do LLAMA. Se não, execute o seguinte comando:

huggingface-cli download fishaudio/openaudio-s1-mini --local-dir checkpoints/openaudio-s1-mini

Finalmente, você pode iniciar o ajuste fino executando o seguinte comando:

python fish_speech/train.py --config-name text2semantic_finetune \
    project=$project \
    +lora@model.model.lora_config=r_8_alpha_16

Note

Você pode modificar os parâmetros de treinamento, como batch_size, gradient_accumulation_steps, etc., para se adequar à memória da sua GPU, modificando fish_speech/configs/text2semantic_finetune.yaml.

Note

Para usuários do Windows, você pode usar trainer.strategy.process_group_backend=gloo para evitar problemas com nccl.

Após o treinamento ser concluído, você pode consultar a seção de inferência para testar seu modelo.

Info

Por padrão, o modelo aprenderá apenas os padrões de fala do locutor e não o timbre. Você ainda precisará usar prompts para garantir a estabilidade do timbre. Se você quiser aprender o timbre, pode aumentar o número de passos de treinamento, mas isso pode levar a um sobreajuste (overfitting).

Após o treinamento, você precisa converter os pesos do LoRA para pesos regulares antes de realizar a inferência.

bash python tools/llama/merge_lora.py \ --lora-config r_8_alpha_16 \ --base-weight checkpoints/openaudio-s1-mini \ --lora-weight results/$project/checkpoints/step_000000010.ckpt \ --output checkpoints/openaudio-s1-mini-yth-lora/

Note

Você também pode tentar outros checkpoints. Sugerimos usar o checkpoint mais antigo que atenda aos seus requisitos, pois eles geralmente têm um desempenho melhor em dados fora de distribuição (OOD).