見出し画像

[Ae/Pr]大量のテロップを条件に合わせて整形して作る方法

テロップや字幕を作る方法としては、

動画を見ながら文字起こしする必要があるもの
→ Premiereで直接入力

あらかじめスプレッドシートなどでテキストがある
→ PhotoshopのデータセットでテロップごとにPSDを生成し、タイミングを合わせて配置する

辺りがメジャーなやり方かと思います。
今回は作りたいテロップが、

1. スプレッドシートにテキストデータがある
2. 一度で複数行表示したいテロップがあり、位置は下端合わせにしたい
3. 文字数が多い場合は縮小して、はみ出ないようにしたい
4. テキスト内容によって文字色やサイズを変えたい
5. テロップの幅に合わせた座布団を敷きたい

テロップ_1

という条件で、Photoshopのデータセットを使う方法だと、2〜5はかなり難しく、手作業で調整することになるかと思います。
これを『After Effectsのエクスプレッションで整形し、テキスト内容はTSVを読み込ませて反映し、そのレイヤーが大量に入ったコンポジションで「フレームを保存」することでPSDを作り、それをPremiereで「個別のレイヤー」として読み込み配置する』というやり方で、自動化することができたので紹介します!

【2020/05/31 追記】
アップルパイさんよりコメントをいただき、レイヤーが分かれたPSDとして保存して読み込むより、1フレーム毎に内容が変わる構成にして、連番PNGとして保存した方が汎用性が高いので、そちらを追記しました。

今回作るテロップ

スクリーンショット 2020-05-28 22.36.26

太宰治の「走れメロス」のセリフで、テレビの字幕風のテロップを作っていこうと思います。

テロップを1つ作る

Photoshopで作成して読み込み「編集可能なテキストに変換」するか、Ae上で作成します。

画像2

テロップの幅に合わせた座布団をエフェクトで敷く方法

今回の手法は、1テロップ1レイヤーで作れると取り回しが良いので、半透明の黒い座布団はエフェクトで敷きます。

スクリーンショット 2020-05-29 0.47.11

画像4

これで文字が増えても座布団の幅を合わせることができます!

画像5

スプレッドシートのテキストに変更するエクスプレッション

スプレッドシートからCSVもしくはTSVを書き出そうと思いますが、Ae 2020は改行が含まれるCSVに対応していないようで、改行で行数が狂い、データも適切に取れなくなってしまいます…

スクリーンショット 2020-05-28 23.05.20

↑ 11が正しい

なので、CSVは使えないのですが、TSVはTSVで今度は改行がスペースに置き換えられてしまいます。

スクリーンショット 2020-05-28 23.05.39

スクリーンショット 2020-05-28 23.17.28

↑ Googleスプレッドシートで書き出すとスペースに変わる

ただ、日本語は半角スペースを基本使わないので、こちらは正規表現を使うことで何とかできそうです。
アルファベットやクォーテーション、カンマ以外に挟まれた半角スペースは、元々は改行だったと捉えて、使う直前に置き換えることにします。

データを読み込むエクスプレッションは、コンポジションに入れたTSVを開いてコピペします。

スクリーンショット 2020-05-28 23.42.44

このあとレイヤーを大量に複製して、レイヤーごとに内容を変えたいので、上から何番目のレイヤーなのかの変数indexを使います。
indexは1スタートですが、取得する方は0スタートで、かつdataValue([列,行])なのが要注意ですね…

