前回、CeVIO AIがSAPIではSelectVoiceした時点でエラーが出る件の続き。(SAPIでの読み上げは断念)
仕組みとしては、CeVIO AIでインストールされるDLL (CeVIO.Talk.RemoteService2.dll)から.NETアセンブリとしてAPIをコールする。APIコールからCeVIO トークエディタをプロパティ付きで起動してアプリから読み上げ(Speak)をする。できればDLLのAPIからアプリの起動なしで読み上げしてほしかった。(UIとか.NETとかメモリ食いでCPUパワーを使ってしまう)
さて置き、実装は単純なのでSAPIの部分を置き換えて、両方使えるようにするのがメインの作業。
CeVIO AIをC#から読み上げるサンプル
インストールされているボイスはSAPI経由でGetInstalledVoicesで取ってくるサンプルがあるけれど、レジストリに登録されているボイス名とCastに設定する名前は一致していない。
SAPIに登録されるボイス名は、弦巻マキ、スターターパック(日本語、英語)の場合、CeVIO-AI-弦巻マキ(英語)とCeVIO-AI-弦巻マキ(日本語)(SAPI用レジストリ)。Castに設定する名前は、弦巻マキ(英)と弦巻マキ(日)。setting.cfgファイルに記述あり。しかし英語のsetting.cfgファイルは英語表記されていて、CeVIO DLLに含まれるAPI AvailableCastsのリストも一致しない。
.NETアセンブリとして登録する、dllの参照の追加元はC:\Program Files\CeVIO\CeVIO AI\CeVIO.Talk.RemoteService2.dllから。(CeVIOのサイトでは再配布はしないでねと書かれているので注意)
やってみて思い出した。メインにしたアプリが.NET COREで、CeVIOのサイトには明確にサポート外。これで30分くらい悩む。(参考にさせて頂いたサイト のコードのActivateでエラーが消えず)
結局.NETアプリで常駐するコマンドアプリにする。CMDバージョンと、Formバージョンで試作。すでに起動中の時にはIPC経由でイベントを発生させて文字列を渡してプログラムを抜ける。FormバージョンはUIにテキストを設定して読み上げボタンイベントを発生させる。
しかし、CeVIO自身の実装はいたって簡単。一度に読み上げる文字列の長さが200文字の制限以外はSAPIほど初期化の処理がすくなくて快適。逆に.exeにアセンブリを実装する前にファイルチェックをしたうえでAssemblyをコード上からインポートして実行する必要がある。これをやらないと、トークエディタがインストールされていないマシンではアプリは走らない。。。マイクロソフトのSAPIとも共存したい。
twitch, YouTube チャットを読み込んで自動応答してBotに使用。マイクロソフトの音声認識はもうちょっと制度を上げてほしい。認識精度悪すぎ。登録単語モードはほぼほぼつかえない。フリーワードモードは自由度高すぎで発音した単語が正しく認識されることはまずない。
とりあえず、SAPIでCeVIOがインストールされている時はVoiceCallCmd.exe、VoiceCallForm.exeを読み上げ文章をつけて実行する。今のところメールチェック、メールのタイトルの読み上げ、処理状況の読み上げはいつも通り読めている。
読み上げ中の場合は、読み上げテキストをキューに設定して、キューがなくなるまで繰り返す。
VoiceCallForm.exeには各種パラメータをつけて感情表現をできるようにする。その前に参考にさせてもらったサイト のコードは他のボイスエンジンとの互換性の為に、クラスにはAPIがすべて網羅されていないのでパラメータの数値(0-100)、感情値の設定をそのまま使えるようにクラスを作り直すことにする。
(コードは完成するまでは未公開)