【Unity】UnityWebRequest でMP3(AudioClip)を取得する方法

Unity

UnityWebRequest でMP3(AudioClip)を取得する方法

ポイント

  • UnityWebRequest を作成する際、「downloadHandler」に「new DownloadHandlerAudioClip(string.Empty, AudioType.MPEG)」を設定する(URLから直接、音声ファイルを取得している訳ではないため、「DownloadHandlerAudioClip()」の第一引数の文字列は何でも良い)
  • UnityWebRequest 送信後は「DownloadHandlerAudioClip.GetContent()」でMP3ファイルを AudioClip として取得する
  • 返って来るコンテンツがMP3ファイルの場合は「DownloadHandler.GetData()」等でコンテンツをバイナリデータで取得した後に「AudioClip」に変換するといった事は恐らく出来ない

例(OpenAI の Text To Speech)

public static async UniTask<AudioClip> GetVoiceClipFromTextAsync(string text)
{
    Dictionary<string, string> headers = new()
    {
        {"Authorization", "Bearer " + "API Key"},
        {"Content-type", "application/json"},
        {"X-Slack-No-Retry", "1"}
    };

    TtsRequest request = new()
    {
        model = "tts-1-hd",
        input = text,
        voice = "nova",
        response_format = "mp3",
        speed = 1f
    };

    string jsonRequest = JsonUtility.ToJson(request);

    using UnityWebRequest uwr = new("https://api.openai.com/v1/audio/speech", "POST")
    {
        uploadHandler = new UploadHandlerRaw(Encoding.UTF8.GetBytes(jsonRequest)),
        downloadHandler = new DownloadHandlerAudioClip(string.Empty, AudioType.MPEG)
    };

    foreach (KeyValuePair<string, string> header in headers)
    {
        uwr.SetRequestHeader(header.Key, header.Value);
    }

    try
    {
        await uwr.SendWebRequest();
    }
    catch (Exception e)
    {
        throw e;
    }

    if (uwr.result == UnityWebRequest.Result.ConnectionError || uwr.result == UnityWebRequest.Result.ProtocolError)
    {
        throw new Exception();
    }

    return DownloadHandlerAudioClip.GetContent(uwr);
}

お問い合わせ

    タイトルとURLをコピーしました