FFmpegとmermaid-cliとgTTSで、LLMに動画を作成してもらう

# 記事の概要

FFmpegで簡単な動画編集ができるというのはわかっていたので、大部分をLLMの力を使って動画を作成する手法を検証する。

フローは以下のようなイメージ。

```mermaid
graph LR
    A[LLM] --> B[解説するマーメイド記法の図のテキストを作成]
    A --> C[mermaid-cliでpngを作成するコマンドを作成]
    A --> D[解説動画のセリフを作成するプログラムを作成]
    A --> E[動画を作成するFFmpegのコマンドを作成]

    B --> F[mermaid-cliでpngを作成するコマンドで画像ファイルを作成]
    D --> G[解説動画のセリフを作成するプログラムで音声ファイルを作成]
    F --> H[動画を作成するFFmpegのコマンドで動画ファイルを作成]
    G --> H
    C -.-> |コマンド実行|F
    D -.-> |プログラム実行|G
    E -.-> |コマンド実行|H
```

# 環境構築

### FFmpeg

以下の記事を参考に、FFmpegをインストール・システム環境変数を設定する。

https://taziku.co.jp/blog/windows-ffmpeg

### mermaid-cli

node.jsをインストールする。

https://nodejs.org/en

コマンドプロンプトで以下のコマンドを実行する。

```powershell
npm install -g @mermaid-js/mermaid-cli
```

# gTTS

以下のコマンドでgTTSをインストールする。
（pythonがインストールされていなければ、インストールしてください。）

```powershell
pip install gtts 
```

# LLMにコマンド・プログラムを作成してもらう。

### プロンプト

ChatGPTなどで、LLMにマーメイド記法の図を出力してもらう。

```
LLＭのベースとなっているトランスフォーマーのアーキテクチャーについて、マーメイド記法の図を使って解説してください。
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/e15a642a-bea9-7a99-c20a-5fedaac29511.png)

マーメイドが想定通りかを確認する。

※以下の手順で、マーメイド記法の図は参照可能。

https://qiita.com/kongo-jun/items/c446898ac301b62a5934

修正が必要な場合は、実際にVSCodeなどで修正したり、LLMに修正を依頼する。（パワハラプロンプトを使うと効果的）

```
```mermaid
graph TD
    subgraph Encoder
        A1[Input Embedding]
        A2[Positional Encoding]
        A3[Multi-Head Attention]
        A4[Add & Norm]
        A5[Feed Forward]
        A6[Add & Norm]
        A7[Output to Decoder]
        A1 --> A2 --> A3 --> A4 --> A5 --> A6 --> A7
    end

    subgraph Decoder
        B1[Target Embedding]
        B2[Positional Encoding]
        B3[Masked Multi-Head Attention]
        B4[Add & Norm]
        B5[Multi-Head Attention w/ Encoder Output]
        B6[Add & Norm]
        B7[Feed Forward]
        B8[Add & Norm]
        B9[Output]
        B1 --> B2 --> B3 --> B4 --> B5 --> B6 --> B7 --> B8 --> B9
    end

    subgraph Output
        C1[Linear]
        C2[Softmax]
        C3[Predicted Output]
        B9 --> C1 --> C2 --> C3
    end

    subgraph Attention
        A3 -.->|Keys, Values, Queries| B5
    end
    ```

```

以下のプロンプトを実行する。

```
mermaid-cliで図を、gTTSで音声ファイルを作成し、FFmpegで動画を作成してください。
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/c593b394-6625-b18b-1554-6157a74b69b9.png)


### マーメイドの図を作成

完成したマーメイド記法のテキストを「.md」拡張子のファイルで保存する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/c4f8ed80-5671-db48-d421-6a3ddc343db6.png)

以下のコマンドを実行し、マーメイド記法で作成された図をpngファイルとして出力する。

```powershell
mmdc -i output.md -o output.png
```

画像ファイルが出力される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/19f29a7a-68af-3563-b1ac-9b32f8777d7b.png)

### ナレーションの作成

ナレーションの作成は、LLMの出力を利用する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/b57b1ba8-b56e-e774-7450-6fc629a935ce.png)

以下のようなプログラムを出力される想定のため、それを実行する。

```python:generate_narration.py
from gtts import gTTS

# ナレーション用のテキスト
text = "This diagram represents the architecture of the Transformer model, which is fundamental in modern NLP. The model consists of an encoder and a decoder, each made up of multiple layers of self-attention and feed-forward networks."

# 出力ファイル名
filename = "narration.mp3"

# MP3ファイルを生成
tts = gTTS(text)
tts.save(filename)
```
```powershell
python generate_narration.py
```

ナレーションファイルが出力される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/fdf758fe-179c-5af7-6edc-d89e2b0cd21f.png)


### 動画の作成

おそらく、LLMがFFmpegのコマンドを出力していると思うが、以下のようなコマンドを実行する。
（「scale=1080:1920」については、PNGに合わせて変更する必要あり）

```
ffmpeg -loop 1 -i output-1.png -i narration.mp3 -c:v libx264 -tune stillimage -c:a aac -b:a 192k -pix_fmt yuv420p -t 30 -vf "scale=1080:1920" output.mp4
```

動画ファイルが作成される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/0f876b43-064d-8ba3-bdde-b94c51b63022.png)

# 結果

アウトプットはこんなイメージ。
※内容の正しさは確認していません。

https://x.com/jun_kongo/status/1823255570608263532


# 補足

字幕も追加してみる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/24b9f388-8995-27a5-eaaa-b953ac50deb1.png)

### 字幕追加手順

以下の内容のファイルを「subtitles.srt」という名前で作成する。

```srt:subtitles.srt
1
00:00:00,000 --> 00:00:10,000
This diagram represents the architecture of the Transformer model, which is fundamental in modern NLP.

2
00:00:10,000 --> 00:00:20,000
The model consists of an encoder and a decoder, each made up of multiple layers of self-attention and feed-forward networks.
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/42f4913a-884c-0e8c-1c81-fb089fe39811.png)


以下のコマンドを実行する。

```
ffmpeg -i output.mp4 -vf "subtitles=subtitles.srt:force_style='FontSize=24,PrimaryColour=&HFFFFFF&'" -c:a copy output_with_subtitles.mp4
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/dab76a66-f6b8-1715-c52e-6be4091d7ff2.png)

雑な見た目だが、字幕が追加されている。
※内容の正しさは確認していない。

https://x.com/jun_kongo/status/1823260115337957568