2015年04月

唄詠 Ver 6.47 を公開

47「唄詠」(うたよみ)の新バージョン、Ver 6.47 を公開しました。

唄詠は、UTAU 音源を使ってのトーク(HANASU)を自動化するツールです。従来、UTAU 音源にお話しをさせるためには、UTAU 画面上での地道な調整作業が必要でしたが、唄詠を使うと、テキストスピーチソフトに文章を入力するだけでお話しが可能となり、とても簡単です。

今回のバージョンアップは不具合の修正で、話すスピードが速い場合に落ちる不具合などを修正しています。

唄詠の設定で「唄詠の最新情報・更新版を自動的に確認する」を有効にしている場合、3 日以内に自動的に今回の最新バージョンにアップデートされます。

すぐにアップデートしたい場合は、「今すぐ最新情報を確認する」ボタンをクリックすれば、アップデートを開始することができます。

これから初めて唄詠を使う方や、手動でアップデートしたい方は、下記サイトからどうぞ。
なお、唄詠は C++Builder で開発しているため、JVNVU#97910946 の影響を受けます。不正な画像データを開かないようご注意下さい。

追加情報

ユーザー様が唄詠の支援サイトを作って下さいました。音源や動画などについての情報があります。

唄詠を使用している動画をご覧になりたい場合は、ニコニコ動画で一覧を見ることができます。


C# による SAPI 5 TTS Engine COM コンポーネントの実装(不完全)

.NET Framework 4.5 C# / Visual Studio 2013 にて、Microsoft Speech API (SAPI) 5.4 の TTS エンジンのサンプルコード(テストコード)「TestUtaYomiEngine」を作成した。

不完全ではあるものの、SAPI 音声合成エンジン側の C# コードはあまり見かけないので、参考になるかもしれないと思い公開する。SAPI に限らず、C# の COM コンポーネントは少ないので、そちらの方面でも参考になるかもしれない。

逆に、アドバイス等あれば、是非とも教えて頂きたい。

本サンプルコードの挙動

本サンプルコードは、既に公開している音声合成エンジン「唄詠(うたよみ)」(Ver 6 系)の代替エンジンとして動作する。
入力された文字にかかわらず、「C:\Test.wav」(44.1kHz、16 ビット、モノラル限定)を再生する。

本サンプルコードで動く部分

以下のテキストスピーチソフトとの組み合わせで動作する。これらのアプリは恐らく、SpXXXX 系の純粋な SAPI を使用しているものと思われる。
  • SofTalk
  • TextToWav
  • 棒読みちゃん(フォーマット変更エラーが表示されるが再生は可能)

本サンプルコードで動かない部分

.NET Framework の SpeechSynthesizer クラスを使用しているテキストスピーチソフト(ゆっくり MovieMaker など)との組み合わせでは動作しない。

使い方

  • Ver 6 系の唄詠をインストールし、テキストスピーチソフトと組み合わせて正しく動作することを確認する。
  • サンプルコードを管理者権限でビルドする。Ver 6 系の唄詠エンジンの代わりに、ビルドしたコードが登録される。
  • 44.1kHz、16 ビット、モノラルの WAVE ファイル(UTAU 音源の原音 WAVE を使うと良い)を C:\Test.wav に保存する。
  • テキストスピーチソフトで唄詠音源でしゃべらせると、サンプルコードが動作し、上記 WAVE が再生される。
  • 唄詠以外のソフトのベースとして使う際は、必ず Guid を変更すること。

ダウンロード


ライセンス


関連記事


更新情報

  • 2015/11/21 ダウンロードリンクが切れていたので、サルベージして再公開

次期唄詠デバッグメモ(COM サーバー編)

前回のエントリに書いたように、.NET の SpeechSynthesizer クラスから新唄詠を使おうとすると使えないので、その原因を探っていく。引き続き、massao さんの支援をいただいている。

そもそも、使えないというのはどういうことかというと、クライアントアプリ(テキストスピーチソフト)が SpeechSynthesizer.SelectVoice を唄詠音源指定で呼びだした際に、
ArgumentException:音声を設定できません。一致する音声がインストールされていないか、または音声が無効になっています。
という例外が発生する。

