はじめに
今回は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