はじめに
動画の作成に使用しているPCが新しくなって(というか、嫁様のお下がりのストレージをSSDに換装したものです。この顛末についてはこちら。)から、本業はいまいち忙しくなっていないのになぜか家事が忙しくなってしまったために動画の作成がちょっと途絶えてしまいましたが、久々にYouTubeに投稿するための動画を作っているところです。
ただ、AviUtlでテキストオブジェクトをそれなりの数作成せねばならないところに突き当たったので、
「これはツールを作った方が便利じゃね?」
panda大学習帳のネタにもなりそうだし…
と思ったので、もともとの動画の制作はいったん中断してこれまた久々にPython3でAviUtl用のテキストオブジェクトの量産ツール(以下、「txt2exo」と書きます。)を作ることにしました。
この記事ではそれについて書いていきます。
まずは仕様を決めていきます。
txt2exoは以下の2個のファイルを使用してAviUtl用のテキストオブジェクトを量産するツールです。以下、量産されたテキストオブジェクトが格納されているファイルを「字幕ファイル」と書きます。
- テキストオブジェクトのAviUtlにおける設定を記述したexoフォーマットのファイル(以下、「元ファイル」と書きます)。
- テキストオブジェクトに変換したい文字列を記述したテキストファイル(以下、単に「テキストファイル」と書きます)。このファイルの1行につき1個のテキストオブジェクトが生成されます。なお、改行コード及び空文字のみが記述されている行についてはテキストオブジェクトが生成されません。
なお、出力となる字幕ファイルはAviUtlのexoフォーマットとして標準出力に出力されます。字幕ファイルをAviUtlにインポートすると、AviUtlのタイムライン上では同一のレイヤー上に生成されたテキストオブジェクトが経過時間の早い方から遅い方に順番に並ぶように配置されます。また、テキストオブジェクトのフォント名、継続時間及びその他の設定については元ファイルのテキストオブジェクトの設定がそのまま使用されます。
使い方と実行例
txt2exoのコマンドプロンプトにおける実行方法
Windowsのコマンドプロンプトにおける実行方法は以下の通りです(Python3のみの対応ですので、インストールされていない場合にはPython3のインストールが別途必要です)。字幕ファイルは標準出力に出力されます。AviUtlがWindows上でのみ動作するアプリケーションであるため、txt2exo.pyの動作確認もWindows上でのみ行っています(なお、Windows以外のOSのみならず、Windows上で実行した場合であっても実行した結果については無保証であり、実行したことにより生じた損害などについての責任は一切負いません)。
元ファイル及びテキストファイルの作り方は次節以降に書きます。
元ファイルの作り方
元ファイルはAviUtlを使って以下の手順で作成します。なお、AviUtlには拡張編集プラグインがすでにインストールされていることを前提としています。
- AviUtlを起動します。
- 下図のようにタイムラインにテキストオブジェクト(赤矢印)を配置します。配置するテキストオブジェクトはなるべく先頭に配置してください(開始位置の設定が字幕ファイルに生成されるテキストオブジェクトにそのまま反映されるため)。
- AviUtlのタイムラインの適当なところを右クリックするとポップアップメニューが表示されるので、「ファイル」→「オブジェクトファイルのエクスポート」を選択します。
- ファイル保存ダイアログが表示されるので、保存先ファイル名の拡張子が”exo”になっていることを確認しつつ、ファイル名を指定して保存します。
テキストファイルの作り方
テキストファイルはUTF-8での入力が可能な適当なエディタをテキストオブジェクトにしたい文字列1個につき1行に記述し、保存します。なお、文字コードはUTF-8を使用します。
スポンサーリンク
テキストファイルの作成例は以下の通りです。
実行例とAviUtlへのインポート
元ファイルとテキストファイルを入力としてtxt2exo.pyを実行すると、以下のような字幕ファイルが標準出力に出力されます(GitHub Gistへのアップロード用に文字コードをUTF-8に変換していますが、実際に使用する場合にはShift JISに変換して使用します)。
[exedit] | |
width=1920 | |
height=1200 | |
rate=30 | |
scale=1 | |
length=402 | |
audio_rate=44100 | |
audio_ch=2 | |
[0] | |
start=1 | |
end=402 | |
layer=1 | |
overlay=1 | |
camera=0 | |
[0.0] | |
_name=テキスト | |
サイズ=60 | |
表示速度=0.0 | |
文字毎に個別オブジェクト=0 | |
移動座標上に表示する=0 | |
自動スクロール=0 | |
B=0 | |
I=0 | |
type=4 | |
autoadjust=0 | |
soft=1 | |
monospace=0 | |
align=1 | |
spacing_x=0 | |
spacing_y=0 | |
precision=1 | |
color=1e3e8a | |
color2=ffffff | |
font=Rounded Mgen+ 1c heavy | |
text=2a6a5c6d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 | |
[0.1] | |
_name=アニメーション効果 | |
track0=0.50 | |
track1=0.50 | |
track2=-90.00 | |
track3=-90.00 | |
check0=0 | |
type=0 | |
filter=0 | |
name=画面外から入退場@pandanote.info | |
param= | |
[0.2] | |
_name=標準描画 | |
X=36.0 | |
Y=-548.0 | |
Z=0.0 | |
拡大率=100.00 | |
透明度=0.0 | |
回転=0.00 | |
blend=0 | |
[1] | |
start=403 | |
end=804 | |
layer=1 | |
overlay=1 | |
camera=0 | |
[1.0] | |
_name=テキスト | |
サイズ=60 | |
表示速度=0.0 | |
文字毎に個別オブジェクト=0 | |
移動座標上に表示する=0 | |
自動スクロール=0 | |
B=0 | |
I=0 | |
type=4 | |
autoadjust=0 | |
soft=1 | |
monospace=0 | |
align=1 | |
spacing_x=0 | |
spacing_y=0 | |
precision=1 | |
color=1e3e8a | |
color2=ffffff | |
font=Rounded Mgen+ 1c heavy | |
text=7f306a3068307f30893044300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 | |
[1.1] | |
_name=アニメーション効果 | |
track0=0.50 | |
track1=0.50 | |
track2=-90.00 | |
track3=-90.00 | |
check0=0 | |
type=0 | |
filter=0 | |
name=画面外から入退場@pandanote.info | |
param= | |
[1.2] | |
_name=標準描画 | |
X=36.0 | |
Y=-548.0 | |
Z=0.0 | |
拡大率=100.00 | |
透明度=0.0 | |
回転=0.00 | |
blend=0 | |
[2] | |
start=805 | |
end=1206 | |
layer=1 | |
overlay=1 | |
camera=0 | |
[2.0] | |
_name=テキスト | |
サイズ=60 | |
表示速度=0.0 | |
文字毎に個別オブジェクト=0 | |
移動座標上に表示する=0 | |
自動スクロール=0 | |
B=0 | |
I=0 | |
type=4 | |
autoadjust=0 | |
soft=1 | |
monospace=0 | |
align=1 | |
spacing_x=0 | |
spacing_y=0 | |
precision=1 | |
color=1e3e8a | |
color2=ffffff | |
font=Rounded Mgen+ 1c heavy | |
text=2d4eef8357880000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 | |
[2.1] | |
_name=アニメーション効果 | |
track0=0.50 | |
track1=0.50 | |
track2=-90.00 | |
track3=-90.00 | |
check0=0 | |
type=0 | |
filter=0 | |
name=画面外から入退場@pandanote.info | |
param= | |
[2.2] | |
_name=標準描画 | |
X=36.0 | |
Y=-548.0 | |
Z=0.0 | |
拡大率=100.00 | |
透明度=0.0 | |
回転=0.00 | |
blend=0 | |
[3] | |
start=1207 | |
end=1608 | |
layer=1 | |
overlay=1 | |
camera=0 | |
[3.0] | |
_name=テキスト | |
サイズ=60 | |
表示速度=0.0 | |
文字毎に個別オブジェクト=0 | |
移動座標上に表示する=0 | |
自動スクロール=0 | |
B=0 | |
I=0 | |
type=4 | |
autoadjust=0 | |
soft=1 | |
monospace=0 | |
align=1 | |
spacing_x=0 | |
spacing_y=0 | |
precision=1 | |
color=1e3e8a | |
color2=ffffff | |
font=Rounded Mgen+ 1c heavy | |
text=2a6a5c6d648dec30f330ac300950ab5e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 | |
[3.1] | |
_name=アニメーション効果 | |
track0=0.50 | |
track1=0.50 | |
track2=-90.00 | |
track3=-90.00 | |
check0=0 | |
type=0 | |
filter=0 | |
name=画面外から入退場@pandanote.info | |
param= | |
[3.2] | |
_name=標準描画 | |
X=36.0 | |
Y=-548.0 | |
Z=0.0 | |
拡大率=100.00 | |
透明度=0.0 | |
回転=0.00 | |
blend=0 | |
[4] | |
start=1609 | |
end=2010 | |
layer=1 | |
overlay=1 | |
camera=0 | |
[4.0] | |
_name=テキスト | |
サイズ=60 | |
表示速度=0.0 | |
文字毎に個別オブジェクト=0 | |
移動座標上に表示する=0 | |
自動スクロール=0 | |
B=0 | |
I=0 | |
type=4 | |
autoadjust=0 | |
soft=1 | |
monospace=0 | |
align=1 | |
spacing_x=0 | |
spacing_y=0 | |
precision=1 | |
color=1e3e8a | |
color2=ffffff | |
font=Rounded Mgen+ 1c heavy | |
text=43513a7500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 | |
[4.1] | |
_name=アニメーション効果 | |
track0=0.50 | |
track1=0.50 | |
track2=-90.00 | |
track3=-90.00 | |
check0=0 | |
type=0 | |
filter=0 | |
name=画面外から入退場@pandanote.info | |
param= | |
[4.2] | |
_name=標準描画 | |
X=36.0 | |
Y=-548.0 | |
Z=0.0 | |
拡大率=100.00 | |
透明度=0.0 | |
回転=0.00 | |
blend=0 |
これをAviUtlの拡張編集のタイムラインにドラッグ&ドロップすると以下のように量産されたテキストオブジェクトがタイムライン上に表示されます(下図)。