クライアントが SelectVoice を呼ぶと、恐らく別スレッドが起動し、その中で、COM サーバーである唄詠が生成される。生成後、本来であれば SetObjectToken が呼ばれるのだが、これが呼ばれない。今回はその状況をメモとして整理する。

そもそも、SelectVoice された際の新唄詠の動きを、COM サーバーと言って良いのかは不明だ。

現行(Ver 6.xx 系列)の唄詠は C++ で開発しているので、おそらく普通に COM サーバーとして振る舞っている。新唄詠も、SAPI として使われている場合(動作する 3 種類のテキストスピーチソフトから使われる場合)は、QueryInterface に応答しているので、COM サーバーとして振る舞っていると思われる。

しかし、新唄詠が SelectVoice された際は、コンストラクタが呼ばれた後に QueryInterface が呼ばれない。新唄詠も SelectVoice も両方 .NET Framework なので、COM の手順ではなく、名前と型による制御になっているのかもしれない。

とりあえず、現時点でできることは、コンストラクタが呼ばれる際のコールスタックを追うくらいなので、それを整理する。何故か、うちの環境ではコンストラクタが 4 回呼ばれる。登録されている唄詠音源が多いほどコンストラクタも多く呼ばれるが、登録されている唄詠音源は現在 3 つなので、ぴったり数が一致するわけでもないのが謎だ。

ともあれ、コンストラクタが呼ばれたときのコールスタックは以下。

TestUtaYomiEngine.dll!TestUtaYomiEngine.TestUtaYomiTTSEngineObject.TestUtaYomiTTSEngineObject() 行 160    C#
[ネイティブからマネージへの移行]   
mscorlib.dll!System.RuntimeType.CreateInstanceSlow(bool publicOnly, bool skipCheckThis, bool fillCache, ref System.Threading.StackCrawlMark stackMark) 行 5568    C#
mscorlib.dll!System.Activator.CreateInstance(System.Type type, bool nonPublic) 行 206    C#
mscorlib.dll!System.Activator.CreateInstance(System.Type type) 行 147    C#
System.Speech.dll!System.Speech.Internal.ObjectTokens.ObjectToken.CreateObjectFromToken<object>(string name)    不明
System.Speech.dll!System.Speech.Internal.Synthesis.VoiceSynthesis.GetComEngine(System.Speech.Synthesis.VoiceInfo voiceInfo)    不明
System.Speech.dll!System.Speech.Internal.Synthesis.VoiceSynthesis.GetProxyEngine(System.Speech.Synthesis.VoiceInfo voiceInfo)    不明
System.Speech.dll!System.Speech.Internal.Synthesis.VoiceSynthesis.ThreadProc()    不明
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart_Context(object state) 行 74    C#
mscorlib.dll!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool preserveSyncCtx) 行 581    C#
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool preserveSyncCtx) 行 531    C#
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state) 行 520    C#
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart() 行 111    C#


それぞれの関数が返ってきた直後の EAX を見て、関数が成功しているかどうかを判定してみると(0 以外なら成功していると判定)、

CreateInstanceSlow→成功(0x0252153C)
CreateInstance(Type, bool)→成功?(0252153C のまま)
CreateInstance(Type)→成功?(0252153C のまま)
CreateObjectFromToken→成功?(0252153C のまま)
GetComEngine→失敗
GetProxyEngine→失敗

CreateObjectFromToken は成功しているとはいえ、「instanceValue as ISpObjectWithToken」のキャストに失敗しているフシがある。CreateObjectFromToken が想定している ISpObjectWithToken と、新唄詠が実装している ISpObjectWithToken は、名前が同じでも、型が違うと見なされているのではないか。

ICustomTypeProvider で型の偽装をしようかとも思ったが、実装が悪かったのか、キャストの際に ICustomTypeProvider.GetCustomType() が呼ばれなかった。

次期唄詠デバッグメモ(Visual Studio 編)

