8
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

闘魂Elixir ーー multipart/form-dataによるデータのPOSTをElixirで行う

Last updated at Posted at 2023-04-01

$\huge{元氣ですかーーーーッ!!!}$
$\huge{元氣があればなんでもできる!}$

$\huge{闘魂とは己に打ち克つこと。}$
$\huge{そして闘いを通じて己の魂を磨いていく}$
$\huge{ことだと思います}$

はじめに

この記事は、multipart/form-dataによるデータのPOSTをElixirで行います。
題材は、OpenAIが提供しているSpeech to text APIを使います。

サマリ

サマリです。

  • HTTPoisonでの実装方法がわかりました
  • Openai.ex Hexでは、HTTPoisonを利用して実装されていました
  • Reqでの実装方法はわかっていません
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"}])
mix.exs
  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
)

参考資料

参考にした資料を紹介しておきます。

lib/openai/client.ex
  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 ぁっダァー!}$

8
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?