方言を話すおしゃべり猫型ロボット『ミーア』をリリースしました(こちらをクリック)

【Text-to-Speech × Go】テキストから音声合成し、AWS S3にアップロードする

この記事は約11分で読めます。

タイトルの通り、音声ファイル生成とアップロードを進めていく。

サーバーサイドはGo言語を使用しているので、Go言語で。

音声合成:Google TTS API

請求情報設定→API有効化

まず、Text-to-Speech AI APIを有効化する必要がある。

下記URLで、「コンソールへ移動」ボタンをクリックすると、API有効化の案内が出るのでクリックする。請求先のクレジットカード登録必須。

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

有効化できたら、下記のデモ画面に遷移する(が、今回はAPIを使いたいので、このデモ画面は使わない)

認証設定

サービスアカウントを作成して、そのアカウントのJSON形式の秘密鍵(JSONファイル)をダウンロードする。

Text-to-Speech APIを有効にしたプロジェクトを選択し、「APIとサービス」→「認証情報」をクリック。

「認証情報を作成」→「サービスアカウント」を選択

サービスアカウント名(IDはアカウント名を入れると自動的に作成される)と、サービスアカウントの説明を記入。その他の項目は省略可。

完了ボタンを押すと、下記のようにサービスアカウントが作成される。

まだ、鍵を作成していないので、キーIDのカラムに「キーがありません」と表示されている。

次にキーを作成する。

作成したサービス名をクリックし、「キー」のタブを選択して「鍵を追加」をクリックする。
JSONタイプを選択すると、鍵がダウンロードされる。

このJSONファイルは、サービスアカウントの認証情報を含んでおり、APIを安全に使用するために必要。環境変数 GOOGLE_TTS_CREDENTIALS にこのJSONファイルのパスをGOOGLE_TTS_CREDENTIALS=/path/to/your/keyfile.json のように追加する。これにより、アプリケーションはその環境変数を参照して、必要な認証情報にアクセスする。

TTSクライアントライブラリをインストール

クライアクライアント ライブラリを使用してテキストから音声を作成する

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

下記コマンドをターミナルで実行する。

Python
go get cloud.google.com/go/texttospeech/apiv1

GoのGoogle Cloud Text-to-Speechクライアントライブラリが取得され、プロジェクトに追加され、go.modファイルとgo.sumファイルが更新される。

Go言語におけるgo.modgo.sumは、RubyのGemfileGemfile.lockに相当する。

  • go.mod: これはプロジェクトの「Goモジュール」ファイルで、プロジェクトの依存関係を追跡する。新しいライブラリを追加すると、そのライブラリの名前とバージョンがこのファイルに記録される。
  • go.sum: このファイルはgo.modにリストされている依存関係の「ロックファイル」のようなもので、各依存関係の暗号ハッシュを含む。このファイルはプロジェクトで使用されるモジュールの完全性と認証性を保証する役割を果たす。依存関係を追加または更新すると、新しいハッシュでこのファイルが更新される。

どの日本語の音声合成を試したいか、事前にコンソールで確認

Google TTSでサポートされている音声と言語のリストはこちら。日本語は、11種類用意されている。
https://cloud.google.com/text-to-speech/docs/voices?hl=ja

Google のTTSではGUIで日本語の音声合成を試せる機能がついている。下記にアクセス

https://console.cloud.google.com/speech/text-to-speech;locale=ja-JP;encoding=LINEAR16;speed=1;location=global?hl=ja

このような感じで、音声合成したいテキストを入力したのちに、Voiceセクションでタイプを選択して、「Synthesize」をクリックして、合成された音声を確認する。

ちなみに、WavenetとNeutralとStandardの3種類があり、Standardに比べて、WavenetとNeutralは高品質の音声合成なので、Neutralの4倍の価格。
・Neutral:4ドル/100万文字(日本語の100万文字)
・Wavenet・Neutral:16ドル/100万文字

TTSライブラリを使用して、音声合成コード記載

main関数とは別に、synthesize_speech.goファイルを用意し、SynthesizeSpeech関数を記載。

Go
package clocky_be

import (
	"context"
	"log"
	"os"

	texttospeech "cloud.google.com/go/texttospeech/apiv1"
	texttospeechpb "cloud.google.com/go/texttospeech/apiv1/texttospeechpb"
)

