はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity】Google Cloud TextToSpeech V1(v2.5.0)を利用して音声合成によりテキストを読み上げる(Windows)

はじめに

今回はGoogle Cloud TextToSpeechを利用してテキストを読み上げてみる記事になります。
cloud.google.com

公式ドキュメントを見てみるとC#GoJava等のクライアントライブラリが提供されているそうなので、C#のライブラリをありがたく利用させてもらいます。
cloud.google.com

Unityで利用するためには以下のステップを踏む必要があります。

  1. Google Cloud Platformで設定を行い、認証情報取得
  2. Unityにライブラリ導入
  3. クライアントライブラリの利用コードを書く

またサンプルプロジェクトを用意しておいたので、躓いたらこちらを参考にするとよいかもです。
github.com

環境

Windows10
Unity 2020.3.18f1
Google.Cloud.TextToSpeech.V1 v2.5.0

概要

導入方法の前にText to Speechの説明を載せておきます。

Text-to-Speech を使用すると、自然に聞こえる人間の音声を合成し、再生可能な音声として作り出すことができます。
...
Text-to-Speech は、テキストまたは音声合成マークアップ言語(SSML)の入力を MP3 や LINEAR16(WAV ファイルで使用されるエンコード)などの音声データに変換します。

Cloud Text-to-Speech の基本  |  Cloud Text-to-Speech のドキュメント  |  Google Cloud

詳細は上記のリンクを見てみてください。

Google Cloud Platformでの設定&APIキー取得

まずGoogle Cloud Platformにログイン。
console.cloud.google.com

まだ利用者登録をしていない場合は、電話番号・クレジットカード等の情報を入力して登録を行なってください。

利用者登録が済んだ場合は既存のプロジェクトを選択するか、新しいプロジェクトを作成します。(以下のリンクで自動でプロジェクト一覧の画面に遷移してくれます)
Google Cloud Platform

左のバーのAPIとサービス -> 有効なAPIとサービスを選択し、APIとサービスの有効化Cloud Text-to-Speech APIを検索し、有効化してください。

f:id:hanaaaaaachiru:20220404230716p:plain
APIとサービス -> 有効なAPIとサービス
f:id:hanaaaaaachiru:20220404230718p:plain
APIとサービスの有効化
f:id:hanaaaaaachiru:20220404230721p:plain
Text-to-Speech APIの検索&有効化

有効化した後、サービスアカウントをText-to-Speechに割り当て、認証情報キーを取得します。

以下のURLを開くと、サービスアカウントの設定画面に飛び作成を行います。
Google Cloud Platform

最後にJSONキーを取得すればGCP上での操作は終了です。

f:id:hanaaaaaachiru:20220404232034p:plain
新しい鍵を作成
f:id:hanaaaaaachiru:20220404232054p:plain
キーのタイプをJSONで

Unityにライブラリを導入する

NuGetからインポートしてくださいとドキュメントに記載されていますが、UnityではNuGetを利用できないので少し面倒です。

一応NuGetForUnityというUnityNuGetを利用できるようにしたアセットがあるのですが、利用しようとしたら依存関係でエラー出力、それを修正しようとしたところファイルの自動生成...などめんどくさくなったのでVisual StudioからNuGetで取得してそれをUnityにインポートする手法を紹介します。
github.com

ということでVisual Studioを立ち上げ、適当にコンソールプロジェクトを作成しました。.NET Framework 4.7.1TargetFrameworkにしています。

f:id:hanaaaaaachiru:20220416200014p:plain
MyProject.csproj
f:id:hanaaaaaachiru:20220405011216p:plain
コンソールアプリ

メニューバーよりプロジェクト -> Manage NuGet Packages...を選択し、Google.Cloud.TextToSpeech.V1のパッケージを追加します。

f:id:hanaaaaaachiru:20220405011436p:plain
プロジェクト -> Manage NuGet Packages
f:id:hanaaaaaachiru:20220405011649p:plain
Google.Cloud.TextToSpeech.V1をインストール

あとはメニューバーのビルド -> 【プロジェクト名】のビルドを押すと、プロジェクトフォルダ -> bin -> Debug(Release)フォルダの中に.dllが生成されているはずです。

f:id:hanaaaaaachiru:20220416211255p:plain
出力されたdll

出力された.dllをUnityのPluginsフォルダの中に入れます。(依存先が多いですね...)

f:id:hanaaaaaachiru:20220416211420p:plain
Pluginsに入れた様子

またgrpc_csharp_ext.x86.dll, grpc_csharp_ext.x64.dllgrpc_csharp_extにそれぞれリネームを行い、InspectorよりPlatform settingsを設定してあげます。

参考にGitHubにサンプルプロジェクトを載っけたので、最悪こちらのプロジェクトからdllを拝借しちゃっても大丈夫です。
github.com

コードを書く

public class TTSTest : MonoBehaviour
{
    [SerializeField] private string credentialPath;
    [SerializeField] private string outputPath;
    
    private void Start()
    {
        var credential = Resources.Load<TextAsset>(credentialPath).text;

        TextToSpeechClientBuilder builder = new TextToSpeechClientBuilder()
        {
            JsonCredentials = credential
        };
        TextToSpeechClient client = builder.Build();
        
        // 読み上げる内容
        SynthesisInput input = new SynthesisInput
        {
            Text = "こんにちは。音声読み上げを行っています"
        };

        // ボイス設定
        VoiceSelectionParams voice = new VoiceSelectionParams
        {
            LanguageCode = "ja-JP",
            SsmlGender = SsmlVoiceGender.Female
        };

        // 音声ファイル設定
        AudioConfig config = new AudioConfig
        {
            AudioEncoding = AudioEncoding.Mp3
        };

        // 音声合成実行
        SynthesizeSpeechResponse response = client.SynthesizeSpeech(new SynthesizeSpeechRequest
        {
            Input = input,
            Voice = voice,
            AudioConfig = config
        });

        // MP3のファイルを生成
        using (Stream output = File.Create(outputPath))
        {
            response.AudioContent.WriteTo(output);
            Debug.Log($"succeeded : {outputPath}");
        }
    }
}

v2.5.0ではv1.0.0とAPIが割と違うので注意してください。

認証情報を渡すには、ファクトリメソッドを利用するのではなくBuilderクラスから設定してあげることでできます。

詳細は以下の公式ドキュメントを参照してください。
cloud.google.com