voiceroidってあるやんか、
まさにうちらそのものだよね。
aviutlで動画編集してると、このvoiceroidの読み上げから保存、編集ソフトに配置までの流れを自動化したくならへん?
気持ちは分かるけど、そのためのvoiceroid utilじゃないの?
そうなんやけど、これを使うにしても一々テキストを入力して保存ボタンを押すのはちょっと面倒やん?
そうなの?
例えばこんな感じに大量のテキストがあったときに、それを一文ずつテキストボックスに入れて保存してって繰り返さなあかんやん。
これをプログラムを使って自動化できたらめっちゃ楽できると思わへん?
あー、確かに。
でもvoiceroidってAPIとかあったっけ?
うーん、それについては調べてみたんやけど、ないみたいやねん。
voicevoxとかはあるみたいやけど…
じゃあムリでは?おとなしく手作業でやろうよ。
この文章の量を忘れんといてな。
ちなみにこれ、氷山の一角でホントはこれの5倍くらいあるで。
でも他に方法もないみたいだし…
葵、この存在を忘れちゃあかん。
キー操作自動化ライブラリの存在を。
キー操作自動化って…Autohotkeyとか?
せやな、他にもpyautoguiとか色々あるで。
というわけで今回はキー操作自動化ツールを使って動画編集をめっちゃ効率化していくで。
まずはこのvoiceroid utilの仕様について話すわ。
こんな感じでvoiceroidのアプリが立ち上がっていることを前提に、
キャラクター名を選択した状態で何らかのテキストをここに入力。
その状態で右下にある音声保存を押すと音声が自動で保存されるし、自動的にそれが編集ソフトに送られるわけやな。
実際にタイムラインを確認するとこんな感じで自動で音声が配置されてるし、
psdtoolkitなんかと組み合わせると字幕の配置までも自動化されるっていうのが基本仕様。
こうして聞いて見ると元々の時点でかなり効率化されてるんだね…
さらにこれを効率化していくで~。
今回はサクッとpythonでこれを実装していくわ。
あ、python使うんだ。
とにかくシンプルイズベストやな。
まずは必要なライブラリのimport。
今回、キー操作自動化にあたってpyautoguiと、ウィンドウの取得のためのpygetwindowを使うで。
そして最後にpyperclip。
え、pyperclipって言ったらあのクリップボードを操作するやつ?
めっちゃ関係なさそうだけど。
これが必要な理由については後で話すわ。
次にウィンドウをアクティブにするための関数を定義。今回はvoiceroidutilが必要やからこれは必須やな。
アクティブにする対象のアプリは、この関数の引数であるappとしよう。
これを変数に格納して、gwモジュールのgetWindowsWithTitle関数を使ってアプリのタイトルからウィンドウを定義。
ここで定義されたwindowsが配列であることを考慮して、一つ目の要素を取り出し。
基本的にはこのwindowのアクティブ化にはactivate関数を使うことになるんやけど、
今回はアプリサイズの最小化を行うminimize関数と復帰を行うrestore関数の2つで実装。
何でそんな回りくどいことしてるの?
実はactivate関数、何故かvisual studio codeのデバックモードでは実行してくれへんみたいで。
環境によるのかもしれへんけど、投稿者はこの関数はあんまり使わへんのよ。
ふーん…
以上でアクティブ化を行う関数の定義は終了。続いて音声の出力を行うメインの関数を作っていくわ。
とりあえず、出力するstring形式のテキストと、キャラクター名を引数に設定。
try文を使って、
try文?
この事情については後で話すわ。まずはボイスロイドのアプリをアクティブ化。
ここにはアプリ名を指定しよう。
続いてこのボイスロイドのアプリの座標を取得して変数に格納。
アプリの座標を取得するための関数getAppPositionが未定義やから作っていくわ。
それがこんな感じ。アプリの名前を引数として、アプリの座標を表したリストをreturnする感じでええかな。
ここでエラーが発生した場合の処理もやっておこう。
これって要はボイスロイドのアプリが立ち上がってないってことだよね。
基本的にはそうなんやけど、ボイスロイドのアプリって厄介なことにアスタリスクマークがつくことがあんねん。
え、なにその仕様。
ということで、それに対応するためのtry文ってわけやな。
以上がボイスロイドのアプリのアクティブ化の定義。続いてキャラクター名の選択をやっていこう。
要はこのキャラクター名の部分をクリックする動作ってことだよね。
せやな、さっき格納したボイスロイドのアプリの座標を使ってMoveTo関数でカーソルを移動して、
click関数でマウスのクリックをシミュレート。
この引数の数値charを変えれば他のキャラクターにも設定できるようにしておこう。
この56ってなに?
おぼろげながら浮かんできたんよ、1キャラクターあたりのy方向のピクセル数が。
マジックナンバーだらけだ…
でも動くからええやろ。
同じように、voiceroidutilのほうもアクティブ化してシミュレートしてみよう。
さっきと同じようにアプリの座標を取得して変数に格納。
ここではテキスト欄にカーソルを合わせる部分をシミュレートして文字入力を自動化。
アプリの左上を基準にx方向に100、y方向に150いったところにカーソルを合わせて、
その部分をクリックしてテキスト入力の準備を実行。
続いてクリップボードにテキストを保存。
どういうこと?
これからテキストボックス内に文字入力を行っていくんやけど、それをクリップボードを介して行うってことやな。
pyautogui側にもtypewrite関数はあんねんけど、日本語入力はできひんみたいやからこれが一般的やな。
それでpyautoguiを使ってるのね…
続いてhotkey関数を使って同時押しをシミュレート。まずは元々ある文字を全て選択。
コントロールとaキーの同時押しってことね。
せやな、続いてそれを削除したら、コントロールとvキーで貼り付けて、さらにコントロールとsキーで保存。
保存に少し時間がかかるから、sleep関数で少し待機。
試しにこの関数を使ってテキストを保存してみるで。
引数に適当なテキストを入力して保存しよう。
試しにこれを使うと、入力から保存までの流れを一瞬で行うことができるな。
もちろんタイムライン上にちゃんと音声とテキストが配置されてるし、
表示もOKやな。
これはだいぶ時短になるね。
これを置き換えて他の文章でも試してみよう。
こんな感じでもちろんちゃんと保存できてるな。
で、おそらくこれが最も真価を発揮する使い方が、複数のテキストを順番に出力することやろうな。
こんな感じで2つのテキストの出力を試してみると…
こんな感じで連続でテキストを出力できんねん。
ちゃんとタイムライン上にも2つクリップがあることが分かるな。
結構便利そうだね。
こんな感じでvoiceroid動画の編集をある程度効率化することができんねん。
で、これを応用するとこんな感じの長いテキストでも改行で分割してさっきの関数を連続で発火させることで、自動で音声の入力と保存ができんねん。
キー操作自動化って結構便利なんだね。
せやねん、他にもいろんな使い方があると思うわ。
みんなも自動化スクリプトを書いて動画編集をササっと終わらせよっ!
今回の動画はこれでおしまい。
それじゃあ、
バイバーイ!
バイバーイ!