openai apiの追加
hirai  2023/05/13(Sat) 18:38
初めまして。C++は初心者ですがOpenAIのAPIを使いたくて
OpenSiv3Dの勉強を始めました。

https://api.openai.com/v1/audio/transcriptions
上記文字起こしAPIをSivOpenAI.cppに下記のように追加しました。
(関連箇所のみ抜粋)

namespace s3d
{
namespace detail
{
// OpenAI の文字起こし API の URL
constexpr URLView AudioV1URL = U"https://api.openai.com/v1/audio/transcriptions";

// 文字起こし API に送信するリクエストを作成する
[[nodiscard]]
static std::string MakeTransRequest(const StringView filePath)
{
return "-F file=\"@" + filePath.toUTF8() + "\"";
}

[[nodiscard]]
static HashTable<String, String> MakeFileHeaders(const StringView apiKey)
{
return{
{ U"Content-Type", U"multipart/form-data" },
{ U"Authorization", (U"Bearer " + apiKey) },
};
}

}

namespace OpenAI
{
namespace Audio
{
AsyncHTTPTask TransAsync(const StringView apiKey, const StringView filePath)
{
// API キーが空の文字列である場合は失敗
if (apiKey.isEmpty())
{
return{};
}

const std::string data = detail::MakeTransRequest(filePath);
const auto headers = detail::MakeFileHeaders(apiKey);

return SimpleHTTP::PostAsync(detail::AudioV1URL, headers, data.data(), data.size());
}
String GetContent(const JSON& response)
{
if (not response)
{
return{};
}

if (not response.hasElement(U"text"))
{
return{};
}

return response[U"text"].getString().trimmed();
}
}
}
}

アプリから
m_task = OpenAI::Audio::TransAsync(m_api_key, U"C:\Data\source\OpenAIManager\App\audio.wav");
のように呼び出しているのですが、bad requestになってしまいます。
間違っているところや、そもそも勘違いしている所などをご指摘いただきたいです。
よろしくお願いいたします。
記事編集
Reputeless  2023/05/14(Sun) 15:43
質問文の U"C:\Data\source\OpenAIManager\App\audio.wav"
では \ がエスケープ文字になり、正しいパスになっていないように見えます。

また、詳しく調べていませんが、Siv3D の SimpleHTTP では curl の "-F " に相当する機能を提供していないと思います。Siv3D の機能を使わずに直接 libcurl を使ってみてください。SivSimpleHTTP.cpp が参考になると思います。
編集
hirai  2023/05/15(Mon) 07:19
回答ありがとうございます。
curl.hのcurl_formaddを使用するサンプルなどを見て
勉強してみます。
編集
件名
Re: openai apiの追加
名前
コメント
画像添付


投稿修正キー (投稿を修正する時に使います)
画像認証 (右画像の数字を入力) 投稿キー

- WEB PATIO -