|
import asyncio |
|
import os |
|
|
|
import discord |
|
from gradio_client import Client |
|
from gradio_client.utils import QueueError |
|
|
|
BOT_USER_ID = 1102236653545861151 |
|
MUSIC_CHANNEL_ID = 1143183148881035365 |
|
|
|
|
|
HF_TOKEN = os.getenv("HF_TOKEN") |
|
audioldm2 = Client("huggingface-projects/audioldm2-text2audio-text2music", HF_TOKEN) |
|
|
|
|
|
def audioldm2_create_job(prompt): |
|
"""Generates a sound or music based on a given prompt""" |
|
try: |
|
job = audioldm2.submit(prompt, api_name="/text2audio") |
|
while not job.done(): |
|
pass |
|
return job |
|
|
|
except Exception as e: |
|
print(f"audioldm2_create_job Error: {e}") |
|
|
|
|
|
async def audioldm2_create(ctx, prompt): |
|
"""Runs audioldm2_create_job in executor""" |
|
try: |
|
if ctx.author.id != BOT_USER_ID: |
|
if ctx.channel.id == MUSIC_CHANNEL_ID: |
|
if os.environ.get("TEST_ENV") == "True": |
|
print("Safetychecks passed for audioldm2_create") |
|
|
|
message = await ctx.send(f"**{prompt}** - {ctx.author.mention}") |
|
if len(prompt) > 99: |
|
small_prompt = prompt[:99] |
|
else: |
|
small_prompt = prompt |
|
thread = await message.create_thread(name=small_prompt, auto_archive_duration=60) |
|
|
|
if os.environ.get("TEST_ENV") == "True": |
|
print("Running audioldm2_create_job...") |
|
|
|
loop = asyncio.get_running_loop() |
|
job = await loop.run_in_executor(None, audioldm2_create_job, prompt) |
|
|
|
try: |
|
job.result() |
|
video = job.outputs()[0] |
|
except QueueError: |
|
await thread.send("The gradio space powering this bot is really busy! Please try again later!") |
|
|
|
short_filename = prompt[:20] |
|
video_filename = f"{short_filename}.mp4" |
|
|
|
with open(video, "rb") as file: |
|
discord_video_file = discord.File(file, filename=video_filename) |
|
await thread.send(file=discord_video_file) |
|
|
|
except Exception as e: |
|
print(f"audioldm2_create Error: {e}") |
|
|