はじめに
UnityでOpenJTalk
を利用したく、今までOpenJTalkForUnity
とSharpOpenJTalk
を試してきました。
どちらも一部プラットフォームのUnityでは動作確認できたのですが、iOS
・Android
では動作は確認できていません。
ライブラリ | 公式対応プラットフォーム |
---|---|
OpenJTalkForUnity | Windows |
SharpOpenJTalk | win-x64, win-x86, osx, linux, browser-wasm |
一応SharpOpenJTalk
に関しては.so
と.a
が入っていたので、iOS
・Android
でも上手くやれば利用できそう?な予感もしますが実際に動かすことは今のところできていません。
ちなみにOpenJTalkForUnity
はjtalkDLL
というOpenJTalk
を様々なプログラミング言語から便利に使えるライブラリを利用しているっぽいです。
ライブラリ | 公式対応プラットフォーム |
---|---|
jtalkDLL | Windows, macOS, Ubuntu |
jtalkDLL
も上手く使えばiOS
, Andriod
対応の解決のヒントになりそうな予感がしますね。
ひとまずOpenJTalkを触ってみる
Unityで動かす以前にオリジナルのOpenJTalk
の利用法について書いておきます。
(brew
でバイナリをダウンロードしたりもできますが、いずれ自作C#ラッパーを作りたいのでソースコードからコンパイルします)
OpenJTalk
をホームページからソースコードをダウンロードします。
Open JTalk
またOpenJTalk
を動作させるにはhts_engine API
という音声波形を合成するライブラリが必要だそうですので、こちらもソースコードをダウンロード。
hts_engine API
ダウンロードしたファイル↓
- open_jtalk-1.11.tar.gz
- hts_engine_API-1.10.tar.gz
コンパイルをする
先にhts_engine_API
をコンパイルします。
configure
というファイルが同梱されているので、ターミナル(コマンドプロンプト, PowerShell等)で以下のコマンドを打ち込みます。
$ cd hts_engine_APIのパスまで移動 $ ./configure
configure
ってなんやねんとなるかもしれませんが、これを実行するとMakeFile
を作ってくれるようですね。
configureを使えば、アプリがインストールされる環境を自動的に調べ、その環境に合わせたMakeFileを自動的に作ることができます。
configure, make, make install とは何か - Qiita
あとは先ほど生成されたMakeFile
を実行します。
$ cd hts_engine_APIのパスまで移動 $ make
無事実行すると、bin/hts_engine
等が生成されているはずです。
ちなみにMakeFile
はなんやねんというとこちら。
configureで作成されたMakeFileに基づいて、アプリのコンパイルが行われます。
makeコマンドは(こちらはコマンドです)オプションなし、引数なしで実行することで、MakeFileを参照し、MakeFile内のデフォルトの処理を行います(大抵の場合はビルド処理です)。
configure, make, make install とは何か - Qiita
同様にしてOpenJTalk
のコンパイルを行っちゃいましょう。
$ cd hts_engine_APIのパスまで移動 $ ./configure \ --with-hts-engine-header-path=/〇〇/hts_engine_API-1.10/include \ --with-hts-engine-library-path=/〇〇/hts_engine_API-1.10/lib \ --with-charset=utf-8 $ make
configure
にオプションが付く以外は同じですね。オプションの詳細は./configure --help
を実行するとでてきます。
無事に実行できるとbin/open_jtalk
が出力されていますね。
遊んでみる
せっかくなので適当な文章を話させて遊んでみましょう。
ただOpenJTalk
で喋らせるには以下の2つが追加で必要になります。
- MeCab辞書
- 音響モデル
またもやOpenJTalk
のサイトに行き、以下の2つのファイルをダウンロードします。
Open JTalk
- Dictionary for Open JTalk(open_jtalk_dic_utf_8-1.11.tar.gz)
- HTS voice(hts_voice_nitech_jp_atr503_m001-1.05.tar.gz)
あとは以下のコマンドを実行
$ cd 「open_jtalk/bin」があるところまで移動 $ echo 'はじめてのOpenJTalk' > input.txt $ ./open_jtalk \ -x /〇〇/open_jtalk_dic_utf_8-1.11 \ -m /〇〇/hts_voice_nitech_jp_atr503_m001-1.05/nitech_jp_atr503_m001.htsvoice \ -ow output.wav \ input.txt
echo 'はじめてのOpenJTalk' > input.txt
の箇所で中身が"はじめてのOpenJTalk"であるtxt
ファイルを生成します。
あとはopen_jtalk
の引数はいっぱいありますが、設定をします。(詳細はopen_jtalk
と入力すると表示される)
オプション | 意味 |
---|---|
-x dir | dictionary directory |
-m htsvoice | HTS voice files |
-ow s | filename of output wav audio (generated speech) |
他にもvolume
とかspeech speed rate
とかsampling frequency
とか色々ありますね。
相変わらずデフォルトの声はキモいです。
自作C#ラッパーはどう作れば良いのか問題
ひとまずMakeFile
を利用してビルドしたのですが、これを.dll
, .so
, .a
, .dylib
あたりに変換をする必要がありますね。
特にiOS
では動的リンクが利用できないので、.a
にしなければならないのは大きな制約でしょう。
ネットに近しいことしている方がいないか調べたところ、凹みさんがMakeFile
を調べてc++
のラッパーを作成していました。
tips.hecomi.com
ただ私の知識不足でMakeFile
を解読ができていない&どうやってライブラリを作成するのか分かっていないというのでつまづいています。
まずMakeFile
の理解をしないとダメですね。
C#
のDllImport
周りの知識は多少あるので、ライブラリのビルドさえできればトントン拍子で進めることができそうではあるのですが・・・。
他の方が作られたラッパーを使えば良い説
jtalkDLL
とSharpOpenJTalk
をもう少しちゃんと理解することができれば、iOS
とAndriod
でも利用できないかなーと密かに考えています。
果たして・・・・・・。