$\huge{元氣ですかーーーーッ!!!}$
$\huge{元氣があればなんでもできる!}$
$\huge{闘魂とは己に打ち克つこと。}$
$\huge{そして闘いを通じて己の魂を磨いていく}$
$\huge{ことだと思います}$
はじめに
この記事は、multipart/form-dataによるデータのPOSTをElixirで行います。
題材は、OpenAIが提供しているSpeech to text APIを使います。
サマリ
サマリです。
file_path = "/Users/awesome/Documents/13_Elixir/shohei/Nanami.mp3"
token = "ひみつ"
headers = [Authorization: "Bearer #{token}", "Content-Type": "multipart/form-data"]
url = "https://api.openai.com/v1/audio/transcriptions"
filename = Path.basename(file_path)
HTTPoison.post(
url,
{:multipart,
[
{:file, file_path, {"form-data", [name: "file", filename: filename]}, []},
{"model", "whisper-1"}
]},
headers
)
題材: Speech to text
まず、題材にしたSpeech to textを説明します。
ざっくりいうと、音声データファイル(mp3, mp4, mpeg, mpga, m4a, wav, or webm)をアップロードすると文字起こしをしてくれるAPIです。
ファイルの送信に、multipart/form-dataを使います。
詳細は以下をご参照ください。
HTTPoisonを利用して、multipart/form-dataによるデータのPOSTを行う
HTTPoisonを利用して、multipart/form-dataによるデータのPOSTを行います。
準備
.exs
やIEx、Livebookでは、Mix.install/2を使うか、プロジェクトではmix.exs
で依存関係を解決(mix deps.get
)するかしてください。
Mix.install([{:httpoison, "~> 2.0"}])
defp deps do
[
{:httpoison, "~> 2.0"}
]
end
使用するデータ
以前書いたこちらの記事を参考に、音声データ(.mp3)を作りました。
AzureのText to Speech REST APIを利用させていただきました。
「七海さん」という話者に話してもらいました。
データは以下に公開しておきます。
ファイル指定
ファイルを指定して送信する方法です。
file_path = "/Users/awesome/Documents/13_Elixir/shohei/Nanami.mp3"
token = "ひみつ"
headers = [Authorization: "Bearer #{token}", "Content-Type": "multipart/form-data"]
url = "https://api.openai.com/v1/audio/transcriptions"
filename = Path.basename(file_path)
HTTPoison.post(
url,
{:multipart,
[
{:file, file_path, {"form-data", [name: "file", filename: filename]}, []},
{"model", "whisper-1"}
]},
headers
)
迷わず実行してみます。
実行結果は以下の通りです。
{:ok,
%HTTPoison.Response{
status_code: 200,
body: "{\"text\":\"最後に私から皆さんに皆様にメッセージを送りたいと思います 人は歩みを止めた時にそして挑戦を諦めた時に年老いていくのだと思います この道を行けばどうなるものか 危ぶむなかれ 危ぶめば道はなし 踏み出せばその一足が道となり その一足が道となる 迷わず行けよ 行けばわかるさ ありがとう\"}",
headers: [
...
「道」の詩の朗読を文字起こしできています!
バイナリを送る
次にバイナリを送る方法です。「ファイル指定」とよく似ています。異なる点は、:file
が"file"
になっています。
file_path = "/Users/awesome/Documents/13_Elixir/shohei/Nanami.mp3"
binary_file_content = File.read!(file_path)
token = "ひみつ"
headers = [Authorization: "Bearer #{token}", "Content-Type": "multipart/form-data"]
url = "https://api.openai.com/v1/audio/transcriptions"
filename = Path.basename(file_path)
HTTPoison.post(
url,
{:multipart,
[
{"file", binary_file_content, {"form-data", [name: "file", filename: filename]}, []},
{"model", "whisper-1"}
]},
headers
)
参考資料
参考にした資料を紹介しておきます。
def multipart_api_post(url, file_path, file_param, params, request_options \\ []) do
body_params = params |> Enum.map(fn {k, v} -> {Atom.to_string(k), v} end)
body = {
:multipart,
[
{:file, file_path,
{"form-data", [{:name, file_param}, {:filename, Path.basename(file_path)}]}, []}
] ++ body_params
}
request_options = Keyword.merge(request_options(), request_options)
url
|> post(body, request_headers(), request_options)
|> handle_response()
end
さいごに
OpenAIが提供しているSpeech to text APIを題材に、Elixirで、multipart/form-dataによるデータのPOSTを行いました。
この記事では、HTTPクライアントライブラリにHTTPoisonを使いました。
Reqでの実装方法は分かりましたら、追記なりしたいとおもっています(あくまでもおもっています)。
闘魂とは、 「己に打ち克つこと。そして闘いを通じて己の魂を磨いていくことである」 との猪木さんの言葉をそのまま胸に刻み込んでいます。
知っているだけで終わらせることなく、実行する、断行する、一歩を踏み出すことを自らの行動で示していきたいとおもいます。
アントニオ猪木さんのメッセージから元氣をもらったものとして、それを次代に語り継ぎ、自分自身が「闘魂」を体現するものでありたいとおもいます。
$\huge{元氣ですかーーーーッ!!!}$
$\huge{元氣があればなんでもできる!}$
$\huge{1、2、3 ぁっダァー!}$