ChatGPTにffmpegコマンドを作らせてみた

## はじめに

ChatGPTを使って、日々の作業を効率化できないか。
どういったところで生かせそうか、学習したときの記録です。

今回は例として、前回記事のような「ffmpegコマンドを作る」シチュエーションで考えてみます。

>【前回記事】ffmpegを使って動画や音声を結合する
https://qiita.com/ktsuchi/items/ca3c1dd5e027ca43a029

## ケース1 : コマンドを作らせてみる

まずは、前回の最後に載せた長いffmpegコマンドをChatGPTに作らせてみる。

ざっと要件を箇条書きにして指示を出してみた。

![ScreenShot 2023-03-30 17.55.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277934/7f113cae-c88e-458c-af4a-94bfab2930de.png)
![ScreenShot 2023-03-30 17.56.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277934/9e66cb5c-a893-6125-f101-3bc54ef94be2.png)

ChatGPTから返ってきたコマンド。

```a:less
ffmpeg -f concat -safe 0 -i list.txt -i audio.mp3 \
-filter_complex "[0:a]volume=2,fade=t=in:st=5:d=1,fade=t=out:st=30:d=2[audio]; \
[0:v]volume=2,fade=t=in:st=5:d=1,fade=t=out:st=30:d=2[v1]; \
[1:a]adelay=5000|5000[audio-delayed]; \
[audio-delayed][audio]amix=inputs=2:duration=longest[audio-mixed]" \
-map "[v1]" -map "[audio-mixed]" -c:v libx264 -preset medium -crf 23 -c:a aac -b:a 192k output.mp4
```

filter_complexのオプションが使われていて、fade in/out 処理も申し分ないので、
これを一発で出してくれるのは非常にありがたい。

ただ、adelayは要らなかったり、後半はもう少しシンプルにできるなーと。

この辺りは追加で指示を繰り返し出すと改善されていったので、
指示の出し方を工夫すれば、より自分の望むコマンドがスムーズにできあがりそう。

単純なコマンド生成は余裕だろうとは思っていたけど、このような複雑なコマンドでも簡単に作ってくれるのが分かったので、かなり作業時間の短縮に繋がるのではと感じました。


## ケース2 : コマンドを説明させてみる

次は、ffmpegコマンドの意味を説明させてみる。

例として、再び前回の最後に書いた複雑なコマンドを投げてみた。

![ScreenShot 2023-03-30 18.04.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277934/63e9f2c0-75d1-85e5-7420-9e196d164997.png)
![ScreenShot 2023-03-30 18.04.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277934/02e10ed2-4d61-a44f-d1ae-084930e2ae8f.png)

これは分かりやすい！
各オプションの説明まで入れてくれるのは親切ですね。

他メンバーに共有するときや、利用者へ向けた操作マニュアルなど、
アウトプットとしてドキュメントに残しておく場面などでかなり役立ちそう。

ただ強いて言えば、参照先が表示されていないので、
本当に内容が合っているかどうかは自分で確かめる必要があるのが難点かなと。

## ケース3 : 知りたいことがふわっとしてる状態

「なんて説明したらいいか上手く分からないけど、こんなことがしたい！」という場合、
ふわっとした曖昧な指示でもChatGPTは効果を発揮するだろうか。

実際、当時の自分も「映像ファイル(mp4)の音声と音声ファイル(mp3)の音声の、両方の音声を聞こえるようにするには…？」というところで詰まっており、最終的に **amix** が使えることに気づくまでには時間がかかっていました。

その当時、ChatGPTがあったらどうなったのだろうか。早々に解決できたのだろうか。
当時の自分になりきって会話してみる。

![ScreenShot 2023-03-30 18.07.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277934/d62c41ca-872d-be58-53d9-c80538d17a26.png)
```a:css
ffmpeg -i input.mp4 -i input.mp3 -c:v copy -map 0:v:0 -map 1:a:0 -shortest output.mp4
```

このコマンドは当時も試したが、ダメなのです…
音声ファイル(mp3)の音声だけになってしまうので。

追加で指示を出してみる。

![ScreenShot 2023-03-30 18.49.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277934/36875679-f422-42b2-645e-fdd6c1bc01c0.png)

プレイヤー側のことを言われてしまった。。

そうじゃないと伝える。

![ScreenShot 2023-03-30 18.50.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277934/edae79f7-88a9-11ac-5d57-d7cbe7bd7725.png)

```a:go
ffmpeg -i input.mp4 -i input.mp3 -c:v copy -map 0:v:0 -map 0:a:0 -map 1:a:0 -shortest -c:a copy output.mp4
```

このコマンドでは音声トラックが複数に分かれてしまって、再生すると片方しか聞こえない。

今度は「マルチトラックではなく」と入れてみた。伝わるだろうか。

![ScreenShot 2023-03-30 18.54.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277934/1025666d-01ee-e778-8007-70b8aa301c4d.png)

```a:less
ffmpeg -i input.mp4 -i input.mp3 -map 0:v:0 -map 0:a:0 -map 1:a:0 -c:v copy -c:a aac -b:a 128k output.mp4
```

これもいまいち… 音声形式をAACにしただけで音声トラックは複数のままだし、、
「結合」という言葉がよくないのかな。

次は「混合」というワードで指示してみた。

![ScreenShot 2023-03-30 18.54.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277934/98db1f5e-424d-693a-32cf-81c17004386c.png)

```a:css
ffmpeg -i input.mp4 -i input.mp3 -c:v copy -map 0:v:0 -map 1:a:0 -shortest output.mp4
```

なんと最初のコマンドに戻ってしまった。。

こうなったら、明確に「複数の音声を混合して1つの音声ファイルに出力」と書いてみる。

![ScreenShot 2023-03-30 18.56.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277934/8cc6765e-6b21-a64e-5310-447ea0d84103.png)

```a:css
ffmpeg -i input1.mp3 -i input2.mp3 -filter_complex amix=inputs=2:duration=longest -ac 2 output.mp3
```

ここでやっと **amix** に辿り着いた…！
（私の説明不足でoutputがmp3となっているが、mp4に変えて実行するとちゃんと動いた）

ChatGPTに何度も聞いて試しながら考えていくのは十分ありだとは思ったが、
やはりケース1と同様に、具体的な要件を言語化して指示してあげる必要がありそう。

## おわりに

噂には聞いていましたが、ChatGPTは想像以上に使えることを実感しました。
もちろん使う側の知識も求められますが、壁打ち相手としてはとても有用ですね。

正直、Google検索よりも便利な場面は沢山ありそうです。例えば「エラーメッセージを載せて、解決策を教えてもらう」といったトラブルシュートも少し試しましたが、十分役立ちそうでした。

ただ自分で遊ぶ分にはいいですが、最終的な成果物として実装する際には、
公式ドキュメントを参照したり、コマンドが想定通りの挙動となるかの確認が必要になる点は注意したいところです。

他にも様々な場面で活用できる機会があると思うので、
今後もChatGPTとよい距離感をもって接していければと考えています。