見出し画像

OpenAI APIにiOSから動画を投げる実装のメモ #GPT-4o

これとか、

これの実装をやった際のメモ。



送信するフレーム数・画像サイズ

画像をData型にする際に、当初は

guard let imageData = cgImage.dataProvider?.data as? Data else { fatalError() }

という実装にしていた。

この場合、1920x1080であれば1フレームあたり 8294400 bytes = 8.29 MB(※画像の内容により変動はする)。

"invalid_request_error" エラー

上述のデータサイズだと、3フレームも送れば20 MB制限に引っかかってエラーになる。

APIErrorResponse(error: OpenAI.APIError(message: "You uploaded an unsupported image. Please make sure your image is below 20 MB in size and is of one the following formats: [\'png\', \'jpeg\', \'gif\', \'webp\'].", type: "invalid_request_error", param: nil, code: Optional("invalid_image_format")))

そもそも送信にも時間がかかってレスポンスも遅くなる。

JPEGエンコード

ので、以下のようにJPEGエンコードしてから送信するようにした:

guard let imageData = UIImage(cgImage: cgImage).jpegData(compressionQuality: 0.8) else { fatalError() }

こうすると1920x1080で1フレームあたり 52868 bytes = 0.53 MB。

100分の1になった。

そもそも最初の実装にしていた理由は、UIImageを使いたくない(UIKitに依存したくない)からだった。

compressionQualityは0.5、あるいは0.3ぐらいでも全然OKで、もっと圧縮できるのだが、ネットが速い家で試しているし、エンコード品質を下げることによるデータサイズ圧縮は送信時間には影響するもののOpenAI側のレスポンス速度の短縮にはつながってない感じがしたので、デモでは0.5にしている。

画像のリサイズ・クロップ

GPT-4oの紹介ページのLacture summarizationデモでは45分の動画を要約している。

が、手元で60秒の動画から1秒ごとに60フレーム送信しようとするとタイムアウトになってしまった。

Error Domain=NSURLErrorDomain Code=-1001 "The request timed out."

まぁ普通は60枚の画像をAPIで送ったりはしない。

OpenAIとしてはどれぐらいの間隔でフレーム抽出して、どれぐらいにリサイズしてるのかなと調べた記事がこちら:

リサイズ・クロップはCore Imageで行っている:

func transformed(by matrix: CGAffineTransform) -> CIImage
func cropped(to rect: CGRect) -> CIImage

画像理解の忠実度 / detail パラメータ

ここから先は

3,542字
文章やサンプルコードは多少荒削りかもしれませんが、ブログや書籍にはまだ書いていないことを日々大量に載せています。たったの400円で、すぐに購読解除してもその月は過去記事もさかのぼって読めるので、少しでも気になる内容がある方にはオトクかと思います。

技術的なメモやサンプルコード、思いついたアイデア、考えたこと、お金の話等々、頭をよぎった諸々を気軽に垂れ流しています。

最後まで読んでいただきありがとうございます!もし参考になる部分があれば、スキを押していただけると励みになります。 Twitterもフォローしていただけたら嬉しいです。 https://twitter.com/shu223/