記事
· 2024年4月8日 10m read

Open AI と IRIS の統合 - ファイル管理

 

人工知能は、命令によってテキストから画像を生成したり、単純な指示によって物語を差作成したりすることだけに限られていません。

多様な写真を作成したり、既存の写真に特殊な背景を含めたりすることもできます。

また、話者の言語や速度に関係なく、音声のトランスクリプションを取得することも可能です。

では、ファイル管理の仕組みを調べてみましょう。

問題

入力値としてファイルが必要なメソッドについて OpenAI 情報を分析する場合、multipart/form-data を使用してパラメーターを指定する必要があります。

IRIS では、JSON コンテンツを使って POST メソッドへの呼び出しを作成する方法をすでに知っていますが、 この場合、Base64 フォーマットのファイルコンテンツを持つパラメーターを使用するのは非現実的です。

multipart/form-data にファイルコンテンツを含めるには、クラス %Net.MIMEPart を使用する必要があります。

呼び出しにファイルを含めるには、クラスオブジェクト %Net.MIMEPart に関連付けられた Content-Disposition ヘッダーを作成します。

set content = ##class(%Net.MIMEPart).%New()
set contentDisposition = "form-data; name="_$CHAR(34)_"image"_$CHAR(34)
set contentDisposition = contentDisposition_"; filename="_$CHAR(34)_fileName_$CHAR(34)
do content.SetHeader("Content-Disposition",contentDisposition)

Request クラスを使用してプロセスの値を保持するため、Base64 コンテンツを、コンテンツのボディを構成するストリームに変換する必要があります。

StreamUtils ユーティリティを使用して、Base64 を Stream に変換できます。

注意: 「pImage」変数には、ファイルコンテンツの Base64 文字列が含まれます。

Do ##class(HS.Util.StreamUtils).Base64Encode(pImage, .tStream)
Set content.Body = tStream

ただし、Global Summit 2023 において、幸運にも InterSystems エキスパートからもっと有用なコツを得られました。 実行は StreamUtils よりも高い効果があり、最終的には String と Stream のレコードを読み取るループがあることを教えていただきました。

これは、JSON を使用してそれを Stream に変換する Get を実行するだけの単純なソリューションです。

set contentfile = {}
set contentfile.file = pImage
set content.Body = contentfile.%Get("file",,"stream<base64")

呼び出しに必要なすべてのパラメーターを含めたら、ようやくパーツをエンクローズする新しい MIMEPart クラスを作成できます。

Set rootMIME = ##class(%Net.MIMEPart).%New()
do rootMIME.Parts.Insert(content)
set writer = ##class(%Net.MIMEWriter).%New()
set tSC = writer.OutputToStream(tHttpRequest.EntityBody)
set tSC = writer.WriteMIMEBody(rootMIME)
Set tContentType = "multipart/form-data; boundary="_rootMIME.Boundary
set tSC = ..Adapter.SendFormDataArray(.tHttpResponse, "POST", tHttpRequest,,,url)

このようにして、OpenAI で必要なメソッドにファイルコンテンツを送信します。

画像ファイル

Image メソッドでは、写真を送信してバリエーションを実行することができます。 すべてのイラストは PNG 形式である必要があるため、Base64 形式のファイルコンテンツを指定する場合、ファイル名はランダムに生成され、PNG 拡張子が付けられます。

以下は、写真の変更例です。

元の写真 バリエーション

ご覧のように、プログラムは命令を独自に解釈しています。

会社ロゴは円形と判断して入れ替えています。 また、オフィスにはガラスのドアが使用されていることを認識し、別のガラスのドアに入れ替えて、この時点ではレンガの壁が適用されています。

さらに、シャツの色を変更し、男性の腕の位置も変わっています。

また、OpenAI ではプロンプトに示されたコンテンツを挿入する領域にマスクを指定することで、画像を編集できます。

同じ画像を使用して、画像の背景を取り除くマスクを適用しました。

元の写真 マスク