.NET 版としてリニューアル開発中の次期唄詠だが、依然として苦戦している。

2 週間前よりは状況は改善し、棒読みちゃん・SofTalk・TextToWav の 3 つで動作するようになったが(棒読みちゃんのチャンネルエラーは出るが)、ゆっくり MovieMaker で相変わらず動かない。

動く 3 つのテキストスピーチソフトは、内部的に(おそらく)SAPI を使用している。しかし、ゆっくり MovieMaker は、内部的に SAPI ではなく .NET の SpeechSynthesizer を使用している。

SpeechSynthesizer は SAPI 互換のはずなのだが、なぜ動かないのか。massao さんの多大なるご支援をいただきながら、現在調査中。

.NET の内部を深掘りする必要があり、まずは、そのための Visual Studio の使い方を整理。

.NET Framework の中へステップイン

[VS2010]デバッグ時に.Net Frameworkのソースコードへステップインさせ、アセンブラのコードを表示させるのブログを参照して、Visual Studio 2013 のオプションを設定する。

[ツール→オプション]メニューの中の、デバッグ→全般にて、「.NET Framework ソースのステッピングを有効にする」にチェックを入れる。

COM サーバー(新唄詠エンジン)のコンストラクタ中でブレークさせた場合、デフォルトだと呼びだし履歴が表示されないが、これにより、呼びだし履歴(コールスタック)を見ることができるようになる。

.NET Framework の中も、逆アセンブル状態ではあるが、一応実行を追えるようになる。ただ、うちの環境だと、なぜかステップ実行ができず、1 行 1 行ブレークポイントをはって実行する必要が……。

関数へのステップイン

逆に、テストアプリ側からデバッグを進めたい場合は、.NET の関数を呼んでいる場所で、Shift + Alt + F11。なぜかうちの環境だとメニューに無いが、「関数へのステップイン」。ステップインできる関数の一覧が表示され、クリックすると、.NET Framework の関数であってもその中に入り込んでいける。

逆アセンブル状態でのデバッグ

[デバッグ→ウィンドウ→レジスタ](Ctrl+Alt+G)でレジスタの内容を閲覧できる。

関数の戻り値は EAX レジスタに格納される。呼びだし先関数(値を返す方)でも、呼びだし元関数(値を受け取る方)でも、どちらでも EAX を見れば良い。

settings.db では AQUOS PAD はテザリングできなかった話

Xperia は、root 化不要で MVNO テザリングができるという話が載っていた。
adb shell で settings.db を書き換えることにより、root を取らなくても、テザリング時の APN 変更を阻止できるという内容。

AQUOS PAD(SH-08E)でもできるかな? と試してみたが、ダメだった。

そもそも、adb shell(コマンドプロンプトから adb shell で起動)で
settings get global tether_dun_required
とすると null が返ってくるので、値自体が存在しないことが分かる。

それでも、ものは試しと、
settings put global tether_dun_required 0
settings put global tether_message_required 0
settings put global invisible_apn_required 0
settings put global invisible_tether_apn_required 0
あたりを入れてみたが、ダメだった。

settings.db の中身を見られれば、それっぽいキー名を探せるかとも思ったが、settings.db があると思われるパス(/data/data/com.android.providers.settings/databases/settings.db)には読み取り権限すらない模様。

/system/framework/services.odex を修正する方法により、シャープ機で MVNO テザリングできたという話があるので、今度試してみようかな。

ルーター換えたら DHCP 接続にするのがいいのね

無線 LAN ルーターを買い換えたくなったので、早速購入。これまでの 11n AtermWR8370N(STモデル) から、11ac AtermWG1200HP へ。

Atermサイズ比較パッケージを開けて、筐体サイズの小ささにびっくり。右の写真で白いのが昔の WR8370N、黒いのが新しい WG1200HP。

Aterm 同士のリプレースだから、何の問題もなく行けるだろうと思ったら、そうでもなかった。

Wi-Fi はすぐに繋げたが、なぜか有線 LAN が全然繋がらない。有線でつないだ PC から aterm.me にすらアクセスできない。

