🎵

【C#】GCPのText-to-Speechの動作サンプル

2020/12/17に公開

はじめに

以前仕事でC#を扱っていました。
ここ最近はJavascriptTypescriptReactReactNativeを書くことがほとんどで、C#のことは割と忘れつつあるのですが、少し前に興味本位でGCPText-to-Speechを触ったので、備忘も兼ねてその時のコードを紹介します。

Text-to-Speechとは?

https://cloud.google.com/text-to-speech/?hl=ja

Google の AI テクノロジーを搭載した API を利用すると、テキストを自然な音声に変換できます

上記の説明にある通り、テキストから音声へ変換することができます。
抑揚やイントネーションなどが人間のそれに近いため、Twilioのようなサービスと組み合わせると流暢な発音で自動応答ができたりします。

セットアップ

下記コマンドからGoogle.Cloud.TextToSpeechをインストールしましょう。
NuGetGUIからでも同じことができると思います。

Install-Package Google.Cloud.TextToSpeech.V1 -Pre

サービスアカウントキーの取得

https://cloud.google.com/text-to-speech/docs/quickstart-client-libraries?hl=ja

上記の公式クイックスタートの内容を参考にサービスアカウントキーを取得します。
資料上では環境変数GOOGLE_APPLICATION_CREDENTIALSにサービスアカウントキーのパスを配置する例が記載されていますが、今回はパスを外からモジュールに渡す形式をとります。

コード

以下が実際のコードになります。
正常に動作した場合result.mp3ファイルが作成されると思います。

using Grpc.Auth;
using Grpc.Core;
using Google.Apis.Auth.OAuth2;
using Google.Cloud.TextToSpeech.V1;

public class Sample
{
	public static void Main(string[] args)
	{
		// サービスアカウントの鍵ファイルパス
		// 環境変数【GOOGLE_APPLICATION_CREDENTIALS】にjsonを置いても可能です
		// その場合、下記のGoogleCredentialの取得が不要となり、
		// TextToSppechクライアントのインスタンス作成時のコンストラクタ引数が不要になります。
		string credentialFile = "./credential.json";

		// GoogleCredentialを取得
		GoogleCredential gc = GoogleCredential.FromFile(credentialFile).CreateScoped(TextToSpeechClient.DefaultScopes);
		Channel channel = new Channel(TextToSpeechClient.DefaultEndpoint.Host, gc.ToChannelCredentials());

		// TextToSpeechクライアントのインスタンスを生成
		TextToSpeechClient client = TextToSpeechClient.Create(channel);

		// 読み上げ内容を生成
		string body = "<speak>音声読み上げだよ!</speak>"; 
		SynthesisInput input = new SynthesisInput();
		input.Ssml = body;

		// Voice設定(話者、言語等)
		VoiceSelectionParams voice = new VoiceSelectionParams
		{
		    // 話者(ここではja-JP-Wavenet-Aを指定)
		    Name = "ja-JP-Wavenet-A",
		    // 言語
		    LanguageCode = "ja-JP",
		    // 性別
		    SsmlGender = SsmlVoiceGender.Neutral
		};

		// 音声ファイル設定(形式、読み上げ速度等)
		AudioConfig config = new AudioConfig
		{
		    // ファイル形式
		    AudioEncoding = AudioEncoding.Mp3,
		    // 読み上げ速度(0.25~4.0の範囲で指定)
		    SpeakingRate = 1.0,
		};

		// リクエスト実行
		var response = client.SynthesizeSpeech(new SynthesizeSpeechRequest
		{
		    Input = input,
		    Voice = voice,
		    AudioConfig = config
		});

		// ファイル書き込み
		using (Stream output = File.Create("./result.mp3"))
		{
		    response.AudioContent.WriteTo(output);
		}
	}
}

話者の属性や読み上げ速度などをパラメータで調整できるので、あれこれ変更しながら生成されたmp3を聞いてみると面白いかもしれません。

まとめ

今回はGCPText-to-SpeechC#で動かしたサンプルについて紹介しました。
業務や個人開発で音声読み上げに関わったことがないので、とても新鮮でした。
流暢とはいったものの、正直まだ機会音声だと分かってしまうので、このあたりの品質向上に期待したいと思いました。

Discussion