美少女競馬AI予想VTuberのために、動画コンテンツを爆速で作るプログラムを書いてみた。アンド、勉強会内容の共有が少し良くなりそうなツールを作ってみた。


# 結論から先に言うと
動画編集する時間を短くしたかったので、
テキストベースで動画が編集できるプログラムを作った。

1.動画の素材を用意して
2.こんな感じの動画編集スクリプトを書くと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96675/9ce12d2d-4128-1ee9-fed1-da872185c0c1.png)

3.こんな感じの動画を生成できる
<iframe width="560" height="315" src="https://www.youtube.com/embed/eiQefzuSwQs" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


４. その動画を生成するプログラムをオープンソースで公開した

https://github.com/masachaco/zap-movie-maker



# 実施した内容
まずは、上記のは動画をご確認ください。

# 動機
こんにちは、普段競馬AI開発VTuberの、サポートをしています、まさちゃこといいます。

競馬AI開発VTuberのユーミィちゃんは、主に中央競馬を自作のAIで予想して、その予想を呟いたり、予想内容に関する解説配信を行ったりしています。

VTuberたるもの、動画を作らないといけないのですが、
中央競馬は土日開催、しかもAI開発にも時間を取らないといけないときたもんです。

動画を撮ったり、ネタを考えるのは楽しいのですが、いかんせん編集に時間がかかります。

裏方でサポートしている私にも、編集時間がなかなか取れないのでした。
![スライド9.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96675/eb5bcf2c-4870-8a1e-fbf3-8774adbeac89.png)


現代にはaviutlや、Adobe Premiere等便利な編集ソフトはたくさんあります。
しかし、どれもが私には多機能過ぎたのです。

私がやりたいことは、単にとってきた画像や写真に、合成音声で声を付けて、テロップを付けたいだけなんです。

しかし、単にこれだけの作業でもなかなかに厄介で
動画や画像のサイズを整えては、テロップを作って、タイミングを合わせて、音声を調整しては、音声のタイミングを合わせて。

話す数の分だけそれを行わなければなりません。
![スライド11.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96675/74f3752c-b238-bc82-f10f-1d419a250ae9.png)



多分、上手いことやるとうまいことできるのでしょうが、なかなかしっくりくる手順が見当たりませんでした。

しかし、このままでは、ユーミィちゃんは動画を作れずにただのバーチャルAI予想家で終ってしまいます。
それもそれで楽しそうですが。

ですが、せっかくなので、動画を作って予想プラスの楽しいコンテンツにしたいと所です。
なので、自分で作ってみることにしました。

ちなみに、ユーミィちゃんは毎週末に中央競馬のAI予想を呟くVTuberです。
こちらも、まだまだ色々機能やコンテンツが足りていませんが・・・・。
https://twitter.com/keiba_uma_ai
細かい紹介は動画最下部に記載してあります。

予想についての技術記事は後日書きたいと思います。

# やりたいこと

動画編集ソフトを作る。
素材はあれこれ手作業で作って用意するにしても、動画の編集はすべてテキストで完結するようにする。

テキストでﾊﾞｰｰｰｰｰのｺﾞﾘｺﾞﾘｺﾞﾘと書けば、動画ができる。
```
動画01を再生して
動画流しながら、「こんにちわ」ってVOICEVOXに言わせて、言ってる間テロップを表示して。
次に「今日はこの企画をやっていきたいと思います」ってVOICEVOXに言わせて、言ってる間テロップを表示して。
キャラクターの表情を笑顔に変更して。
```
みたいな、割と雑な指示を、テキストでしたら動画を編集してほしいわけです。

でも、ある程度の体裁は保ちたい。

所謂Biimシステム的なフォーマットなら、テロップも動画も見やすく、作りやすいんじゃないか。

https://dic.nicovideo.jp/a/biim%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0


なので、素材を用意したら、テキストからBiimシステム的なフォーマットの動画ができるようにすることにしました。

つまり
![スライド13.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96675/b9a4124b-0bdb-150a-7de8-019d207e5c2c.png)

![スライド14.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96675/63b1eff9-aa57-1d17-f67f-4d41244d0e18.png)

且つ、入力したテキストから、音声も自動で生成して、その音声のテロップも自動で生成して
動画に表示するタイミングも自動で指定できるようにすることを目指しました。
なぜなら、そこが一番めんどくさかったので。


# 利用した技術

・Python
・moviepy
・VOICEVOX

Pythonのmoviepyというライブラリを使用すると動画編集ができると聞きました。

https://zulko.github.io/moviepy/

セットアップが若干必要なものの、わかりやすいAPIで使いやすいです。
動画編集部分はこれを使用することにします。

次に合成音声を生成する部分ですが、VOICEVOXを使用させていただきました。

VOICEVOXは、無料で使用できてかなり人に近い読み上げをしてくれる合成音声ソフトウェアです。
これくらいのクオリティなら、あまり調整が要らないのではないかと思いました。

また、VOICEVOXは手元で起動するとREST API経由で音声を生成できるようになり、
プログラム間の連携もしやすかったのがかなり嬉しいポイントでした。

