はじめに
VOICEVOXでGUIを使って大量のボイスを作るのって、結構大変ですよね。
今回は、Unityを使ってVOICEVOXのずんだもんの声の波形ファイルを作る方法を紹介します。
対象者:
- ゲームとかで大量に音声を作りたいという人
- Unityちょっとできる人
VOICEVOXのインストール
ここから良い感じに
https://voicevox.hiroshiba.jp/
起動
GUIで簡単にしゃべらせられます。
ちょっとしたものならこれでOK
ブラウザからアクセスしてみる
このアプリのエンジンに直接アクセスしてみます。
試しに
GUIを起動した状態で
http://127.0.0.1:50021/docs
にアクセスすると
使い方マニュアルが見れます。
これが表示できる状態であれば、GUIを介さずに直接エンジンと語り合うことが可能です。
Unityの準備
VoiceVoxスクリプト作る
GETを呼ぶ
using System.Collections;
using UnityEngine;
using UnityEngine.Networking;
public class VoiceVox : MonoBehaviour
{
void Start()
{
StartCoroutine(MakeWav());
}
IEnumerator MakeWav()
{
UnityWebRequest query1 =
UnityWebRequest.Get("http://127.0.0.1:50021/speakers");
yield return query1.SendWebRequest();
if (query1.result != UnityWebRequest.Result.Success)
{
Debug.Log(query1.error);
}
else
{
Debug.Log("結果:" + query1.downloadHandler.text);
}
}
}
実行するとスピーカー(話者)の情報がログにでているのが確認できます。
ブラウザで「http://127.0.0.1:50021/speakers」を叩いても得られます。
このidのところ ずんだもんの「あまあま」のスピーカー(話者)を使ってみましょう。
wavを得る
まず、文字列を入力してaudio_queryを呼びjsonを得ます。
得られたjsonをもとにsynthsisでwavファイルを得ます。
それをファイルに書き出すという流れ
以下コード
using System.Text;
using System.IO;
using UnityEngine;
using UnityEngine.Networking;
using Cysharp.Threading.Tasks;
public class VoiceVox : MonoBehaviour
{
public string Text = "なのだ";
public int Speaker = 1;
async void Start()
{
await MakeAudioQuery(Text, Speaker);
}
async UniTask MakeAudioQuery(string text, int speaker)
{
var url = $"http://127.0.0.1:50021/audio_query?text={System.Web.HttpUtility.UrlEncode(text)}&speaker={speaker}";
using (var request = new UnityWebRequest(url, "POST"))
{
request.downloadHandler = new DownloadHandlerBuffer();
request.SetRequestHeader("Content-Type", "application/json");
await request.SendWebRequest();
if (request.result == UnityWebRequest.Result.ConnectionError ||
request.result == UnityWebRequest.Result.ProtocolError)
{
Debug.Log(request.error);
}
else
{
Debug.Log(request.downloadHandler.text);
await MakeWav(request.downloadHandler.text);
}
}
}
async UniTask MakeWav(string json)
{
var url = $"http://127.0.0.1:50021/synthesis?speaker=1&enable_interrogative_upspeak=true";
byte[] bodyRaw = Encoding.UTF8.GetBytes(json);
using (var request = new UnityWebRequest(url, "POST"))
{
request.uploadHandler = new UploadHandlerRaw(bodyRaw);
request.downloadHandler = new DownloadHandlerBuffer();
request.SetRequestHeader("Accept", "audio/wav");
request.SetRequestHeader("Content-Type", "application/json");
await request.SendWebRequest();
if (request.result == UnityWebRequest.Result.ConnectionError ||
request.result == UnityWebRequest.Result.ProtocolError)
{
Debug.Log(request.error);
}
else
{
// Debug.Log(request.downloadHandler.text);
var fileName = Application.dataPath + $"/{Text}.wav";
using (var writer = new BinaryWriter(new FileStream(fileName, FileMode.Create)))
{
writer.Write(request.downloadHandler.data);
}
}
}
}
}
実行結果
補足
ここでは
using Cysharp.Threading.Tasks;使っているので
packageを追加しておいてください。
Package Managerの左上の[+]からAdd package from git URL...
以下のアドレスをコピペして Addする
https://github.com/Cysharp/UniTask.git?path=src/UniTask/Assets/Plugins/UniTask