Files
dify-plugin-minimax-kit/tools/music_generation.py
T
quicksandzn a817a85316 init
2025-06-20 11:49:50 +08:00

66 lines
2.6 KiB
Python

from collections.abc import Generator
from typing import Any
from dify_plugin import Tool
from dify_plugin.entities.tool import ToolInvokeMessage
from tools.base import MiniMaxBaseTool
class MiniMaxMusicGenerationTool(Tool):
def _invoke(self, tool_parameters: dict[str, Any]) -> Generator[ToolInvokeMessage]:
api_key = self.runtime.credentials.get("api_key")
group_id = self.runtime.credentials.get("group_id")
minimax = MiniMaxBaseTool(api_key=api_key, group_id=group_id)
model = tool_parameters.get("model")
song_file = tool_parameters.get("song")
refer_vocal = tool_parameters.get("refer_vocal")
lyrics = tool_parameters.get("lyrics")
upload_response = minimax.music_upload(
file_name=song_file.filename,
file_blob=song_file.blob,
mime_type=song_file.mime_type,
)
if upload_response.status_code != 200:
yield self.create_text_message(
f"Music generation upload failed {upload_response.status_code} {upload_response.text}"
)
return
upload_data = upload_response.json()
voice_id = upload_data.get("voice_id")
instrumental_id = upload_data.get("instrumental_id")
if not voice_id or not instrumental_id:
yield self.create_text_message(
f"Music generation upload failed {upload_response.text}"
)
return
gen_response = minimax.music_generation(
model=model,
refer_voice=voice_id,
refer_instrumental=instrumental_id,
refer_vocal=None if not refer_vocal else refer_vocal,
lyrics=lyrics,
)
if gen_response.status_code != 200:
yield self.create_text_message(
f"Music generation failed {gen_response.status_code} {gen_response.text}"
)
return
status_code = gen_response.json().get("base_resp", {}).get("status_code", -1)
if status_code != 0:
yield self.create_text_message(
f"Music generation failed {gen_response.text}"
)
return
audio_hex = gen_response.json().get("data", {}).get("audio")
if not audio_hex:
yield self.create_text_message(
f"Music generation failed {gen_response.text}"
)
return
(self.create_text_message("Audio generated successfully"),)
yield self.create_blob_message(
blob=bytes.fromhex(audio_hex), meta={"mime_type": "audio/mpeg"}
)