LoginSignup
3
1

UnityでVOICEVOXのずんだもんの音声ファイルを作る

Posted at

はじめに

VOICEVOXでGUIを使って大量のボイスを作るのって、結構大変ですよね。

今回は、Unityを使ってVOICEVOXのずんだもんの声の波形ファイルを作る方法を紹介します。

対象者:

  • ゲームとかで大量に音声を作りたいという人
  • Unityちょっとできる人

VOICEVOXのインストール

ここから良い感じに
https://voicevox.hiroshiba.jp/

起動

image.png

GUIで簡単にしゃべらせられます。
ちょっとしたものならこれでOK

ブラウザからアクセスしてみる

このアプリのエンジンに直接アクセスしてみます。
試しに
GUIを起動した状態で

http://127.0.0.1:50021/docs
にアクセスすると
使い方マニュアルが見れます。

image.png

これが表示できる状態であれば、GUIを介さずに直接エンジンと語り合うことが可能です。

Unityの準備

image.png
空のUnityを用意しました。

image.png

VoiceVoxスクリプト作る

image.png
image.png
image.png

GETを呼ぶ

GET.cs
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);
        }
    }
}

実行するとスピーカー(話者)の情報がログにでているのが確認できます。

image.png

ブラウザで「http://127.0.0.1:50021/speakers」を叩いても得られます。

image.png

このidのところ ずんだもんの「あまあま」のスピーカー(話者)を使ってみましょう。

wavを得る

まず、文字列を入力してaudio_queryを呼びjsonを得ます。
得られたjsonをもとにsynthsisでwavファイルを得ます。
それをファイルに書き出すという流れ

以下コード

VoiceVox.cs
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...
image.png
以下のアドレスをコピペして Addする
https://github.com/Cysharp/UniTask.git?path=src/UniTask/Assets/Plugins/UniTask
image.png

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1