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制限に引っかかってエラーになる。
そもそも送信にも時間がかかってレスポンスも遅くなる。
JPEGエンコード
ので、以下のようにJPEGエンコードしてから送信するようにした:
guard let imageData = UIImage(cgImage: cgImage).jpegData(compressionQuality: 0.8) else { fatalError() }
こうすると1920x1080で1フレームあたり 52868 bytes = 0.53 MB。
100分の1になった。
compressionQualityは0.5、あるいは0.3ぐらいでも全然OKで、もっと圧縮できるのだが、ネットが速い家で試しているし、エンコード品質を下げることによるデータサイズ圧縮は送信時間には影響するもののOpenAI側のレスポンス速度の短縮にはつながってない感じがしたので、デモでは0.5にしている。
画像のリサイズ・クロップ
GPT-4oの紹介ページのLacture summarizationデモでは45分の動画を要約している。
が、手元で60秒の動画から1秒ごとに60フレーム送信しようとするとタイムアウトになってしまった。
まぁ普通は60枚の画像をAPIで送ったりはしない。
OpenAIとしてはどれぐらいの間隔でフレーム抽出して、どれぐらいにリサイズしてるのかなと調べた記事がこちら:
リサイズ・クロップはCore Imageで行っている:
func transformed(by matrix: CGAffineTransform) -> CIImage
func cropped(to rect: CGRect) -> CIImage
画像理解の忠実度 / detail パラメータ
最後まで読んでいただきありがとうございます!もし参考になる部分があれば、スキを押していただけると励みになります。 Twitterもフォローしていただけたら嬉しいです。 https://twitter.com/shu223/