我正在尝试将 here 的 cURL 和 javascript 示例翻译成 Unity 和 C# 语言..
卷曲
curl -X POST https://api.hume.ai/v0/batch/jobs \
-H "X-Hume-Api-Key: keykeykeykeykeykeykeykey" \
-H "Content-Type: multipart/form-data" \
-F json='{}' \
-F "file[]"=@"SpeechTest.mp3;type=audio/mpeg"
typescript 示例(据我所知,他们有一个用于typscript 的 sdk)
const formData = new FormData();
const fileFiles = document.getElementById("file").files;
fileFiles.forEach((file) => {
formData.append("file", file);
});
formData.append("json", JSON.stringify({}));
// Start inference job from local file (POST /v0/batch/jobs)
const response = await fetch("https://api.hume.ai/v0/batch/jobs", {
method: "POST",
headers: {
"X-Hume-Api-Key": "keykeykeykeykeykeykeykey"
},
body: formData,
});
const body = await response.json();
console.log(body);
到目前为止我的 Unity 代码。我认为 cURL 中的 -F 意味着我必须在 Unity 中使用 wwwForm 。另外,在我的用例中,我只发送一个文件,但端点似乎被设计为在数组中获取一个或多个文件。我已经在不需要文件的不同调用上测试了其他内容(例如发布、标题),并且它们没问题。 现在我收到“400 bad request”回复。我认为它已经结束了,有什么建议吗?
IEnumerator HumeStartInferenceFromLocalFilesMultiple()
{
byte[] data = File.ReadAllBytes("C:\\PROJECTS\\MyProject\\Assets\\03_AUDIO\\SpeechTest.mp3");
WWWForm form = new WWWForm();
form.AddBinaryData("file", data, "SpeechTest.mp3", "audio/mpeg");
form.AddField("json", "{}"); //json = '{}'
using (UnityWebRequest www = UnityWebRequest.Post("https://api.hume.ai/v0/batch/jobs",form))
{
www.downloadHandler = new DownloadHandlerBuffer();
www.SetRequestHeader("X-Hume-Api-Key", MyAPIKey);
www.SetRequestHeader("Content-Type", "multipart/form-data");
yield return www.SendWebRequest();
if (www.result != UnityWebRequest.Result.Success)
{
Debug.LogError(www.error);
}
else
{
Debug.Log(www.downloadHandler.text);
}
}
}
好吧,解决方案就是不要设置内容类型标头。 如果我注释掉该行,它就可以工作了。显然,当发送多部分 WWWform 时,Unity 会自动设置它,并设置分隔多部分数据的不同部分所需的边界字符串...而当您手动设置内容类型时,它显然会弄乱.
IEnumerator HumeStartInferenceFromLocalFilesMultiple()
{
byte[] data = File.ReadAllBytes("C:\\PROJECTS\\MyProject\\Assets\\03_AUDIO\\SpeechTest.mp3");
WWWForm form = new WWWForm();
form.AddBinaryData("file", data, "SpeechTest.mp3", "audio/mpeg");
form.AddField("json", "{}"); //json = '{}'
using (UnityWebRequest www = UnityWebRequest.Post("https://api.hume.ai/v0/batch/jobs",form))
{
www.downloadHandler = new DownloadHandlerBuffer();
www.SetRequestHeader("X-Hume-Api-Key", MyAPIKey);
//www.SetRequestHeader("Content-Type", "multipart/form-data");
yield return www.SendWebRequest();
if (www.result != UnityWebRequest.Result.Success)
{
Debug.LogError(www.error);
}
else
{
Debug.Log(www.downloadHandler.text);
}
}
}