まえがき
VOICEROID2に文章を喋らせるには専用のエディタへテキストを入力して音声や音声ファイルという形で取り出す必要があります。しかし、この方法だけでは動画のナレーション作成やチャットやSNSの自動読み上げのような用途にとても耐えられません。
そこで巷ではVOICEROIDのエディタに自動的にテキストの貼り付けと再生ボタンの押下して喋らせるといった手段がとられることがあります。(Voiceroid Talk Plus, SeikaCenterなど)
今回はそれらと同様の手段を用いて外部ソフトウェアからのVOICEROID2の制御を試みます。
環境
VOICEROID2のエディタはC#およびWPFで書かれています。WPFのGUIを制御するためにFriendlyというテスト自動化ソフトウェアを用います。
→https://www.codeer.co.jp/CodeAndTool
→https://github.com/Codeer-Software/Friendly
開発のために用意するソフトウェアは以下の通りです。
- Visual Studio 2017 + 「.NETデスクトップ開発」オプション
- Friendly.Windows
- Friendly.Windows.Grasp
- Friendly.WPFStandardControls
- VOICEROID2
パッケージマネージャーコンソールで以下のコマンドを1行ずつ実行してインストールします。
Install-Package Codeer.Friendly.Windows
Install-Package Codeer.Friendly.Windows.Grasp
Install-Package RM.Friendly.WPFStandardControls
プログラム
VOICEROID2に一言だけ喋らせて終了するプログラムを作成します。ここで制御するエディタはバージョン2.0.5.0のものです。
もしこれ以降のバージョンでGUIの構造が変わってしまった場合、ソースコードの修正が必要になるかもしれません。
ソースコードはSeikaCenterのものを参考にしました。というかほぼ抜粋です。
→SeikaCenterの関係コード
ソースコードを以下に示します。
大層なことはしないのでC#のコンソールアプリとしてプロジェクトを作成します。
作成したプロジェクトには先に示したように、NuGetでFriendly関連のパッケージをインストールします。
まず始めにVOICEROIDエディタのプロセスを検索し、Processオブジェクトを取得します。
タイトル文字列から検索することもできますが、今回はお手軽にProcess.GetProcessesByName()メソッドを使用して実行ファイル名から検索します。
同じ名前の実行ファイルのプロセスは1つしかないだろうと仮定して、得られたProcess配列の1つめの要素を選びます。
Process[] voiceroid_processes = Process.GetProcessesByName("VoiceroidEditor");
if (voiceroid_processes.Length == 0)
{
return;
}
Process process = voiceroid_processes[0];
次にプロセスへFriendlyのDLLインジェクションを行います。以降、WindowsAppFriendオブジェクトを経由して対象プロセスの静的オブジェクトにアクセスできるようになります。
// プロセスに接続する
WindowsAppFriend app = new WindowsAppFriend(process);
続いて対象プロセスのメインウィンドウのGUIを制御するためにWindowControlオブジェクトを取得します。これはFriendlyのGUIテストの支援用パッケージであるFriendly.Windows.Graspのクラスです。
これを介してGUI部品を簡単に制御できるようになります。
テキスト入力欄と再生ボタンはともにAI.Talk.Editor.TextEditViewというクラスが持つGUI部品であるので、WindowControl.GetFromTypeFullName()でこのクラス名のオブジェクトを検索し、
TextEditViewは1つしか存在しないので1つめの要素を選んでそのツリーを取得します。
ツリー中の4番目がテキスト入力欄、6番目が再生ボタンとなります。
// テキスト入力欄と再生ボタンを特定する
WindowControl ui_tree_top = WindowControl.FromZTop(app);
var text_edit_view = ui_tree_top.GetFromTypeFullName("AI.Talk.Editor.TextEditView")[0].LogicalTree();
WPFTextBox talk_text_box = new WPFTextBox(text_edit_view[4]);
WPFButtonBase play_button = new WPFButtonBase(text_edit_view[6]);
テキスト入力欄に喋ってもらう文章を送り込み、再生ボタンの押下をエミュレートすれば声が聞こえるはずです。
// テキストを入力し、再生する
talk_text_box.EmulateChangeText("こんにちは");
play_button.EmulateClick();
0 件のコメント :
コメントを投稿