| import torch |
| from transformers import AutoProcessor, MusicgenForConditionalGeneration |
| from director.device import pick_device |
| from pathlib import Path |
| import scipy.io.wavfile |
| import uuid |
|
|
|
|
| def generate_sound(text: str, out_dir="outputs") -> str: |
| device, float_type = pick_device() |
|
|
| MODEL_ID = "facebook/musicgen-medium" |
|
|
| processor = AutoProcessor.from_pretrained(MODEL_ID) |
|
|
| model = MusicgenForConditionalGeneration.from_pretrained( |
| MODEL_ID, |
| torch_dtype=float_type, |
| ).to(device) |
|
|
| model.eval() |
|
|
| inputs = processor( |
| text=[text], |
| padding=True, |
| return_tensors="pt", |
| ).to(device) |
|
|
| with torch.inference_mode(): |
| audio_values = model.generate( |
| **inputs, |
| max_new_tokens=2600, |
| do_sample=True, |
| ) |
|
|
| sampling_rate = model.config.audio_encoder.sampling_rate |
|
|
| audio = audio_values[0, 0].detach().cpu().float().numpy() |
|
|
| Path(out_dir).mkdir(parents=True, exist_ok=True) |
| file_name = Path(out_dir) / f"{uuid.uuid4()}.wav" |
|
|
| scipy.io.wavfile.write( |
| str(file_name), |
| rate=sampling_rate, |
| data=audio, |
| ) |
|
|
| return str(file_name) |
|
|