File size: 2,932 Bytes
58c201b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f82ba90
 
 
 
 
58c201b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import asyncio
import os

import discord
from gradio_client import Client

BOT_USER_ID = 1102236653545861151  # real
MUSIC_CHANNEL_ID = 1140990231730987058  # real

musicgen = Client("huggingface-projects/transformers-musicgen", hf_token=os.getenv("HF_TOKEN"))


def music_create_job(prompt):
    """Generates music based on a given prompt"""
    try:
        job = musicgen.submit(prompt, api_name="/predict")
        while not job.done():
            pass
        files = job.outputs()
        files = files[0]

        return files

    except Exception as e:
        print(f"music_create_job Error: {e}")


async def music_create(ctx, prompt):
    """Runs music_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 music_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)

                await thread.send(
                    "[DISCLAIMER: HuggingBot is a beta feature; The MusicGen"
                    " model can be found here: https://huggingface.co/spaces/facebook/MusicGen]"
                )
                if os.environ.get("TEST_ENV") == "True":
                    print("Running music_create_job...")

                loop = asyncio.get_running_loop()
                files = await loop.run_in_executor(None, music_create_job, prompt)

                audio, video = files[0], files[1]

                with open(audio, "rb") as file:
                    discord_file = discord.File(file)
                await thread.send(file=discord_file)

                with open(video, "rb") as file:
                    discord_file = discord.File(file)
                await thread.send(file=discord_file)

                embed = discord.Embed()
                embed.set_thumbnail(url="https://abs.twimg.com/icons/apple-touch-icon-192x192.png")
                tweet1 = "https://twitter.com/intent/tweet?text="
                tweet2 = "I%20generated%20this%20audio%20using%20MusicGen"
                tweet3 = "%20in%20the%20%F0%9F%A4%97%20@huggingface%20Discord!"
                tweet4 = "%0Ahf.co/join/discord%0A%0APrompt:%20"
                prompt = prompt.replace(" ", "%20")
                intent_link = f"{tweet1}{tweet2}{tweet3}{tweet4}{prompt}"
                embed.add_field(
                    name="Twitter",
                    value=f"[Share it!]({intent_link})",
                    inline=True,
                )

                await thread.send(embed=embed)

    except Exception as e:
        print(f"music_create Error: {e}")