我如何使用 Unity 的东西在 Hume.ai 中调用这个 API 端点?

问题描述 投票:0回答:1

我正在尝试将 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);
            }
        }
    }
c# unity-game-engine curl
1个回答
0
投票

好吧,解决方案就是不要设置内容类型标头。 如果我注释掉该行,它就可以工作了。显然,当发送多部分 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);
            }
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.