はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity】OpenJTalkがWin, Mac, Andriod, iOSで動くようなC#ラッパーを作りたい①

はじめに

UnityでOpenJTalkを利用したく、今までOpenJTalkForUnitySharpOpenJTalkを試してきました。

github.com

github.com

どちらも一部プラットフォームのUnityでは動作確認できたのですが、iOSAndroidでは動作は確認できていません。

ライブラリ 公式対応プラットフォーム
OpenJTalkForUnity Windows
SharpOpenJTalk win-x64, win-x86, osx, linux, browser-wasm

一応SharpOpenJTalkに関しては.so.aが入っていたので、iOSAndroidでも上手くやれば利用できそう?な予感もしますが実際に動かすことは今のところできていません。

www.hanachiru-blog.com


ちなみにOpenJTalkForUnityjtalkDLLというOpenJTalkを様々なプログラミング言語から便利に使えるライブラリを利用しているっぽいです。

github.com

ライブラリ 公式対応プラットフォーム
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周りの知識は多少あるので、ライブラリのビルドさえできればトントン拍子で進めることができそうではあるのですが・・・。

他の方が作られたラッパーを使えば良い説

jtalkDLLSharpOpenJTalkをもう少しちゃんと理解することができれば、iOSAndriodでも利用できないかなーと密かに考えています。

果たして・・・・・・。