普段、有線 LAN は固定 IP アドレスで運用しているが、DHCP にしたら繋がるようになった。今まで IP アドレスは 192.168.1.x だったが、WG1200HP のデフォルトは 192.168.10.x になっていたのが原因。WR8370N 時代からデフォルトは 10.x だったのかもしれないが。

無線 LAN では、AQUOS PAD が無事に IEEE802.11ac で接続できて、リンク速度がこれまでの 65Mbps から 390Mbps に大幅アップ。


無線 LAN ルーター買い換えようか(11ac に)

Wi-Fi ルーターを買い換えようか考え中。11ac にしようかなと。

現在使用している無線 LAN ルーターは NEC の AtermWR8370N(STモデル)。IEEE802.11n 対応(2.4GHz 帯のみサポート)の最大 300Mbps 通信。パターン別のリンク速度は以下のようになるはず。

MIMO ストリーム数\チャネル幅20MHz40MHz(デュアルチャネル)
1 ストリーム72Mbps150Mbps
2 ストリーム144Mbps300Mbps

主な無線 LAN 子機は、使用頻度順に、AQUOS PAD SH-08E(タブレット)、PowerShot S120(デジカメ)、Let's note J10(ノートパソコン)。以前の実験結果からの推測を含むそれぞれの無線 LAN スペックは、

【AQUOS PAD】
  • 802.11n / ac 対応(2.4GHz/5GHz、詳細不明)
  • 11n 接続時は、MIMO 1 ストリーム、チャネル幅 20MHz?
  • 実際の 11n 接続時のリンク速度は常に 65Mbps

【PowerShot S120】
  • 802.11n 対応(2.4GHz 帯のみ、詳細不明)

【Let's note J10】
  • 802.11n 対応(Intel Centrino Advanced-N + WiMAX 6250、2.4GHz/5GHz)
  • 11n 接続時は MIMO 2 ストリーム、チャネル幅 40MHz
  • 実際の 11n 接続時のリンク速度は最大 300Mbps(以前はシングルチャネル設定になっていたのを修正)

というわけで、11ac の恩恵を受けるのは AQUOS PAD だけではあるのだが、一番 Wi-Fi を使うのに遅いので、これだけでも改善されるなら、いいかもしれないと思って。

11ac では MIMO 1 ストリームの場合のリンク速度は以下のようだ。

20MHz40MHz80MHz
リンク速度104Mbps?200Mbps433Mbps

11n ではチャネル幅のサポートは 20MHz のみが必須だったが、11ac は 80MHz まで必須となるので、リンク速度が一気に 433Mbps にアップする可能性があり、一気に 7 倍近い速度に。もちろん実際の電波状況によるが……。

というわけで、11ac のルータを買う方向で検討中。

【参考リンク】

次期唄詠の状況整理

現在リニューアル中の次期唄詠について、現在の状況を整理。一言で言うと、あまり芳しくない。

以下、各テキストスピーチソフトと組み合わせた次期唄詠の状況。

with 棒読みちゃん

一応話せるが、チャンネル数変更失敗のエラーが表示される。

唄詠側で通知しているつもりのチャンネル数が、きちんと棒読みちゃん側に伝わっていない模様。恐らく、システムの中枢に関わる根深い問題で、解決には時間がかかりそう。

with SofTalk

操作はサポートされませんというエラーが表示されて話せない。

SofTalk 作者様が、SofTalk の AssemblyCompany に URL があるとこのエラーが発生することを突き止めて下さったが、なぜ唄詠との組み合わせでこうなるのかは不明。こちらも解決には時間がかかりそう。

with ゆっくり MovieMaker

音声合成に失敗しましたというエラーが表示されて話せない。

どうやら、SpeechLib を使っているテキストスピーチソフトだと話せて、SpeechSynthesizer をテキストスピーチソフトだと話せないようだ(YMM は SpeechSynthesizer)。こちらも解決には時間がかかりそう。

with TextToWav

現時点で唯一、問題なく話せる。

月別アーカイブ
記事検索
最新コメント
  • ライブドアブログ