はじめに
今回はGoogle Cloud TextToSpeechを利用してテキストを読み上げてみる記事になります。
cloud.google.com
公式ドキュメントを見てみるとC#やGo、Java等のクライアントライブラリが提供されているそうなので、C#のライブラリをありがたく利用させてもらいます。
cloud.google.com
Unityで利用するためには以下のステップを踏む必要があります。
- Google Cloud Platformで設定を行い、認証情報取得
- Unityにライブラリ導入
- クライアントライブラリの利用コードを書く
またサンプルプロジェクトを用意しておいたので、躓いたらこちらを参考にするとよいかもです。
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を検索し、有効化してください。



有効化した後、サービスアカウントをText-to-Speechに割り当て、認証情報キーを取得します。
以下のURLを開くと、サービスアカウントの設定画面に飛び作成を行います。
Google Cloud Platform
最後にJSONキーを取得すればGCP上での操作は終了です。


Unityにライブラリを導入する
NuGetからインポートしてくださいとドキュメントに記載されていますが、UnityではNuGetを利用できないので少し面倒です。
一応NuGetForUnityというUnityでNuGetを利用できるようにしたアセットがあるのですが、利用しようとしたら依存関係でエラー出力、それを修正しようとしたところファイルの自動生成...などめんどくさくなったのでVisual StudioからNuGetで取得してそれをUnityにインポートする手法を紹介します。
github.com
ということでVisual Studioを立ち上げ、適当にコンソールプロジェクトを作成しました。.NET Framework 4.7.1をTargetFrameworkにしています。


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


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

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

またgrpc_csharp_ext.x86.dll, grpc_csharp_ext.x64.dllをgrpc_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