Category Archives: C#

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

マイクロソフトの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は未公開で。

NugetパッケージのSystem.Speech がv7.0でインスタンス作成時にFailを出すようになった件。(.NET6.0にしたら治った)

Nuget package System.Speech v7.0 initialization fail on .NET5.0

無意識にNugetのパッケージをアップデートし、コンパイルが通らなくなった。常日頃から使っているSpeechを使った仕事用のアプリで使っている、Speechがv7.0からinstanceのnewで落ちる。

.NET 6.0では、System.Speech v7.0は使えている。

.NET 6.0というのがあるのでアップデートした。それで Speech v7.0は無事コンパイルできた。一瞬マイクロソフトのSpeechSynthesisの2024年を意識してのサポート切れかと思ったがまだ使えるらしい。

.NET 5.0と6.0の違いは不明。。。他のコンポーネントの様子を見ることにする。

しかし、UWPではだめのようだ。。。

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

CeVIO AI コントローラー .NET アプリページを公開

CeVIO AIのコードが使えそうになってきたのでページを公開しました。コードを公開する予定はありませんが、コードの使い方はこのブログで書いていこうと思います。

パッケージはアプリの完成度をみながら公開。あえてインストーラーは作りません。

UIはまだまだ改良の余地があるのでデザイン的なものも含めて今後アップデートしていきます。

ウェブスクレイピングが出来ると用途が増えると思うけど。どんな使い方ができるか今後追ってアップする。リアルタイムでTwitch上でアップできると編集とかしなくて時短できていいかな。

CeVIO AI コントローラー(開発中)

ご意見、用途のご相談お待ちしております。お仕事としても依頼受け付けております。よろしくお願いします。

追伸:最近はゲーム配信が出来ていない。夜中に起きてやるしかない。しかし、Twitchのチャットの自動音声返信まではまだ先が長い。

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

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