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

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

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

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

# VOICEVOXのインストール

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

# 起動

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96808/1ee53f44-0bc7-0ba5-40fc-b4cce6feff56.png)

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

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

このアプリの[エンジン](https://github.com/VOICEVOX/voicevox_engine
)に直接アクセスしてみます。
試しに
GUIを起動した状態で

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96808/66947da1-747a-aa8e-828e-04db97562a49.png)


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

# Unityの準備
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96808/69a580a7-03e1-0b24-3fde-3f7740e65a97.png)
空のUnityを用意しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96808/9b4e65ba-3445-b41b-2806-4c9ecaf187fd.png)

# VoiceVoxスクリプト作る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96808/46b46e77-f99b-37b9-d17e-23a86cfc1d0c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96808/173b6b4f-00ea-7a24-e83a-4f1f2b8ae60a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96808/bd26df59-6404-4784-a796-93e9b03f55b0.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96808/4875a758-8139-85e3-868c-41f7db0d0bc3.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96808/26667444-cb80-d068-2d75-18adec75fdca.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);
                }
            }
        }
    }
}
```

# 実行結果
https://twitter.com/tatmos/status/1686311763749543936?s=20



# 補足

ここでは
using Cysharp.Threading.Tasks;使っているので
packageを追加しておいてください。

Package Managerの左上の[+]からAdd package from git URL...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96808/14ce74cd-2a94-4bde-66b7-4f434b55157b.png)
以下のアドレスをコピペして　Addする
https://github.com/Cysharp/UniTask.git?path=src/UniTask/Assets/Plugins/UniTask
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96808/1a6823c5-6abe-7c79-4a4b-728a8fb6b976.png)