Category Archives: App Store Connect

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

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

C# WASAPI NAudioで音量レベルメーターを作る

最低限必要なオーディオレベルメーターです。緑のメーターが音量、黄色CH1,CH2がそれぞれ左右のチャンネルです。オーディオデバイスが5.1chだと黄色いメーターが6個表示されます。5.1の”.1″は5ch + ウーハーのチャンネル。ドルビーとかの映画とかでしか使わないと思われる。(ゲームでも使われるのかな)

今回は、カスタムコントロール内でデバイス選択用のコンボボックスと、プログレスバーのオーバーライド(標準のままだと時間制御が入っていて音声の反応に追いつかないので、ただの四角で対応しています)

作ったきっかけ

最近、Twitchで音楽配信をやりたくなってドラムマシン(BOSS DR-880)とKORG Gadget 2のゲーム音源を使ってサンプリング音源で遊んでたりしてます。その時に音が出ているか目で確認したくて作りました。

前にも仕事でWASAPI+D2DでOSDとかWin32で作ってたけど、C#で 名前空間を 書き直したラッパーを公開している人がいるみたいなので使ってみました。Win32C++でCOMをマスターしてれば、MSDNそのまま使えるから必要ないんだけど。時間と作業効率上の問題か。それとバグった時の…しかし人が書いたコードを理解する時間と、自分で書くのとどっちが早いかが勝負。WASAPIを書き直したこの人の労力はすごいかも。C#でWASAPI理解するなら、C++でもいいじゃん。C++だと、アプリの動作が7割早いらしいね。(Win32 + COM最強!)

配信でOBSを使うならバックグランドを淡色にすれば背景を消せるので、これでもいいといえばいい。

あとは、アニメーションを作るときのエフェクトとか合わせるときの問題か。DXならブレンディングできるし。今後の課題。今回はAudioRenderデバイス(再生デバイス)からメインボリュームと、使えるチャンネルを表示している。

AudioCaptureデバイスもモニタ出来るけれど、Captureデバイスからサブスクリプションで有効なデータを受け取るイベントを受け取ってバッファを読むようだ。これだと生データが読めるのでFFTもできそう。実際はAudioRenderをループバックして、バッファを読んでデータを表示。スペアナの表示もできるっていうことらしい。ちなみにAudioCaptureのバッファのデータは、WaveExフォーマットでステレオデータを読むのでこれまたC++の方が使い勝手がいい(Win32 APIがSDKに用意されている)気がする

ダウンロードはこちら

Gitとかは相変わらず使いにくいし、シェアする気もないのでソースはZIPでアップしておく。(ご利用はご自由ですが一切責任は負いかねますのでよろしくお願いします)

このサイトは、プログラミングの知識のある上級者向けですのでソースコードに関する不具合は環境によって書き直してください。(サイトの管理者Nは対応しません)

これをエンジンとして、ビジュアル的なエフェクトが作れればいいなと思います。

Windows 10 VisualStudio 2019 C#WinFormで作成しています。必要なNuGetパッケージはスクショのリストの通り。NuGetからNAudio周りのパッケージをDLしてください。

次は、またSPEECH APIでコマンド管理アプリを上げていこうか。OpenCVで目、口、鼻トラックもできるようになったのでそっちかな。あとは、Youtubeチャット読み上げアプリとか絡めて、VTuber用アプリとか。

自分のTwitchアプリを作っていこう。

ちなみにTwitchチャンネルはこちらです。

App Store Connect: アプリの申請の時に、「1個のローカリゼーションでエラーが発生しました」と表示される

新しいiPadや、iPhone XRがリリースされると、必須のスクリーンショットが増えていて定期的なアップデートの申請で、「1個のローカリゼーションでエラーが発生しました」と表示されます。

調べていると、メディアマネージャの設定で解決するとのことですが、App Store Connectの申請ページに「メディアマネージャで全てのサイズを表示」のリンクが表示されず、メディアマネージャが開けない状態で、エラーの対処ができない状態でした。

その後ウィンドウサイズの問題(ウィンドウサイズが狭い時はこのリンクは表示されません。改行もされず消えるだけ)と気が付いて、iPhone 5.5インチディスプレイにiPhone 6.5インチの画像を使用するというチェックを入れて、申請することができました。

正常な表示

ウィンドウの幅が狭い時

私の場合、フリーランスでアプリを作っているので問題ないですが、こんなの上司にプッシュされたらやってられませんね。(以下略)
アプリ開発は焦らず、そしてできるときに早めにやっておくのがいいでしょう。

参考までに。

XamarinでAdmobをiOS、Androidを実装

手順はこちらを参考にしました。

Xamarin.Formsでカスタムレンダラーを使って、AdMobのバナー広告を表示する(iOS/Android)

nuGetでXamarin.Google.iOS.MobileAdsを追加。Google.MobileAdsネームスペースが使用可能になる。(バージョンは常にアップデートされているので注意)

サンプルでは、iOSとAndroidでNativeレンダラーをそれぞれに作って、違うコードで書くようになっている。

ポイントは、PCLの共有部分で空のContentViewの派生クラスを作って、PCLのUI上にコントロールを配置し、レンダラーをExportからオーバーライドしている点。

iOS Nativeのコードはまだ、理解不能だけれどこういうやり方は参考になる。