OpenJTalkをUnity上で使うためのプラグインです。 動的に文字を読み上げることが出来ます。
- Windows 10 20H2
- Unity Editor 2020.3.12f1 (LTS)
- OpenJTalkForUnity.unitypackageをインポートします。
- Edit > Project Settings > Other Settings > Configuration > Api Compatibility Levelを「.NET 4.x」に変更します。
- プログラムを書きます。
Assets\OpenJTalkForUnity\Scene
を参考にしてください。
Window>Package Manager で Add package from git URL...を選択し、https://github.com/rarafy/OpenJTalkForUnity.git?path=_Project/Packages/OpenJTalkForUnity
と入力してください。
サンプルプログラムもインポートしましょう。サンプルプログラムはAssets/Samples/OpenJTalkForUnity/1.1.13/Sample
に配置されます。
いくつかのAPIが用意されています。基本的にはAssets\OpenJTalkForUnity\Scene
を参考にしながら書いてみると良いと思います。
OpenJTalk.VoiceTypeInfo()
:どの声が使えるかを調べ、Debug.Logとして出力します。OpenJTalk.SpeakRandomVoice(string text, double speed=1.0)
:ランダムな声で喋ります。OpenJTalk.Speak(string text = "こんにちは", string VoiceName = "tohoku-f01-neutral", double speed = 1.0)
:指定した声と速度で任意の文字列を読み上げます。OpenJTalk.SpeakRandomVoiceStoppable(string text = "こんにちは", double speed = 1.0)
:ランダムな声で喋ります。(Taskなので非同期処理です)OpenJTalk.SpeakStoppable(string text = "こんにちは", string VoiceName = "tohoku-f01-neutral", double speed = 1.0)
:指定した声と速度で任意の文字列を読み上げます。OpenJTalk.StopSpeaking()
:喋るのを途中でやめます。
- 謎のエラーが出ます
アンマネージドDLLの不具合っぽいです。実使用に支障はありません。
どうしても気になる場合は該当のファイルを削除すると良いでしょう(Windowsネイティブの機能が使えなくなりますが実使用には影響ありません)。
- 違う音声を使いたい
Assets\OpenJTalkForUnity\dll\voice よりも下の階層に置かれたhtsvoiceであれば使うことが出来ます。Speak()の第二引数で名前を指定します。
例:takumi_happy.htsvoiceを使いたい場合
void Start(){ OpenJTalkForUnity.Speak("今日は良い天気ですね。", "takumi_happy"); }
- アプリが読み上げ中に止まってしまうんですけど
非同期(Task)という機能を使うと解決できます。例えば
void Start()
{
Task.Run(() => OpenJTalk.Speak("こんにちは。良い天気ですね。"));
}
↑ このようにタスクを使えばアプリが動作中に停止しないようになります。
- OpenJTalk、もっとパラメータあったよね?(高度)
Assets\OpenJTalkForUnity\Scripts\OpenJTalk.cs
を編集することで、それらのパラメータを解禁できます。
例えば、Speedパラメータを追加したい場合、tts.SpeakAsync(text);
の前の行にtts.Speed = 1.0;
を加えると良いでしょう。
もちろん、最初の宣言部分を
JTalkTTS tts = new JTalkTTS { VoiceName = "tohoku-f01-neutral", Speed = 1.0 }
と書き換えることでも実現できます。