はじめに
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でも利用できないかなーと密かに考えています。
果たして・・・・・・。