MusicGenのAPIリクエストがうまくいかない

やろうとしていること

Unity のInputFieldに入力したテキストをInputの一部として取り込んだAPIリクエストを用いて,MusicGenをアプリから使用する.
イメージ説明

次のサイトでMusicGenを使えるのですが,このサイトでのDescribe your musicの部分をInput Fieldで書かせてアプリ上で音楽を作成させたいです.
https://huggingface.co/spaces/facebook/MusicGen

エラー内容

console

1API request error: HTTP/1.1 422 Unprocessable Entity 2UnityEngine.Debug:LogError (object) 3MusicGenAPI/<SendAPIRequest>d__4:MoveNext () (at Assets/Scripts/Try/MusicGenAPI.cs:55) 4UnityEngine.SetupCoroutine:InvokeMoveNext (System.Collections.IEnumerator,intptr) (at /Users/bokken/build/output/unity/unity/Runtime/Export/Scripting/Coroutines.cs:17)

教えていただきたいこと

requestDataの形式がおかしいのかどこあで,ただしくAPIリクエストができていないようなのでどのように修正したら良いのかを教えていただきたいです.

現状していること

二つのスクリプトを用いて,Input Fieldに入力した内容を渡す,内容を渡された時にAPIリクエストを飛ばしています.
二つのスクリプトはどちらもInput Field(Legacy)にアタッチされています.
イメージ説明

MusicGenのAPIについて記載されている公式サイト

次のサイトのHTTPの箇所を参考にしています.
https://replicate.com/facebookresearch/musicgen/api

入力内容を渡す(TypeInPrompttext.cs)

c#

1using UnityEngine;2using UnityEngine.UI;3 4 5public class TypeInPrompttext : MonoBehaviour{6 public InputField promptInputField; // ユーザー入力を受けるInputField7 public MusicGenAPI apiExample; // API通信スクリプトへの参照8 9 // ユーザー入力をAPI通信スクリプトに渡す10 public void SetPromptText(){11 string promptText = promptInputField.text;12 Debug.Log("promptText(SetPromptText): " + promptText);13 apiExample.SetPrompt(promptText);14 }15}16

APIリクエストを飛ばす(MusicGenAPI.cs)

ここではAPIトークンは伏せ字をしています.

C#

1using System.Collections;2using System.Collections.Generic;3using UnityEngine;4using UnityEngine.Networking;5using System.Text;6using Newtonsoft.Json;7 8public class MusicGenAPI : MonoBehaviour{9 // Set your Replicate API token here10 private string apiToken = "r8*****************************";11 private string apiUrl = "https://api.replicate.com/v1/predictions"; // APIのエンドポイントURL12 string promptText; // 生成したい音楽の説明をここに入力13 14 15 public void SetPrompt(string newPrompt){16 promptText = newPrompt;17 StartCoroutine(SendAPIRequest());18 }19 20 // コルーチンの宣言21 IEnumerator SendAPIRequest(){22 string modelVersion = "melody"; // 使用するモデルのバージョン23 // string requestData = "{\"version\": \"" + modelVersion + "\", \"input\": {\"model_version\": \"" + modelVersion + "\", \"prompt\": \"" + promptText + "\"}}";24 25 // JSONデータをオブジェクトとして構築26 var requestDataObj = new {27 version = modelVersion,28 input = new {29 model_version = modelVersion,30 prompt = promptText 31 }32 };33 34 // JSONデータを文字列に変換35 string requestData = JsonConvert.SerializeObject(requestDataObj);36 37 // コンソールに promptText の内容を出力38 Debug.Log("Sending API request with promptText: " + promptText);39 40 using (UnityWebRequest webRequest = new UnityWebRequest(apiUrl, "POST")){41 byte[] jsonBytes = Encoding.UTF8.GetBytes(requestData);42 webRequest.uploadHandler = new UploadHandlerRaw(jsonBytes);43 webRequest.downloadHandler = new DownloadHandlerBuffer();44 webRequest.SetRequestHeader("Content-Type", "application/json");45 46 // Here's how you set the "Authorization" header with the token47 webRequest.SetRequestHeader("Authorization", "Token " + apiToken);48 49 // WebRequestの結果が返ってくるまで待機50 yield return webRequest.SendWebRequest();51 52 if (webRequest.result != UnityWebRequest.Result.Success){53 Debug.LogError("API request error: " + webRequest.error);54 }else{55 string responseBody = webRequest.downloadHandler.text;56 // responseBodyを処理してデータを取得57 Debug.Log("API response: " + responseBody);58 59 // レスポンスをJSONオブジェクトとしてパース60 var jsonResponse = JsonConvert.DeserializeObject<Dictionary<string, object>>(responseBody);61 62 // レスポンスの処理63 if (jsonResponse.ContainsKey("status")){64 string status = jsonResponse["status"].ToString();65 Debug.Log("API status: " + status);66 67 if (status == "succeeded"){68 // レスポンスに出力データが含まれている場合69 if (jsonResponse.ContainsKey("output")){70 string outputData = jsonResponse["output"].ToString();71 Debug.Log("Generated output: " + outputData);72 }73 }74 }75 }76 77 }78 }79 80}81

コメントを投稿

0 コメント