OpenAI にジャマイカのビーチに転送してほしいと指示すると、以下のような結果になりました。

家族や友人に会うときに、自分の休暇を自慢できるようになりました 😊

Image

エンドポイント: POST https://api.openai.com/v1/images/variations

既存の画像を変更した画像を作成できます。 変更方法を指定するプロンプトは不要であるため、この画像の解釈方法については AI のセンスを信用する必要があります。 また、結果のサイズと、リンクまたは Base64 のコンテンツのどちらの戻し方を希望するかを定義できます。

入力パラメーターは以下のようになります。

  • image: 必須
  • 変換する画像ファイルを指定します。
  • n: オプション。 デフォルトは 1 です。
  • このエリアでは、生成する画像の最大数を指定します。 (1~10 の数値を使用します)。
  • size: オプション。 デフォルトは 1024x1024 です。
  • このパラメーターは生成される画像のサイズを特徴づけます。 値は “256x256”、“512x512”、または “1024x1024” です。
  • response_format: オプション。 デフォルトで “url” になります。
  • この要素は、生成された画像を戻す際の形式を指定します。 値は “url” または “b64_json” です。

エンドポイント: POST https://api.openai.com/v1/images/edits

マスク ファイルに基づいて既存の画像を変更し、プロンプトに従って画像を作成できます。 また、結果の寸法と、リンクまたは Base64 のコンテンツのどちらの戻し方を希望するかを指定できます。

入力パラメーターは以下のようになります。

  • image: 必須
  • 変更する画像ファイルを指定します。
  • mask: 必須
  • このパートでは、適用するマスク画像ファイルを指定します。
  • n: オプション。 デフォルトは 1 です。
  • このエリアでは、生成する画像の最大数を指定します。 (1~10 の数値を使用します)。
  • size: オプション。 デフォルトは 1024x1024 です。
  • このパラメーターは生成される画像のサイズを特徴づけます。 値は “256x256”、“512x512”、または “1024x1024” です。
  • response_format: オプション。 デフォルトで “url” になります。
  • この要素は、生成された画像を戻す際の形式を指定します。 値は “url” または “b64_json” です。

音声ファイル

OpenAI が管理するのは画像だけではありません。 音声ファイルを使用して、提供されたレコーディングのトランスクリプションまたは翻訳を取得することもできます。

このメソッドは、固有名詞、ブランド、およびスラングを区別して正しいトランス来居プションと翻訳を提供できる Whisper モデルを使用します。 たとえば、「micromachine」というブランドについて言及するのと、一般名詞の「micro machines」をスペイン語に翻訳するのは同じことではありません。

次の例は、80 年代の有名な広告のトランスクリプションです。

https://www.youtube.com/embed/zLP6oT3uqV8
[これは埋め込みリンクですが、あなたはサイト上の埋め込みコンテンツへのアクセスに必要な Cookie を拒否しているため、それを直接表示することはできません。埋め込みコンテンツを表示するには、Cookie 設定ですべての Cookie を受け入れる必要があります。]

Whisper にこの音声のトランスクリプションを作成する命令の結果は以下のようになります。

{
    "text": "This is the Micromachine Man presenting the most midget miniature motorcade of micromachines. 
Each one has dramatic details, terrific trim, precision paint jobs, plus incredible micromachine pocket playsets. 
There's a police station, fire station, restaurant, service station, and more. Perfect pocket portables to take anyplace. 
And there are many miniature playsets to play with and each one comes with its own special edition micromachine vehicle and 
fun fantastic features that miraculously move. Raise the boat lift at the airport, marina, man the gun turret at 
the army base, clean your car at the car wash, raise the toll bridge. And these playsets fit together to form a micromachine world.
Micromachine pocket playsets, so tremendously tiny, so perfectly precise, so dazzlingly detailed, you'll want to pocket them all.
Micromachines and micromachine pocket playsets sold separately from Galoob. The smaller they are, the better they are."
}

素晴らしいです! そう思いませんか?