ソースコード
ソースコードは以下の通りです。
[2018/10/1追記] テンプレートファイルに定義されているテキストオブジェクトに中間点が設定されていた場合にそのテキストオブジェクトの中間点以降の部分しか処理されない問題を修正しました。
#!/usr/bin/env python3 | |
# -*- coding: utf-8 -*- | |
# テキストファイルを1行ずつ読み込み、exoフォーマットで記述されたAviUtlの | |
# 字幕のテンプレートに挿入して、exoフォーマットで標準出力に出力するプログラム。 | |
# Copyright 2017,2018 pandanote.info (https://pandanote.info/) | |
# This program is free software: you can redistribute it and/or modify | |
# it under the terms of the GNU General Public License as published by | |
# the Free Software Foundation, either version 3 of the License, or | |
# (at your option) any later version. | |
# This program is distributed in the hope that it will be useful, | |
# but WITHOUT ANY WARRANTY; without even the implied warranty of | |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
# GNU General Public License for more details. | |
# You should have received a copy of the GNU General Public License | |
# along with this program. If not, see <http://www.gnu.org/licenses/>. | |
# | |
# 画面サイズ、オーディオレート及びサンプリング周波数はテンプレートファイルの | |
# 設定がそのまま使用されます。 | |
# 使用法: | |
# python3 txt2exo.py <テンプレートファイル> <テキストファイル> | |
# | |
# 修正履歴: | |
# 2018/10/01: テンプレートファイルで定義されているテキストオブジェクトに | |
# 中間点が設定されていた場合に対応するためのコードを追加した。 | |
# | |
import io | |
import sys | |
import re | |
import codecs | |
from struct import * | |
from binascii import hexlify | |
# 標準出力の文字コードを変更する。 | |
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='cp932') | |
if len(sys.argv) <= 2: | |
print("Usage: txt2exo.py <template file> <text file>") | |
sys.exit(1) | |
templatefile = sys.argv[1] | |
textfile = sys.argv[2] | |
exedit = {} | |
zero = {} | |
# 現在のセクションの文字列をそのまま入れます。 | |
currentsection = "exedit" | |
originalstart = 0 | |
originalend = 0 | |
sectionsnum = 0 | |
with open(templatefile,mode='r',encoding='shift_jis') as f: | |
for line in f: | |
m = re.match(r' |
|
if m: | |
if m.group(1) != "exedit": | |
currentsection = m.group(1) | |
mm = re.match(r'^\d+$',m.group(1)) | |
if mm: | |
sectionsnum = int(currentsection) | |
elif re.match(r'[^\r\n\s]',line): | |
kv = line.split('=',1) | |
if currentsection == "exedit": | |
exedit[kv[0]] = kv[1] | |
else: | |
if currentsection not in zero: | |
zero[currentsection] = {} | |
zero[currentsection][kv[0]] = kv[1] | |
if kv[0] == 'start': | |
if (currentsection == 0): | |
originalstart = int(kv[1]) | |
elif kv[0] == 'end': | |
originalend = int(kv[1]) | |
texts = [line.rstrip('\n').rstrip('\r') for line in open(textfile,"r",encoding="UTF-8") if re.match(r'^[^\r\n]',line)] | |
print("[exedit]") | |
for k,v in exedit.items(): | |
print("{0:s}={1:s}".format(k,v),end="") | |
sectionsnum = sectionsnum + 1 | |
sectioncount = 0 | |
deltaframes = originalend-originalstart | |
startpos = originalstart | |
currentsection = 0 | |
for text in texts: | |
for k,v in zero.items(): | |
m = re.match(r'^\d+$',k) | |
if m: | |
currentsection = sectioncount+int(k) | |
print("[{0:d}]".format(currentsection)) | |
for vk,vv in v.items(): | |
if vk == "start": | |
print("{0:s}={1:d}".format(vk,startpos+int(vv))) | |
elif vk == "end": | |
print("{0:s}={1:d}".format(vk,startpos+int(vv))) | |
else: | |
print("{0:s}={1:s}".format(vk,vv),end="") | |
else: | |
sectionname = re.sub(r'^\d+',str(currentsection),k) | |
print("[{0:s}]".format(sectionname)) | |
for vk,vv in v.items(): | |
if vk == "text": | |
text_in_utf16 = hexlify(text.encode('utf-16')) | |
hex_str = text_in_utf16.decode("ascii")[4:] | |
print("text={0:s}".format(hex_str),end="") | |
for x in range(len(hex_str),4096,4): | |
print("0000",end="") | |
print("") | |
else: | |
print("{0:s}={1:s}".format(vk,vv),end="") | |
sectioncount = sectioncount + sectionsnum | |
startpos = startpos + deltaframes |
テキストを差し替える部分は以前AviUtl用のルパン三世風タイトルのタイプライターの部分だけを手軽に作るスクリプトを作ったときに使ったものを転用しています。
コツコツとした積み重ねって大事です。(`・ω・´)
まとめ
もともと別の動画の作成中に思いついたネタなのでちょっとスピンオフ的な記事になりました。
動画をたくさん作成していると、bolierplate的といいますか、定型的な字幕が大量に必要になる局面がかなりあると思いますので、そういうときには使えるものと固く信じております。
ご参考にしていただけると幸いです。
別の動画の作成作業に戻ります。(`・ω・´)
この記事は以上です。