概要
ゆっくり実況みたいに、文字を起こして声で読ませるのをやりたい。
下のパッケージ(OpenJTalkForUnity)を使う。
実装
1. 新規プロジェクトを作る
2. Window>Package Managerを選択
3. Add package from git URL…を選択(図2)
4. https://github.com/rarafy/OpenJTalkForUnity.git?path=_Project/Packages/OpenJTalkForUnity と入力してAddを押す
しばらく待つとプラグインが導入される。
5. Plastic SCM関連の不具合が出た場合は、”Version Control”を選択して”Remove”する。気にならなければ、やらなくて良い。
※エラー内容:
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を作る
7. OpenJTalkTest というスクリプトを作ってアタッチ。
スクリプトを編集する。とりあえずチュートリアルに沿って何か喋らせてみる。
using UnityEngine;
public class OpenJTalkTest : MonoBehaviour
{
void Start()
{
OpenJTalk.Speak("こんにちは。良い天気ですね。");
}
}
8. 編集が終わったらUnityに戻ってプレイボタンを押す。
無事動いたら完了。
補足
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);
}
}
読む速さを変更できる。
それ以外の要素を変更する場合は OpenJTalk.cs の、この辺を触ってパラメータを追加すると実現できる。
Issueやコメントを書けば作者が暇なときに対応してくれるかもしれない。
・【Unity】iOS / Android で音声合成(TextToSpeech)使用できる「Speech And Text in Unity iOS and Unity Android」紹介
https://baba-s.hatenablog.com/entry/2023/02/21/090000
というのもあるようです。こちらはiOS/Android向け?