Criação de áudio baseada em CPU usando stable-audio-open-small

この記事は約9分で読めます。
スポンサーリンク

Coisas que eu quero fazer

No artigo abaixo, tentei criar áudio usando o Stable Audio Open 1.0, mas o processo foi bastante instável.

Uma nova versão mais leve do stable-audio-open-small foi lançada, então vou experimentá-la.

Tentei várias coisas, mas não consegui fazer o stable-audio-open-small funcionar com o DirectML. (Isso ocorre porque as versões do PyTorch usadas pelo stable-audio-tools e pelo torch-directml são conflitantes.)

Em relação às licenças

Consulte o link a seguir para obter a licença do modelo.

É gratuito para uso não comercial.

Professional Membership Agreement — Stability AI
スポンサーリンク

Configuração do ambiente

Crie uma pasta de trabalho.

Mudar para o ambiente venv (opcional)

Se necessário, execute o seguinte comando no prompt de comando para criar e ativar o ambiente Venv.

Como este projeto pode envolver a modificação de bibliotecas, recomendamos o uso de um ambiente virtual (venv).

python -mvenv venv
venv\scripts\activate.bat

Instalação da Biblioteca

Execute o seguinte comando para instalar as bibliotecas necessárias.

pip install stable-audio-tools

Erro: AttributeError: o módulo pkgutil não possui o atributo ImpImporter. Você quis dizer: zipimporter?

O seguinte erro ocorreu dependendo do ambiente. Isso pode ser resolvido alterando a versão do Python que está sendo usada.

Versão em que o problema ocorreu: 3.10.6

Versão que não apresentou o problema: 3.12.8

      AttributeError: module 'pkgutil' has no attribute 'ImpImporter'. Did you mean: 'zipimporter'?
      [end of output]

  note: This error originates from a subprocess, and is likely not a problem with pip.
error: subprocess-exited-with-error

× Getting requirements to build wheel did not run successfully.
│ exit code: 1
╰─> See above for output.

note: This error originates from a subprocess, and is likely not a problem with pip.

Criação de roteiro

Salve o seguinte conteúdo como um arquivo chamado run.py.

Este é o mesmo script usado em ambientes onde o CUDA pode ser executado. (A troca é automática.)

import torch
import torchaudio
from einops import rearrange
from stable_audio_tools import get_pretrained_model
from stable_audio_tools.inference.generation import generate_diffusion_cond

device = "cuda" if torch.cuda.is_available() else "cpu"

# Download model
model, model_config = get_pretrained_model("stabilityai/stable-audio-open-small")
sample_rate = model_config["sample_rate"]
sample_size = model_config["sample_size"]

model = model.to(device)

# Set up text and timing conditioning
conditioning = [{
    "prompt": "128 BPM tech house drum loop",
    "seconds_total": 11
}]

# Generate stereo audio
output = generate_diffusion_cond(
    model,
    steps=8,
    conditioning=conditioning,
    sample_size=sample_size,
    sampler_type="pingpong",
    device=device
)

# Rearrange audio batch to a single sequence
output = rearrange(output, "b d n -> d (b n)")

# Peak normalize, clip, convert to int16, and save to file
output = output.to(torch.float32).div(torch.max(torch.abs(output))).clamp(-1, 1).mul(32767).to(torch.int16).cpu()
torchaudio.save("output.wav", output, sample_rate)
スポンサーリンク

execução

Execute o seguinte comando para executar o script.

Um arquivo chamado output.wav será criado na pasta onde você executou o comando.

python run.py

Tempo de execução

Como mostra a captura de tela abaixo, 1 leva cerca de 1 segundo, então mesmo 8 podem ser concluídos em cerca de 10 segundos.

No entanto, leva bastante tempo depois que a barra de progresso atinge 100%. (Não cronometrei com precisão, mas não terminou em 3 horas, embora tenha terminado depois de esperar durante a noite.)

Por falar nisso

Os seguintes processos são lentos.

sampled = model.pretransform.decode(sampled)

Se o download do modelo falhar

Consulte o artigo abaixo.

Tratamento de erros (ValueError: high está fora dos limites para int32)

O seguinte erro pode ocorrer, impedindo a execução do programa. (Depende do ambiente?)

  File "F:\projects\python\StableAL\venv\lib\site-packages\stable_audio_tools\inference\generation.py", line 138, in generate_diffusion_cond
    seed = seed if seed != -1 else np.random.randint(0, 2**32 - 1)
  File "mtrand.pyx", line 746, in numpy.random.mtrand.RandomState.randint
  File "_bounded_integers.pyx", line 1336, in numpy.random._bounded_integers._rand_int32
ValueError: high is out of bounds for int32

Para evitar isso, modifique a linha 138 de venv\Lib\site-packages\stable_audio_tools\inference\generation.py da seguinte forma. (Isso pode variar dependendo da versão do stable_audio_tools.)

Antes da revisão:

    seed = seed if seed != -1 else np.random.randint(0, 2**32 - 1, dtype=np.uint32)

Após a correção:

    seed = seed if seed != -1 else np.random.randint(0, 2**31 - 1, dtype=np.uint32)
スポンサーリンク

Resultado

Consegui criar áudio usando o stable-audio-open-small e a CPU, mas leva bastante tempo para usar, então dependerá de como você pretende utilizá-lo.

スポンサーリンク

Sites que utilizei como referência

stabilityai/stable-audio-open-small · Hugging Face
We’re on a journey to advance and democratize artificial intelligence through open source and open science.

コメント

タイトルとURLをコピーしました