rarafy / OpenJTalkForUnity

A package for using OpenJTalk with Unity. It allows you to read out text.
MIT License
18 stars 2 forks source link

Buildしたものだと音声がでない #4

Open alice251 opened 2 years ago

alice251 commented 2 years ago

Unity 2020.3.3.11f1を使用 Unityはwindows ビルドするプラットフォームはPC,MAC&LinuxStandaloneを選択 ターゲットプラットフォームはWindows Unityのプロジェクト上では音声合成されて動作するシーンをBuildすると音声が出ない状態です。 Apiは .Net4.xに変更してます。 Buildしたものだと音声がでない原因は何かありますでしょうか?

rarafy commented 2 years ago

お世話になっております。 @alice251 様がご指摘のように、たしかにビルドすると動かなくなっていますね。夜にでも詳しい原因を調査してみます。今しばらくお待ちください。

image

rarafy commented 2 years ago

恐らくなんですが、 #1 と同様に実行時パスを直接指定すれば解決する可能性がありますね。 これも夜に確認してみます

rarafy commented 2 years ago

@alice251 様 お世話になっております。こちらの問題ですが、当面2通りの解決方法がございます。


1. Cドライブ直下に追加ファイルを置く

open_jtalk.zip をダウンロードし、Cドライブ直下に配置する。C:\open_jtalk\bin となるように配置してください。

image

2. 実行時パスを直接指定する

Streaming Assetsにファイルを含むよう設定し、 #1 と同様に実行時パスを直接指定する。(おそらく public JTalkTTS(String voicePath = "mei_happy", String dicPath = "StreamingAssets/OpenJTalkForUnity/dll/dic_utf_8", String voiceDirPath = "StreamingAssets/OpenJTalkForUnity/dll/voice") などとなるはずです。)

もしくは、ビルド後に手動でフォルダを作ってexeファイルと同階層にdicファイル(上記zipファイル内のdic_utf_8ファイル)とvoiceファイルを置くという解決方法もあります。

image


ちなみにdicファイルとvoiceファイルの判定方法については

voiceDir 音響モデルフォルダの優先順位

  1. 引数による指定
  2. カレントフォルダの設定ファイルによる指定
  3. カレントフォルダの音響モデルフォルダ
  4. 親フォルダの音響モデルフォルダ
  5. (win) 共有ライブラリのあるフォルダの設定ファイルによる指定(カレントフォルダに設定ファイルがないとき)
  6. (win) 共有ライブラリのあるフォルダの音響モデルフォルダ
  7. (win) 共有ライブラリの親フォルダの音響モデルフォルダ
  8. 標準の音響モデルフォルダ(インストールフォルダの音響モデルフォルダ) 音響モデルフォルダの名前はvoiceフォルダ、voiceで始まるフォルダ、hts_voiceで始まるフォルダの順で探す。 ※冒頭に(win)とある項目はWindows限定。

dic 辞書フォルダの優先順位

  1. 引数による指定
  2. カレントフォルダの設定ファイルによる指定
  3. カレントフォルダの辞書フォルダ
  4. 親フォルダの辞書フォルダ
  5. (win) 共有ライブラリのあるフォルダの設定ファイルによる指定(カレントフォルダに設定ファイルがないとき)
  6. (win) 共有ライブラリのあるフォルダの辞書フォルダ
  7. (win) 共有ライブラリの親フォルダの辞書フォルダ
  8. 標準の辞書フォルダ(インストールフォルダの辞書フォルダ) 辞書フォルダの名前はdic_utf_8フォルダ、dicで始まるフォルダ、open_jtalk_dic_utf_8-で始まるフォルダの順で探す。 ※冒頭に(win)とある項目はWindows限定。
    このとき辞書データがUTF-8エンコード向けかどうか、 unk.dic の先頭から40バイト目の文字列で簡単な確認が行われ、エンコードが違えば、そのフォルダに辞書は存在しないと見なす

といった順で処理が行われています。



原因は特定出来ましたが、完全な修正にはPackageManagerによる方法を廃止する必要があり、概ね1ヶ月前後を要する見込です。まずは上記の一時回避策をお試し頂けますでしょうか。

ちなみにPackage Manager(git URL)での導入が廃止されたら不便・・・ですよね。UPMにStreaming Assetsを含める方法について調査してみます。

どうしてもUPMにStreaming Assetsを含むことは出来ないようです。完全な修正に向けては

  1. ビルド後に別途ディレクトリを配置して頂くか(この場合はReadMeに追記します)
  2. UPMを廃止してUnity Packageのみでの配布

のどちらかを考えています。どちらが良いでしょうか?ご意見お聞かせいただければと思います。

alice251 commented 2 years ago

ありがとうございます。 jtalk.csの書き換えて C:\open_jtalk\binにファイルを置くのと またはexeファイルと同階層にファイルを置くどちらでも build後の音声合成での音声が出ました。 exeファイルと同階層にファイルを置くのが自分の用途には合ってました。

大変助かりました。ありがとうございます。

個人的には 、1.ビルド後に別途ディレクトリを配置して頂くか(この場合はReadMeに追記します) でいいのではないかなと思います。

たぶんこれは全然別ものの話になってしまうと思いますが スマホのandroidへのBuildはやりようによってできたりするのでしょうか?

rarafy commented 2 years ago

解決したようで何よりです。もし良ければReadMe.mdに直接追記しておいて頂けると助かります(たった数クリックでOSSコントリビュータを名乗れます!詳細な手順はこの辺の記事)。


AndroidへのBuildに関しては、適切な回答になってるかは分かりませんがテクニカルな解決方法が2つ、正攻法が1つあります。具体的には

  1. 3 で載せたようにWine等のツールを使ってWindowsアプリをAndroidで動かす

  2. 本プログラムをサーバ側で動かしてAndroidと通信
  3. 本プログラムの元となった jtalkdllCMakeでAndroid向けにビルド してそのdllをご自分のアプリに組み込む

という3つの方法がすぐに思い付きます。ちょっと調べてみた感じでも 「Androidでおしゃべりコマンドを試す。」 などの記事がヒットするので、Android向けのC++ライブラリの出力は恐らく出来るはずです。AndroidはLinuxベースだったはずなので、Linux向けにビルドしたパッケージがそのまま使えるかもしれません。

rarafy commented 1 year ago

まだReadMeに追記してませんでした