Category Archives: ブログ

今後の音声合成・認識の方向性

マイクロソフトのOS標準Speech APIは2024年の廃止、Cognition APIはAzureで有料APIという状況なので、オープン系、パッケージアプリで対応することにする。Google APIもMSと同じく有料。

発音・認識クオリティについては高いかもしれないが、クラウド経由でスタンドアローンでは使えないので今後は使わない方向で。(音声認識したり、テキストを読むたびにクラウドにデータを飛ばすというモデルはちょっと違うと思う。スタンドアローンで両方できないとデータ漏洩してるでしょ)

現在、.NETでCeVio AIを使っているけれどまだ、MS Speechほど使い回しはよろしくない。APIをCallするときは、アプリが起動していないといけない。さらにタイミングでクラッシュすると、アプリを起動しにいくので起動時間中はさらにエラーが続く。実装モデルをもう少し調整する必要あり。

A.I.Voiceも、A.I.Voice Editor APIが公開されている。.NET COM共に使えるようだ。Win32 C++で何とかやってみたい。

音声認識は、Voskというオープン系で。Waveデータのアドレスハンドリングが結構大変なので、Pythonスクリプトベースで、JSON受け取りをPIPE経由で。

それから、Google AdmobはApp Storeの規定で、プライバシー設定でユーザーが初回起動時にユーザー情報共有の同意をしないと表示させてはいけないということになっています。中にはプライバシーをオフにしても広告が出続けているアプリも結構あるみたい。というのもこのメッセージをつけた途端広告収入は0になりました。

App Tracking Transparency(ATT) のダイアログ表示されるようにしたけれど、ユーザーはオフにするみたいですね。実際自分も全アプリオフにしてたし。最近は通知も全部オフ。

Google Admobをライブラリとしてリンクすると、Google FirebaseがDependencyとしてリンクされ、さらにコンパイル中にもネットから情報を確認しているらしく、コンパイルが通らなかったりネットからのレスポンス待ちとかで、重たい処理や情報を吸い取られている。NuGetの他のパッケージのバージョンにも影響あり。デベロッパー、ユーザー共に情報が抜き取られている。なので、Admobも入れない方向で。機能を盛り込んで育てていくうちにどこかでアプリ内課金にしていきます。広告料も入ってきたことはない。

広告も、Analytics(今はFireBase)もなんでGoogleに送らないといけないのか意味不明。自前のPHPスクリプトにユーザーアクションログだって送れるんだし。

あとは、Xamarinも2024年5月廃止なので今後はMAUIで。GitHubは未公開で。

Twitch 用 Botを作ってみる

Twitchのストリーマーがゲーム配信をしていて定期的なメッセージや、翻訳メッセージが表示されているのでどうなっているのか調べてみた。

チャットは、IRCがベース。

TwitchでBot用アカウントを作って、oauthパスワードを発行。

Readを一つのスレッドでループして、新規メッセージを読む

send, joinで接続。

参考資料

Writing a Twitch Bot From Scratch in C# (.NET Core) | by Bradley Saunders | The Startup | Medium

Speech API (SAPI)からCeVIO AI Voiceで読み上げ .NET C# 実装編

前回、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)、感情値の設定をそのまま使えるようにクラスを作り直すことにする。

(コードは完成するまでは未公開)