footage("字幕 - シート1.tsv").dataValue([0,index-1]).replace(/(?![a-zA-Z"',]) (?![a-zA-Z"',])/g, '\r\n');

これをソーステキストにエクスプレッションで設定します!

スクリーンショット 2020-05-28 23.48.25

複数行でも下端合わせにするエクスプレッション

このままの状態で複数行のテキストが入ると、下に伸びていってしまいます。左右の中心もずれてしまうことがあります。

スクリーンショット 2020-05-28 23.56.39

下記の記事を参考に少しアレンジします。

アンカーポイントをテキストの中央下端にし、アンカーポイントにエクスプレッションを入れます。

スクリーンショット 2020-05-29 0.05.22

n = thisLayer.sourceRectAtTime();
[n.width/2+n.left, n.height+n.top]

これで複数行でも綺麗な位置に来るようになりました!

スクリーンショット 2020-05-29 0.12.45

指定した幅をはみ出ないように拡縮するエクスプレッション

スクリーンショット 2020-05-29 0.16.04

同様に上の記事を参考に、スケールにエクスプレッションを設定します。
はみ出るときだけ小さくしたいので、if文を使います。
今回のコンポジションは1920×1080で、90%のタイトルセーフエリアに収まるようにスケールを調整します。

n = thisLayer.sourceRectAtTime();
s = 100;
if(1920*0.9 < n.width) {
  s = 1920*0.9*100/n.width;
}
[s, s];

スクリーンショット 2020-05-29 0.32.57

テキスト部分が収まるようになりました!

【2020/05/31 追記】
下記コードで現在のコンポジションの大きさが取れるので、こちらも活用すれば、より汎用性の高い仕組みづくりができますね!

x = thisComp.width;
y = thisComp.height;

テキスト内容によって文字色を変えるエクスプレッション

山賊はピンク、メロスは水色になるように変更します。
テキストアニメーターで「塗りのカラー」「RGB」を追加し、文頭に(山賊)(メロス)が付いているかで判定するエクスプレッションを設定します。

スクリーンショット 2020-05-29 1.01.30

if(text.sourceText.match(/^(山賊)/)) {
  hexToRgb("#FF55FF")
} else if (text.sourceText.match(/^(メロス)/)) {
  hexToRgb("#55FFFF")
} else {
  [0, 0, 0, 255]
}

画像17

イイ感じですね!

テキスト内容によってサイズを変えるエクスプレッション

せっかくなら文末に「!」が付いているセリフは少し大きくしたいですね!
スケールにアレンジを加えましょう!

n = thisLayer.sourceRectAtTime();
s = 100;
if(1920*0.9 < n.width) {
  s = 1920*0.9*100/n.width;
} else if(text.sourceText.match(/!$/)) {
  if(n.width*1.2 < 1920*0.9) {
    s = 120;
  }
}
[s, s];

スクリーンショット 2020-05-29 1.12.16

収まるようであれば120%の大きさにするようにしてみました!
工夫次第でいろいろな調整ができそうです。

(旧PSD ver)テキストレイヤーを大量に複製する

【2020/05/31 追記】
この次の「新PNG ver」の方が汎用性が高いので、そちらに沿ってもらえるといいかと思いますが、細かな補足などもあるため、こちらの項目も残しておきます。

これからこのテキストレイヤーを複製していきます。
Premiereは空白のレイヤーは無視してくれるので多めに、でも100以上は読み込んでくれないようなので、100を目安に複製します。
ただ、その前にソーステキストのエクスプレッションを調整します。
このまま複製すると、TSVのデータの行数を越えてしまい、データがないのに無理に読み込もうとしてエラーが発生してしまいます。
別のコンポジションにTSVを入れておき、そこから行数を取り、超えないときだけ取得するようにします。

if(index-1 < comp("字幕データ").layer("字幕 - シート1.tsv")("データ")("行数")) {
  footage("字幕 - シート1.tsv").dataValue([0, index-1]).replace(/(?![a-zA-Z"',]) (?![a-zA-Z"',])/g, '\r\n');
} else {
  ''
}

こうしたらバッチリです!複製しましょう!
複製のやり方はCmd+D連打でも、「Utility Box」でもお好きなやり方で!

レイヤー名が逆順になっているときは一番下を選択して、その状態で一番上をShift押しながらクリックして選択して、カットペーストすることで逆順に並べ直すことができます。

スクリーンショット 2020-05-29 1.37.14

画像20

テロップができました!

(旧PSD ver)PSDとして保存

あとは「フレームを保存」すれば、レイヤーの分かれたPSDを保存できます!

スクリーンショット 2020-05-29 1.42.02

(旧PSD ver)Premiereで読み込む

個別のレイヤー」として読み込めば並べることができます。

スクリーンショット 2020-05-29 1.45.57

スクリーンショット 2020-05-29 1.51.26

(新PNG ver)1フレーム毎にテキスト内容が変わるようにする

現在の時間を取得できるtimeを使って、テキスト内容が変わるようにします。
そのためにまず、コンポジションのフレームレートを1にして、デュレーションもそれなりの長さに変更します。

スクリーンショット 2020-05-31 19.50.09

こうすることで、timeが小数点になることなくキリの良い数字になり、書き出した連番PNGも重複がなくなります。

そうしたら、ソーステキストのエクスプレッションを調整します。
timeは0スタートなのが気持ちいいですね!

if(time < comp("字幕データ").layer("字幕 - シート1.tsv")("データ")("行数")) {
  footage("字幕 - シート1.tsv").dataValue([0, time]).replace(/(?![a-zA-Z"',]) (?![a-zA-Z"',])/g, '\r\n');
} else {
  ''
}

テキストレイヤーの長さも、コンポジション終端まで適宜伸ばしましょう。

(新PNG ver)透過連番PNGとして書き出し

レンダーキューに追加し、出力モジュール設定をPNGシーケンスとして、チャンネルはRGB + アルファに変更します。

スクリーンショット 2020-05-31 20.11.29

スクリーンショット 2020-05-31 20.47.58

素晴らしい!!

(新PNG ver)Premiereで読み込む

フォルダごと入れるだけで、オプションも何もなくそのまま入りますね。
簡単!

まとめ

手作業での微調整をかなり減らすことができました!
Photoshopのデータセットは扱いが少し難しいので、Aeで作る方法だと、普段の作業の延長で作ることができ、そこも楽だなと感じました。
レイヤースタイルだけでなく、豊富なエフェクトも活かして見た目を作ることができるので、Trapcode Shineの綺麗な光や、アニメ調の液体のような近くの線とくっついた形状など、多彩な表現ができそうです。

デメリットは、

・テロップのデザインにレイヤーが複数必要なものには向かない(新PNG verなら問題なし)
・テロップの数が100を超えたときに少し気を付ける必要がある(新PNG verなら問題なし)
・テキストがラスタライズされる

くらいでしょうか?

Aeのエクスプレッションは強力ですね…!!

最後まで読んでくれてありがとうございます! 良ければサポートしてもらえると嬉しいです!