func SynthesizeSpeech(text, filename string) error {
	// Instantiates a client.
	ctx := context.Background()

	client, err := texttospeech.NewClient(ctx)
	if err != nil {
		return err
	}
	defer client.Close()

	req := texttospeechpb.SynthesizeSpeechRequest{
		Input: &texttospeechpb.SynthesisInput{
			InputSource: &texttospeechpb.SynthesisInput_Text{Text: text},
		},
		Voice: &texttospeechpb.VoiceSelectionParams{
			LanguageCode: "ja-JP",
			SsmlGender:   texttospeechpb.SsmlVoiceGender_FEMALE,
		},
		AudioConfig: &texttospeechpb.AudioConfig{
			AudioEncoding: texttospeechpb.AudioEncoding_MP3,
		},
	}

	resp, err := client.SynthesizeSpeech(ctx, &req)
	if err != nil {
		return err
	}

	err = os.WriteFile(filename, resp.AudioContent, 0644)
	if err != nil {
		return err
	}

	log.Printf("Audio content written to file: %vn", filename)
	return nil
}

音声アップロード:AWS S3

生成した音声ファイルをAWS S3へアップロード

AWSのGo SDKを使用して、S3クライアントを設定し、生成された音声ファイルをアップロードする関数を作成する。

AWS SDK for Goとその依存関係をインストール

AWSのGo SDK(Software Development Kit)は、Amazon Web Services(AWS)のクラウドサービスをGoプログラミング言語を使用して利用するための公式のソフトウェア開発キット。

下記コマンドを実行し、go.mod および go.sum ファイルを更新し、必要な依存関係を追加する。

Go
go get github.com/aws/aws-sdk-go/aws
go get github.com/aws/aws-sdk-go/aws/session

今回は、バケット直下ではなく、バケットにサブディレクトリを1階層作成し、その中に音声合成ファイルを格納する。

Go
import (
    "github.com/aws/aws-sdk-go/aws"
    "github.com/aws/aws-sdk-go/aws/session"
    "github.com/aws/aws-sdk-go/service/s3"
)

func UploadFileToS3(sess *session.Session, bucketName, folderPath, fileName string) error {
	// S3サービスクライアントの作成
	s3Svc := s3.New(sess)

	// ファイルを開く
	file, err := os.Open(fileName)
	if err != nil {
		return err
	}
	defer file.Close()

	// フォルダパスを含むキーの作成
	key := folderPath + "/" + fileName

	// S3にファイルをアップロード
	_, err = s3Svc.PutObject(&s3.PutObjectInput{
		Bucket: aws.String(bucketName),
		Key:    aws.String(key),
		Body:   file,
	})
	return err
}

AWS S3への認証情報を付加

IAMユーザーを作成する:

AWS管理コンソールにログインし、IAMユーザーを新規作成する。新規IAMユーザーに、プログラムによるアクセスのタイプを選択し、適切なアクセス権限を持つポリシー(AmazonS3FullAccess)をアタッチする。

アクセスキーとシークレットアクセスキーを取得する:

新しく作成したIAMユーザーの名前をクリックして、ユーザーの詳細ページで「セキュリティ認証情報」タブを選択。「アクセスキーを作成」をクリック。

AWSの外部で実行されるアプリケーションを選択。

タグ名を記載(任意)すると、AWSのアクセスキーIDとシークレットアクセスキーが生成される。

環境変数を更新する:

プロジェクトの環境変数を更新し、新しいアクセスキーとシークレットアクセスキーを設定する。今回は、AWS_S3_ACCESS_KEY_IDAWS_S3_SECRET_ACCESS_KEY という名前を使用する。

作成した関数をmain.goで呼び出す

SynthesizeSpeech 関数を使用して音声ファイルを生成し、その後に UploadFileToS3 関数を呼び出してS3にアップロードする。

これらの関数をmain.goで呼び出す。

config.go ファイルで設定情報を記載しているので、Config インスタンスを作成し、その AWSS3Bucket プロパティを UploadFileToS3 関数に渡す。

Go
package main

import (
	"log"

	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/credentials"
	"github.com/aws/aws-sdk-go/aws/session"
)

func main() {
	config := clocky.NewConfig()

	// AWSセッションの作成
	awsSession, err := session.NewSession(&aws.Config{
		Region:      aws.String(config.AWSRegion),
		Credentials: credentials.NewStaticCredentials(config.AWSAccessKey, config.AWSSecretKey, ""),
	})
	if err != nil {
		log.Fatalf("Failed to create AWS session: %v", err)
	}

	// 音声変換とS3アップロードの処理
	text := "おはようございます"
	fileName := "output.mp3"
	folderPath := "weather"
	if err := clocky.SynthesizeSpeech(text, fileName); err != nil {
		log.Fatalf("Failed to synthesize speech: %v", err)
	}
	if err := clocky.UploadFileToS3(awsSession, config.AWSS3Bucket, folderPath, fileName); err != nil {
		log.Fatalf("Failed to upload file to S3: %v", err)
	}

}

完成!

変更を適用するためにDockerコンテナを再起動する。

無事、テキスト情報「おはようございます」をもとに、音声ファイルが作成され、s3に格納された。

コメント

タイトルとURLをコピーしました