以前、↓の記事でAmazon PollyとGCP Text-To-Speechを比較してみました。
今回は、実際にサービス利用することを見据え、golangを用いてGoogle Cloud PlatForm Text-To-Speechで音声合成を行うコードを作成し、生成された音声を聞いてみようと思います。
GCP Text-To-Speechとは
GCP Text-To-Speechの概要
GCP Text-To-Speechは、以下のような特徴を持った音声合成サービス
- AIを用いて、テキスト情報から音声データを生成する
- 深層学習技術を使用し、人間の声のような音声を合成する
- 数十の言語で音声を生成することができる
- ユースケースとして、「高齢者への音声読み上げサービス」「音声案内システム」「Vtuberなどのバーチャルキャラクターの声」などに利用できる
GCP Text-To-Speechの使用開始方法
golangからAPI実行するためにGCPの鍵情報を準備する
今回はgolangからGCP Text-To-SpeechのAPIを実行する方法を試してみます。
GCPのAPI実行には、GCPを利用できる認証情報として鍵情報の準備が必要になります。
以下の流れで準備していきましょう。
- ステップ1:GCPアカウントの作成
- GCP Text-To-Speechの使用には、GCP(Google Cloud PlatformAmazon Web Services)のアカウントが必要になります。
※アカウント作成方法は、↓の公式ガイドラインを参照ください。
ステップ 1: Google Cloud アカウントを作成する | Apigee
GCPは『新規のお客様向けの $300 相当の無料クレジット利用可能』のトライアル期間があります。無料で色々試せますので、是非この機会にアカウント作ってみましょう。
- ステップ2:Text-To-SpeechのAPIを有効化
- GCP Text-To-Speechを使用開始するためには、コンソール上でAPIを有効化する必要があります。
コンソールのText-To-Speechの画面に移動して、『有効にする』から有効化しましょう。
※GCPの公式ガイドはこちら
- ステップ3:サービス アカウントの作成
- GCPのAPIを実行するには、サービスアカウントの作成からサービスアカウントの作成をしましょう。
※作成方法は、↓の公式ガイドラインを参照ください。
始める前に | Cloud Text-to-Speech API | Google Cloud
公式ガイドラインにも記載がありますが、サービスアカウントは用途にあったIAM ロールだけを付与するようにしましょう。
権限を与えすぎると何用のサービスアカウントなのかがわからなくなりセキュリティ事故の元になります。
- ステップ4:サービス アカウントの秘密鍵を作成
- ステップ3で作成したサービスアカウントの秘密鍵を作成し、golangからAPI実行する際は、鍵情報をロードして実行するようにします。
※作成方法は、↓の公式ガイドラインを参照ください。
始める前に | Cloud Text-to-Speech API | Google Cloud
ここで作成した鍵ファイルは流出するとセキュリティ事故につながる恐れがありますので、安全な場所に保管しておきましょう。
間違ってもgithubなどの共有リポジトリにアップロードしてはいけません。
番外編:コンソールからの音声変換
今回はAPIから実行するために、鍵情報の準備を進めていきましたが、ただ音声変換を試したいだけであれば、
Text-to-Speech の合成 からGCPのコンソール上で音声変換することも可能です。
コンソールであれば、以下のような画面をぽちぽちするだけで簡単に音声合成可能です!
実際にコードを書いてみる
GCP をgolangから使用する場合は、google-api-go-client という公式のライブラリがGoogleから提供されていますので、そちらを使用しましょう。
必要な処理としては、
- GCPの認証情報をセットアップ
- GCP Text-To-Speech APIの使用準備
- GCP Text-To-Speech APIでテキスト情報を音声合成データに変換
- 音声合成データをファイル出力
のようなフローになります。1つずつ説明していきます。
GCPの認証情報をセットアップ
GCPの認証情報には、前項で準備した『サービス アカウントの秘密鍵』を使用します。
golangで認証情報のセッティングは以下のように行います。
・GCP認証情報のセットアップ処理
// GCP認証情報のセッティング
cred, err := ioutil.ReadFile("./service-account-file.json")
if err != nil {
log.Fatal(err)
return
}
svc, err := google.JWTConfigFromJSON(cred, googleScopes...)
if err != nil {
log.Fatal(err)
return
}
opts := option.WithTokenSource(svc.TokenSource(ctx))
./service-account-file.json
には準備した『サービス アカウントの秘密鍵』が配置してあるパスを指定しましょう。
GCP Text-To-Speech APIの使用準備
「GCPの認証情報をセットアップ」で用意した設定情報を、text-to-speechのAPIに渡したうえで、音声合成データ変換を行うための準備をします。
// text-to-speechAPIの実行準備
client, err := texttospeech.NewService(ctx, opts)
if err != nil {
log.Fatal(err)
return
}
req := texttospeech.SynthesizeSpeechRequest{
Input: &texttospeech.SynthesisInput{
Text: "音声合成のテスト文字列です",
},
Voice: &texttospeech.VoiceSelectionParams{
LanguageCode: "ja-JP",
Name: "ja-JP-Standard-D",
},
AudioConfig: &texttospeech.AudioConfig{
AudioEncoding: "MP3",
SpeakingRate: 1.0,
},
}
API実行時には、音声合成データ変換の設定を行う必要があり、設定内容は以下などがあります。
・Text
音声変換対象の文字列で、今回は「音声合成のテスト文字列です」という文字列を音声データ化してみます。
・LanguageCode
言語タグを指定するパラメータで、日本語の音声にしたいので今回は”ja-JP”を指定しています。
・Name
合成に使用する音声 IDで、日本語の音声にするか、外国語の音声にするか、をGCP側で用意されたボイスIDから選んで使用することができます。
サポートされている音声IDは、サポートされている音声と言語 | Cloud Text-to-Speech API | Google Cloud を参考にしてください。
・AudioEncoding
変換後のデータ形式で、今回はMP3を指定しています。
「AUDIO_ENCODING_UNSPECIFIED | LINEAR16 | MP3 | OGG_OPUS | MULAW | ALAW」が指定可能です。
・SpeakingRate
変換後音声の読み上げ速度で0.25~4.0の範囲で指定可能です。
2.0 は 2 倍、0.5 は半分の速度になります。
※その他、設定できるパラメータの細かい仕様については、GCPのAPIドキュメントを参照ください。
texttospeech package – google.golang.org/api/texttospeech/v1 – Go Packages
音声合成データをファイル出力
GCP Text-To-Speechからは”AudioContent”という項目に音声データが設定されてきます。
この値はbase64エンコードされた音声バイナリデータになっているので、デコードしてファイル出力(mp3ファイル)を以下では行っています。
『バックエンドAPIを構築して、クライアントアプリに音声データを返却する』ような処理であれば、base64のまま返却するのが良いと思います。
// 音声データをファイル出力
dec, err := base64.StdEncoding.DecodeString(resp.AudioContent)
if err != nil {
log.Fatal(err)
return
}
if err = os.WriteFile("TTS_GCP.mp3", dec, 0644); err != nil {
log.Fatal(err)
return
}
処理全体のコード
処理をつなげてみると、こんな感じです。
package main
import (
"context"
"encoding/base64"
"io/ioutil"
"log"
"os"
"golang.org/x/oauth2/google"
"google.golang.org/api/option"
speech "google.golang.org/api/speech/v1"
texttospeech "google.golang.org/api/texttospeech/v1"
)
var googleScopes = []string{
speech.CloudPlatformScope,
}
func main() {
ctx := context.TODO()
// GCP認証情報のセッティング
// サービスアカウントの鍵情報をロードする
cred, err := ioutil.ReadFile("./service-account-file.json")
if err != nil {
log.Fatal(err)
return
}
svc, err := google.JWTConfigFromJSON(cred, googleScopes...)
if err != nil {
log.Fatal(err)
return
}
opts := option.WithTokenSource(svc.TokenSource(ctx))
// text-to-speechAPIの実行準備
client, err := texttospeech.NewService(ctx, opts)
if err != nil {
log.Fatal(err)
return
}
req := texttospeech.SynthesizeSpeechRequest{
Input: &texttospeech.SynthesisInput{
Text: "音声合成のテスト文字列です",
},
Voice: &texttospeech.VoiceSelectionParams{
LanguageCode: "ja-JP",
Name: "ja-JP-Standard-D",
},
AudioConfig: &texttospeech.AudioConfig{
AudioEncoding: "MP3",
SpeakingRate: 1.0,
},
}
// text-to-speechAPIの実行
resp, err := texttospeech.NewTextService(client).Synthesize(&req).Do()
if err != nil {
log.Fatal(err)
return
}
// 音声データをファイル出力
dec, err := base64.StdEncoding.DecodeString(resp.AudioContent)
if err != nil {
log.Fatal(err)
return
}
if err = os.WriteFile("TTS_GCP.mp3", dec, 0644); err != nil {
log.Fatal(err)
return
}
}
音声合成処理ということで、複雑な処理になるかなと思ったのですが、いざ書いてみるとシンプルなコードで書くことができました。
実行結果
サンプルコードを実行して出来上がった音声がこちら
今回はサンプルなので、音声合成の内容として寂しいですが、無事テキストを音声に変換することができました!
料金や各種制限について
気になる料金についてですが、以下のようになっており、サンプル的な利用であれば無料枠で使用可能です。
・標準品質:
1か月あたり400万文字無料
超過分は100万文字当たり4ドル
・高品質:
1か月あたり100万文字無料
超過分は100万文字当たり16ドル
料金のことはもちろん、それ以外についても、以下記事で詳しく解説しているのでこちらの記事もよければご覧ください。
まとめ
以上、GCP Text-To-Speech×golangを試してみた際のコード紹介でした。
サービス利用する際は、もっと色々な処理や、細かい設定値を確認していく必要がありますが、
とりあえずサンプル的に音声合成を行うだけであれば、非常にシンプルなコードで書くことができました!
GCP周りは、仕様書を眺めても中々理解しにくい部分があったりしますので、本記事が少しでも参考になれば幸いです。
コメント