見出し画像

After EffectsでSRTファイルから一番簡単に字幕をつける方法

After Effectsのエクスプレッション機能を使って、SRTファイルから字幕を入れます。After Effects 2020で動作確認をしています。

動画に字幕を入れるのはよくあることですが、決まったやり方もないみたいなので一番簡単と思われる文字ツールに対するエクスプレッションを使った方法を解説します。

エクスプレッションを使うメリット

- ほぼリアルタイムで反映されるので別のエディタでSRTファイルを書き換えるとそのままプレビューに反映される
- プラグインなどを利用せず、一つのテキストレイヤーだけで完結する

エクスプレッションを使うデメリット

- フォントや出現位置はSRT毎にしか設定出来ないので、複数位置やフォントの場合はSRTファイルを分割する必要がある
- 文字数や改行位置など考慮してSRTファイルを生成する必要がある

設定方法

字幕を表示したいテキストレイヤーの[ソーステキスト]を右クリックして[エクスプレッションを編集]を選んで表示される"text.sourceText"を消して、代わりに下記のコードをコピペしてください。
1行目の"subtitle.txt"はプロジェクト内のSRTファイル名に合わせてください。

var subFile = "subtitle.txt"; // SRTファイル名
var typeInterval = 0.01; // タイピングの間隔 0にすると一気に表示されます

//------------------------------------
function parseSrt(line) {
    var origin = line.split(/\n/);
    var startText = origin[1].match(/^\d{1,2}:\d{1,2}:\d{1,2},\d{1,3}/)[0].replace(",", ":");
    var endText = origin[1].match(/\s\d{1,2}:\d{1,2}:\d{1,2},\d{1,3}/)[0].replace(' ', '').replace(",", ":");
    
    var subtitle = "";
    for (var j = 2; j < origin.length; j++) {
        subtitle = subtitle + origin[j] + "\n";
    }

    return {
        start: parseTime(startText),
        end: parseTime(endText),
        sub: subtitle
    };
}

//------------------------------------
function parseTime(str) {
    var hours = parseInt(str.split(':')[0]);
    var minutes = parseInt(str.split(':')[1]);
    var seconds = parseInt(str.split(':')[2]);
    var millisesconds = parseInt(str.split(':')[3]);
    var t = (hours * 60 * 60) + (minutes * 60) + seconds + (millisesconds / 1000);
    t = Math.round(t * 100) / 100;
    
    return t;
}

//------------------------------------
var lines = footage(subFile).sourceText.split(/\r*\n\r*\n/);
var text = "";

for (var n = 0; n < lines.length; n++) {
    var srt = parseSrt(lines[n]);
    if (time >= srt.start && time < srt.end) {
        text = srt.sub.substring(0, (time - srt.start)/typeInterval);
        break;
    }
}

text;

これで終了です。

私は文字起こしにTRASCってサービスを使ってみていて、これのファイルからSRTファイルを適当なスクリプトで生成しています。

このスクリプトを使った上記の動画では3つのSRTを使用していて、上のタグ部分、下のテキスト部分を二つ重ねて右寄せ左寄せて置いて話者によってSRTを使い分けています。