上記の結果は、Whisper モデルが受けたトレーニングによって実現しています。 これに関する情報は、OpeanAI ページに記載されている以下のダイアグラムでご覧いただけます。

 

詳細は、https://openai.com/research/whisper をご覧ください。

サービスは処理するファイルのタイプ(WAV、MP3、OGG など)を知っておく必要があるため、ファイル名に関する情報をプログラムに提供することが重要であることに注意してください。

呼び出しには Base64 コンテンツのみを含めるため、ランダムなテキストと指定拡張子でファイル名を作成できるように、ファイル拡張子も指定する必要があります。

たとえば、St.OpenAi.Msg.Audio.AudioRequest メッセージには、音声の種類を示す MP3、OGG、WAV、FLAC などの “type” プロパティがあります。

エンドポイント: https://api.openai.com/v1/audio/transcriptions

このメソッドでは、音声のコンテンツを音声の言語に文字起こしできます。

入力パラメーターは以下のようになります。

  • file: 必須
  • 文字起こしする音声ファイル(ファイル名ではありません)を指定します。 次の形式がサポートされています: FLAC、MP3、MP4、MPEG、MPGA、M4A、OGG、WAV、または WEBM
  • model: 必須。
  • トランスクリプションを作成するのに使用するモデル。 現時点では、“whisper-1” のみを使用できます。
  • language: オプション。 デフォルトでは、音声の言語です。
  • ISO-639-1 によると、指定されている場合、精度とレイテンシーが改善されます。
  • prompt: オプション。
  • これは、モデルのスタイルをガイドするため、または前の音声セグメントを継続するためのオプションのテキストです。 このメッセージは音声の言語に一致している必要があります。
  • response_format。 オプション。 デフォルトで “json” になります。
  • このパートでは、トランスクリプション出力のフォーマットを明確にします。 “json”、“text”、“verbose_json” のいずれかのオプションを使用します。
  • temperature: オプション。 デフォルト値は 0 です。
  • サンプリング温度は 0~1 です。 0.8 のように値が高くなるほど出力がよりランダムになり、0.2 のように低くなるほど集中的で確定的になります。 0 に設定すると、モデルは対数尤度を使用して、特定のしきい値に達するまで温度を自動的に高めます。

このメソッドのドキュメントは https://platform.openai.com/docs/api-reference/audio/createTranscription<をご覧ください。

エンドポイント: https://api.openai.com/v1/audio/translations

このメソッドでは、音声のコンテンツを英語に翻訳できます。

入力パラメーターは以下のようになります。

  • file: 必須
  • 翻訳する音声ファイルです(ファイル名ではありません)。 次の形式がサポートされています: FLAC、MP3、MP4、MPEG、MPGA、M4A、OGG、WAV、または WEBM
  • model: 必須。
  • このフィールドには、トランスクリプションを作成するために使用するモデルを入力します。 現時点では、“whisper-1” のみを使用できます。
  • prompt: オプション。
  • これは、モデルのスタイルをガイドするため、または前の音声セグメントを継続するためのオプションのテキストです。 このメッセージは英語である必要があります。
  • response_format。 オプション。 デフォルトで “json” になります。
  • ここでは、トランスクリプションの出力の形式を “json”、“text”、“verbose_json” から指定します。
  • temperature: オプション。 デフォルト値は 0 です。
  • サンプリング温度は 0~1 です。 0.8 のように値が高くなるほど出力がよりランダムになり、0.2 のように低くなるほど集中的で確定的になります。 0 に設定すると、モデルは対数尤度を使用して、特定のしきい値に達するまで温度を自動的に高めます。

このメソッドのドキュメントは https://platform.openai.com/docs/api-reference/audio/createTranscriptionをご覧ください。

次の内容

OpenAI は継続的に進化しているため、次回の記事ではテキストから音声への変換方法とその他の新機能をいくつか紹介します。

記事を気に入っていただけたなら、「いいね」を押してください。

@Kurro Lopezさんが書いた元の記事へ
ディスカッション (0)0
続けるにはログインするか新規登録を行ってください