VoicepeakProxy は、VOICEPEAKの自動読み上げを低遅延で実現するライブラリです。
本リポジトリは、VOICEPEAKの操作を行う本体ライブラリの VoicepeakProxyCore.dll と、このライブラリを棒読みちゃんプラグインとして運用する VoicepeakProxy for 棒読みちゃん で構成されています。
- VOICEPEAKの起動済みウィンドウを直接操作することで、低遅延での読み上げを行います。
- ウィンドウフォーカスを奪わず、PC上の他の作業を阻害しないようにします。
- VOICEPEAKが他のウィンドウの背面に隠れていても読み上げできる実装にします。
- 単発APIによる読み上げ操作
- 常駐ランタイムによる複数読み上げ要求のキュー処理
VoicepeakProxyCore.dll経由での棒読みちゃんとVOICEPEAKの連携
- 音声ファイルの出力・保存
- パラメータ調整やナレーター切り替えの自動操作
- ウィンドウを最小化(タスクバーに格納)した状態での読み上げ
- Windows環境であること
.NET Framework 4.8実行環境があることvoicepeak.exeが1プロセスだけ起動していること- config内のショートカット設定(再生/停止、先頭に移動、すべてを選択、ペースト)がVOICEPEAK側と一致していること
- 本プロジェクトはVOICEPEAKおよび棒読みちゃんの公式プロジェクトではありません。
VOICEPEAK 1.2.21を前提に作成されており、バージョンが異なると動作しない可能性があります。- 実行時、操作対象のVOICEPEAKプロセス内でDLL読み込みとAPIフックを有効化します。
- ユーザー入力由来の誤動作防止、ショートカット実行時の警告音抑制、仮想クリップボード経由の文字入力を実現するため、該当するWindows APIのみ呼び出し動作を一時的に上書きし、制御します。
- 変更は実行中プロセスのメモリ上のみで、ローカルファイルは改変しません。VOICEPEAKを再起動すると通常状態に戻ります。
- Release で配布されている最新の
VoicepeakProxy-Plugin.zipをダウンロード・解凍してください。 Plugin_VoicepeakProxy.dllとVoicepeakProxyWorkerディレクトリを、棒読みちゃんの本体(BouyomiChan.exe)があるディレクトリにそれぞれ配置してください。- VOICEPEAKを起動してください。
- 棒読みちゃんを起動し、その他タブからプラグインタブを開いて
VoicepeakProxy for 棒読みちゃんのチェックボックスを有効化してください。- 起動失敗ダイアログが出た場合は無視してください。
VoicepeakProxy for 棒読みちゃんを選択した状態で右下の設定ボタンから設定を開き、UI操作・ショートカットの各ショートカット設定(先頭に移動、すべてを選択、再生/停止、ペースト)にVOICEPEAKのショートカットキー設定を写してください。- VOICEPEAK側のショートカットキー設定をデフォルトのまま変更していない場合、そのままで問題ありません。
- 必要に応じて、棒読みちゃん側設定画面
プラグイン内の自動起動設定にVOICEPEAK本体へのパスを指定してください。 - 設定が終わったらOKを押して設定画面を閉じ、棒読みちゃんを再起動してください。
- "初期化完了"の音声が流れれば初期設定は完了です。
- "初期化完了"の冒頭が途切れる場合がありますが、それ以降の読み上げは問題ありません。
- 上記初期設定の完了後は、VOICEPEAK起動後に棒読みちゃんを起動すれば読み上げ準備が完了します。
- 自動起動設定にVOICEPEAKの.exeパスを指定していれば、棒読みちゃん起動時にVOICEPEAKも自動で起動されます。
Release で配布されている最新の VoicepeakProxyCore.zip をダウンロード・解凍し、下記を参考に任意の環境で実装を行ってください。
using VoicepeakProxyCore;
var config = new AppConfig();
SpeakOnceResult result = VoicepeakOneShot.SpeakOnceWait(
config,
new SpeakOnceRequest { Text = "こんにちは。テストです。" });
Console.WriteLine($"status={result.Status} ok={result.Succeeded} segments={result.SegmentsExecuted}");using VoicepeakProxyCore;
var config = new AppConfig();
using var runtime = VoicepeakRuntime.Start(config);
EnqueueResult result = runtime.Enqueue(new SpeakRequest
{
Text = "こんにちは。テストです。",
Mode = EnqueueMode.Queue,
Interrupt = false
});
Console.WriteLine($"status={result.Status} jobId={result.JobId} error={result.ErrorMessage}");