【Unity】OpenJTalkで文字の音声読み上げをさせる

概要

ゆっくり実況みたいに、文字を起こして声で読ませるのをやりたい。

下のパッケージ(OpenJTalkForUnity)を使う。


実装

1. 新規プロジェクトを作る

2. Window>Package Managerを選択

図1.Package Manager


3. Add package from git URL…を選択(図2)

図2.gitからパッケージを入れる


4. https://github.com/rarafy/OpenJTalkForUnity.git?path=_Project/Packages/OpenJTalkForUnity と入力してAddを押す

図3.gitパッケージの導入

しばらく待つとプラグインが導入される。

図4.プラグインの導入完了


5. Plastic SCM関連の不具合が出た場合は、”Version Control”を選択して”Remove”する。気にならなければ、やらなくて良い。

図4.Plastic SCMのアンインストール

※エラー内容:

Assembly 'Library/ScriptAssemblies/Unity.PlasticSCM.Editor.dll' will not be loaded due to errors:
Reference has errors 'unityplastic'.

Assembly 'Packages/com.unity.collab-proxy/Lib/Editor/PlasticSCM/unityplastic.dll' will not be loaded due to errors:
unityplastic references strong named System.Windows.Forms Assembly references: 4.0.0.0 Found in project: 2.0.0.0.
Assembly Version Validation can be disabled in Player Settings "Assembly Version Validation"


6. 適当なシーンを作って、空のGameObjectを作る

図5.シーンとGame Objectの作成


7. OpenJTalkTest というスクリプトを作ってアタッチ。

図6.スクリプトのアタッチ

スクリプトを編集する。とりあえずチュートリアルに沿って何か喋らせてみる。

using UnityEngine;

public class OpenJTalkTest : MonoBehaviour
{
    void Start()
    {
        OpenJTalk.Speak("こんにちは。良い天気ですね。");
    }
}



8. 編集が終わったらUnityに戻ってプレイボタンを押す。

図7.テストで喋らせる。

無事動いたら完了。


補足

1. 非同期で動かしたい

図7を見てもらうと分かるように、再生ボタンを押してから音声の再生が終わるまでは同期処理で動いている。これをやってしまうと、音声の再生中は処理が止まってしまうので非同期で動かしたいという要求がある。

その場合はTaskを使ってこのように書く。

using System.Threading.Tasks;
using UnityEngine;

public class OpenJTalkTest : MonoBehaviour
{
    void Start()
    {
        Task.Run(() => OpenJTalk.Speak("こんにちは。良い天気ですね。"));
    }
}

UniTaskの場合はこんな感じ。

using Cysharp.Threading.Tasks;
using UnityEngine;

public class OpenJTalkTest : MonoBehaviour
{
    void Start()
    {
        UniTask.Run(() => OpenJTalk.Speak("こんにちは。良い天気ですね。"));
    }
}


2. 喋るの途中で止めたい

その場合は OpenJTalk.StopSpeaking() を使うと良い。話始めは OpenJTalk.SpeakStoppable(string text) 。

using System.Collections;
using System.Collections.Generic;
using System.Threading.Tasks;
using UnityEngine;

public class Stoppable : MonoBehaviour
{
    [SerializeField] string text = "おはようございます。今日は良い天気ですね。";
    [SerializeField] string voiceName = "tohoku-f01-happy";

    public void StartSpeaking()
    {
        Task task = Task.Run(() =>
        {
            return OpenJTalk.SpeakStoppable(text, voiceName);
        });
    }

    public void Stop()
    {
        OpenJTalk.StopSpeaking();
    }
}


3. ゆっくり喋ったりとかさせたい

喋る速度はパラメータで変更可能。こんな感じ。

using UnityEngine;

public class OpenJTalkTest : MonoBehaviour
{
    void Start()
    {
        OpenJTalk.Speak("こんにちは。良い天気ですね。", speed: 1.5f);
    }
}

読む速さを変更できる。

図8.高速再生

それ以外の要素を変更する場合は OpenJTalk.cs の、この辺を触ってパラメータを追加すると実現できる。

図9.パラメータの追加

Issueやコメントを書けば作者が暇なときに対応してくれるかもしれない。

作成者: rarafy

2013年くらいからUnityを触っているかもしれません。 特に書くこともありませんが、趣味は部屋の掃除です。

1件のコメント

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です