【Vegas】タイムライン上の全てのテキストイベントのテキスト内容だけ抽出するスクリプト【C#】
動画編集ソフトのVegas Proですが、このソフトにはスクリプト機能が入っていて、買った時点で20種類くらいスクリプトが入っています。「バッチレンダリング」もそのひとつ。
たぶん動画を作るほぼ全員がそうだと思いますが、ここ数年で字幕と音声が必須みたいなもんですから、つまり動画制作ではVegas Proの字幕テキストと音声読み上げソフトとの連携が欠かせない状況です。
動画作成の手順として2通りあると思います。
- 音声読み上げソフトでテキストを作ってから、動画編集ソフトで音声データを基にテキストイベントを作っていく。
- 動画編集ソフトで動画に合うテキスト内容を考え、テキストイベントを作っていき、音声読み上げソフトでテキストを読ませる。さらに動画編集ソフトに戻り、音声データをテキストイベントに合わせる。
(手順を文字化してわかりましたが、私のやり方って面倒なのかも。でも手順1.って動画編集中にテキスト変更したくなったら都度WAVを追加作するので作業時間は結局同じになるんだろうと思う。
私は手順2.なので、Vegasで作業を一旦完了してテキスト内容も確定してから、音声読み上げソフトにテキストを読み込ませます。
ここで面倒なのがテキストの吸い出し。テキストイベントが100個あったら「テキストイベントnを開く→テキストをコピー→Notepadに貼り付け→・・・ループ・・・」を100回やらなきゃいけません。
この単純作業をスクリプトでどうにかしたい。ってわけです。
なんか有料プラグインでvegasaurというものが存在するのですが、テキストを吐き出すだけで$99.00とかふざけてる値段なので自分で作りました。実際は機能が沢山入っているみたいです。
Exporting text media from timeline to text file for Vegas Pro Scripting.
スクリプト
GitHubに公開しています。バイナリも公開してありますのですぐ使いたい方はbin\ExportTextList.DLLをダウンロードして以下のフォルダのどこか1つにDLLを置いて下さい。どれでもOKらしいです。
https://github.com/christinayan01/VegasExportTextList
C:\Users\%username%\Documents\Vegas Script Menu\ C:\Users\%username%\AppData\Local\Vegas Pro\17.0\Script Menu\ C:\Users\%username%\AppData\Roaming\Vegas Pro\17.0\Script Menu\ C:\ProgramData\Vegas Pro\17.0\Script Menu\ C:\Users\%username%\AppData\Local\Vegas Pro\Script Menu\ C:\Users\%username%\AppData\Roaming\Vegas Pro\Script Menu\ C:\ProgramData\Vegas Pro\Script Menu\
あとはVegas Proを起動すればスクリプトに「ExportTextList」というのが増えています。
名前をつけてテキスト形式で保存すればOKです。
スクリプトを使いたいだけの方はここで終わりです。バグなどあればフィードバックお願いします。
作ってみよう
C#かJavascriptが使えるとのことで、C#にしました。
APIや仕様書
APIが超不親切でほぼ参考になりません。見ないほうがマシ。(いいすぎ)
もう、あれです。デバッグしてウォッチで構造体を漁りまくったほうが理解時間の短縮になります。
・DOWNLOADS – VEGAS
下準備
お決まりのプログラム。これは最低限必須とのこと。
namespaceは自由です。
まず、Visual Studioあたりで新規プロジェクトを選択して、C# ライブラリを選びます。
そしたらEntryPointクラスをPublicで作り、その中にPublicのFromVegas(Vegas vegas)関数を作ります。
usingのライブラリは自分で参照を追加します。
[参照]で、Vegas Proのインストールフォルダ(普通にインストールすれば「C:\Program Files\Vegas Pro 17.0\>になるかと思います。)の中にScriptPortal.Vegas.dllがありますので、これを開きます。するとScriptPortal.Vegasが参照できるようになります。
using ScriptPortal.Vegas; namespace hoge { public class EntryPoint { public void FromVegas(Vegas vegas) { // ここにブレークポイントを置くとスクリプト選択後に来ます。 } } }
ScriptPortal.Vegasは、Vegasのインストールフォルダに入っている「ScriptPortal.Vegas.dll」をVisual Studioの[参照]から選ぶと利用可能になります。
起動アプリをVegas17.exeにします。
デバッグ開始して、Vegasが起動したら、メインメニュの[ツール]→[スクリプトの作成]を開くと、自分のnamespace名が増えていると思います。
するとブレークポイントに止まります。
プログラムと変数の用語
まず理解せねばならないのは、プログラムの構造体や変数名がVegasの画面のどこを示しているのか。ってことです。ざっくり言うとこんな感じでした。
Project
└Tracks ・・・中にTrack型の配列がある
└Track.Events ・・・中にTrackEvent型の配列がある
└TrackEvent ・・・中にTake型の配列がある
└Take.Media ・・・ここにビデオか、オーディオか、テキストがある
- Project
- Track
- TrackEvent
- Take.Media
全体のデータ
アプリ本体の名称やバージョン、言語やオプション設定などが入っています。
プロジェクトファイル名とか、プロジェクトの解像度、フレームレートや各種設定、一時保存フォルダの絶対パスなんかもここです。
黄色
「タイムライン」と言ったほうがわかりやすいでしょう。
現在指しているカーソル位置とか、範囲選択中のときは、開始点、終了点のタイムが取れたりします。
ピンク色
細長い1列1列のことです。大きく[ビデオ]か[オーディオ]に区分されます。
Takesという変数名で各イベントを配列で保持しています。
青色
タイムライン上に乗っているテイクと呼ばれるメディアです。
我々はこれを置いたり・移動したり、トリムしたりしているわけですね。
Media、これが今回取得したい獲物ですね。この中のどこかにテキスト情報が入っているはずだぞ、と。
MediaのTypeでどういう種類であるかがわかります。
しかし! ここで動画も静止画もテキストも全部 Type = Video というトラップ。一応、FilePath変数を見て「タイトルとテキスト」で始まる文字列になっているやつがテキストだということだけわかる。詰んだ。
ここでググってみると、スクリプトでテキストイベントを自動配置するソースコードはいっぱい出てきます。つまり我々のやりたいことの逆です。
これを見る限りではMedia変数がテキスト情報を絶対に持っていることは確実だと言えます。でも、どこ?
テキストイベントのテキスト内容の抽出
こいつで詰みかけました。まじで面倒。
テキストが入っているMediaの構造体の中を片っ端から見てみましたが、生データらしき場所に「{rtf{/~~~}」なんて書いてあります。文字らしきものがエスケープされている様子。嫌な予感。たぶんこれです。
つまり、OFXEffectプラグインを使用してRTF形式のリッチテキストで格納しているのです。従って普通にデバッグしてたり、公開APIリファレンスを読んでも絶対見つかりません。
さらにググっても殆ど情報が見つからなかったのですが、RTFをプレーンテキストに変換する例を教えてくれている神様がいたので、そのソースを参考に作ることができました。
手順はちょっと面倒ですが、一旦この生データを素直にRTF形式のファイルとしてSystem.IO.StreamWriterで出力します。
次にそのRTFファイルをSystem.Windows.Forms.RichTextBoxで読み込むとプレーンテキストになっているので、それをString型として使います。
この一連のファイルの読み書きは、Project構造体に入っている一時保存フォルダの絶対パスvegas.Project.Video.PrerenderedFilesFolderで行うのがよいでしょう。
こういうの業務向けソフトあるあるなんですよねえ。アプリケーションの柔軟性を一気に高められますからそりゃあ使うんですけど、一見さんお断りなプログラムになりがちに陥ります。Vegasもかよ、って思いました。
完成
例えばこんな感じであっちこっちにテキストイベントが置かれているとします。ビデオトラックやオーディオトラックが混ざっていても構いません。
すると、こんな感じでテキストが出力されます。
[1:torakku1] 1-1とれたかな [2:-] 2-1うんぽ 2-2うんぽ [3:トラック3] 3-1うんぽ [4:-] 4-1うんぽ [5:びでお5] 5-1うんぽ
ソースコード
全文載せておきます。
参考サイト
・DOWNLOADS – VEGAS
・C#でrtf文字列をテキストに変換する方法 – 366 SERVICE
・Scripting Changes to OFX Parameters – VEGAS Forums
・How to generate text in scripting? Vegas Pro – CREATIVE NOW
・Add clip to timeline – DESIGN STUDIO SCHOOL
・Script to insert text media events? – VEGAS Forums
・VegasScripts/Scripts/SelectAllRightOfCursor.cs @evankale – GitHub
・Download – Vegasaur
1 thought on “【Vegas】タイムライン上の全てのテキストイベントのテキスト内容だけ抽出するスクリプト【C#】”