https://voicevox.hiroshiba.jp/


# システムの構成

なので作るプログラムの動きは大体こんな感じです

 - 動画の素材を用意する
 - 編集の指示書(テキストファイル)をガリガリ書く
 - 編集の指示書(テキストファイル)を読み込んで
 - それを元にVOICEVOXで音声を自動で作成する
 - 生成された音声を元に、テロップを表示する長さを自動で決める
 - テロップを表示する長さを元に、動画に合成するタイミングを自動で決める
 - 表示する箇所はテンプレートで決めておく
 - moviepyのAPIを叩いて素材を動画に合成させる

![gaiyou04.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96675/3772febe-5fa9-6e8d-6b1f-4427907e8121.png)

# できたもの

そんなこんなで、できたのが冒頭のスクリプトを読ませると、冒頭の動画ができるシステムです。

動画のスライドはパワポの内容を画像に書き出したものです。
動画はiPhoneで撮った動画をそのまま流し込んだだけです。
普通に編集するより、やはり楽でした。

biimシステム的な動画をバンバン作るツールなので、
SplatoonのN-ZAP(任天堂が出した光線銃のコントローラベースの武器)
と、軽快に動画を作りたいという意味を込めて 「zap-movie-maker」という名前で公開してみました。
https://github.com/masachaco/zap-movie-maker

主な使い方は

- パワポでスライドを書いてすべて画像で出力
- スマホで撮った動画をAmazonPhotosなどで取り込んでPCにダウンロード
- 効果音やBGMを集める
- それらを素材ファイルディレクトリに置く
- その素材を使ってどういう順で見せていくか・編集するかのスクリプトを書く
- 動画を出力して掲載する

という流れになります

正直、試作レベルなのでコードも雑で、エラーハンドリングも足りていなく、テストも不十分です。
多分、他の人が使うにはオプションの種類とかがめちゃくちゃ足りません。

が、まずは、公開してみたら同じようなことをやりたい人はいっぱいいるだろうし、いろんな知見や修正案が集まるのかなと思った次第です。
泣いてしまうのであまり強めのマサカリは投げないでください・・・。
ドキドキしながらプルリクや改善案が来るのを待っています。

できる範囲で改善したいと思います。

ソースコード自体はAPIを呼んでるだけなので、別段特別なことはしていません。
若干詰まったところは、以下の記事に記載しました。
https://qiita.com/masachaco/items/75ac0d59bafe11231a14


# 補助的な目論見

![スライド10.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96675/6e0d9f14-8e17-d78c-778e-2581e21d9946.png)

動画内でも記載したのですが、こういう形式だと、技術スライドの共有にも有効だと思いました。
勉強会やライトニングトークに参加してみたり、自分で発表してみると、案外スライドに書いたことは、本当に要点だけだったりするんじゃないかと思うことがありました。

実際の話には、その要点に思い立った経緯や、補足などがバシバシ語られていることが多いように感じます。
一方で、勉強会資料は公開されるものの、原稿や発表の音声が公開されることは比較的少ないです。

これなら、原稿を用意すれば比較的楽な作業で発表に近いことを、いろんな人に届けられるのではないかと思いました。
パワポなら、画像に一気に書き出せば動画の素材にできますしね。

今回作った動画も、案外ライトニングトークっぽい構成で作れたんじゃないかと思います。

これを利用して、動画が作られてる場面に出くわせたら嬉しいことこの上ありません。

# 今後の改良案
![スライド36.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96675/7da7f0b7-0508-c9b9-a87d-9ef5559e459a.png)

汎用化やデバッグ、エラーハンドリングは必須として。
VOICEVOXのパラメータ設定や、必須レベルの機能は追加するとして

- パワポから読み上げる動画を自動生成したり
- Google Slideと連携したり
- Google Colab上で動かしたり

とかが、できると楽しいんじゃないかなと思っています。

# 作ってみた感想

細かいタイミング指定をせずに、テロップと音声を合成するのが最初の目論見だったが思いのほか上手くいった。
よく考えるとこれ、ノベルゲームのスクリプトや。

意外とさっくり作れて、好みのプログラムができました。
これを作ってから、動画もいくつか公開できたので目論見通りのものが作れたと思います。

一方でmoviepyが思いのほか動画出力に時間がかかるので、ゲームエンジンとか作ってキャプチャしたほうが良いのかなと思いました。改良します。

雑なのや機能が足りてないのは承知のうえで、コードを公開してみるるのも良かったです。


多分、こういうツールすでにあるだろうな～。
と思いつつも、似た感じのモノが見当たらなかったのであれば教えていただけると幸いです。

そして、このプログラムのほとんどは、moviepyとVOICEVOXの高機能に支えられており、
動画の多くは、いらすとや様に支えられています。

また、この仕組みが皆様のお役に少しでも立てれば幸いです。
それでは～。

# ユーミィちゃんとは

こんな感じの競馬AI開発VTuberです。
<iframe width="560" height="315" src="https://www.youtube.com/embed/KKE6IZ1shoQ" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>