以前、↓の記事でAmazon PollyとGCP Text-To-Speechを比較してみました。
今回は、実際にサービス利用することを見据え、golangを用いてAmazon Pollyで音声合成を行うコードを作成し、生成された音声を聞いてみようと思います。
Amazon Pollyとは
Amazon Pollyの概要
Amazon Pollyは、以下のような特徴を持った音声合成サービス
- AIを用いて、テキスト情報から音声データを生成する
- 深層学習技術を使用し、人間の声のような音声を合成する
- 数十の言語で音声を生成することができる
- ユースケースとして、「高齢者への音声読み上げサービス」「音声案内システム」「Vtuberなどのバーチャルキャラクターの声」などに利用できる
Amazon Pollyの使用開始方法
Amazon Pollyの使用には、AWS(Amazon Web Services)のアカウントが必要になります。
※アカウント作成方法は、↓の公式ガイドラインを参照ください。
AWS アカウント作成の流れ【AWS 公式】 (amazon.com)
今回はgolangで作成したプログラムから実行する方法を解説しますが、Amazon Pollyを使ってみたいだけであれば、AWSのアカウントを用意することで、ブラウザ上から簡単に使用可能です。
(↓のような画面をぽちぽちするだけで、簡単に音声合成可能!)
実際にコードを書いてみる
Amazon Pollyをgolangから使用する場合は、aws-sdk-go-v2 という公式のライブラリがAWSから提供されていますので、そちらを使用しましょう。
必要な処理としては、
- AWSの認証情報をセットアップ
- Amazon Polly APIの使用準備
- Amazon Polly APIでテキスト情報を音声合成データに変換
- 音声合成データをファイル出力
のようなフローになります。1つずつ説明していきます。
AWSの認証情報をセットアップ
AWSのAPIをコールする際は、AWSの認証情報が必要になります。
※AWS 認証情報について詳しく知りたい方は、↓のAWSのドキュメントをご参照ください。
AWS セキュリティ認証情報 – AWS Identity and Access Management (amazon.com)
今回は認証処理を簡易的に行うために、アクセスキーというものを使用して認証処理を行います。
※例のごとくアクセスキーについて詳しく知りたい方は、AWSのドキュメントをご参照。
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_access-keys.html
golangで認証情報のセッティングは以下のように行います。
・AWS認証情報のセットアップ処理
// AWS認証情報セッティング
conf, err := config.LoadDefaultConfig(
ctx,
config.WithSharedConfigProfile("default"), // 任意のクレデンシャル設定
)
if err != nil {
log.Fatal(err)
}
Amazon Polly APIの使用準備 & Amazon Polly APIでテキスト情報を音声合成データに変換
「AWSの認証情報をセットアップ」で用意した設定情報を、Amazon PollyのAPIに渡したうえで、音声合成データ変換を行う処理は以下のようになります。
// polly音声合成処理
client := polly.NewFromConfig(conf)
res, err := client.SynthesizeSpeech(ctx, &polly.SynthesizeSpeechInput{
OutputFormat: types.OutputFormat("mp3"),
Text: aws.String("音声合成のテスト文字列です"),
VoiceId: types.VoiceId("Mizuki"),
})
if err != nil {
log.Fatal(err)
}
API実行時には、音声合成データ変換の設定を行う必要があり、設定内容は以下などがあります。
・OutputFormat
変換後のデータ形式で、今回はmp3を指定しています。
「json | mp3 | ogg_vorbis | pcm」が指定可能です。
・Text
音声変換対象の文字列で、今回は「音声合成のテスト文字列です」という文字列を音声データ化してみます。
・VoiceId
合成に使用する音声 IDで、日本語の音声にするか、外国語の音声にするか、をAWS側で用意されたボイスIDから選んで使用することができます。
※設定できるパラメータの細かい仕様については、AWSのドキュメントを参照ください。
SynthesizeSpeech – Amazon Polly
音声合成データをファイル出力
Amazon Pollyからは”AudioStream”という項目に音声データが設定されてきます。
この値はストリームデータになっているので、一度io.ReadAllで読み取り、バイナリデータに変換したのち、ファイル出力(mp3ファイル)という処理を以下では行っています。
// 音声データを取得
a, err := io.ReadAll(res.AudioStream)
if err != nil {
log.Fatal(err)
}
// 音声データをファイル出力
if err = os.WriteFile("TTS.mp3", a, 0644); err != nil {
log.Fatal(err)
}
処理全体のコード
処理をつなげてみると、こんな感じです。
package main
import (
"context"
"io"
"log"
"os"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/config"
"github.com/aws/aws-sdk-go-v2/service/polly"
"github.com/aws/aws-sdk-go-v2/service/polly/types"
)
func main() {
ctx := context.TODO()
// AWS認証情報セッティング
conf, err := config.LoadDefaultConfig(
ctx,
config.WithSharedConfigProfile("default"), // 任意のクレデンシャル設定
)
if err != nil {
log.Fatal(err)
return
}
// polly音声合成処理
client := polly.NewFromConfig(conf)
res, err := client.SynthesizeSpeech(ctx, &polly.SynthesizeSpeechInput{
OutputFormat: types.OutputFormat("mp3"),
Text: aws.String("音声合成のテスト文字列です"),
VoiceId: types.VoiceId("Mizuki"),
})
if err != nil {
log.Fatal(err)
return
}
// 音声データを取得
a, err := io.ReadAll(res.AudioStream)
if err != nil {
log.Fatal(err)
return
}
// 音声データをファイル出力
if err = os.WriteFile("TTS.mp3", a, 0644); err != nil {
log.Fatal(err)
return
}
}
音声合成処理ということで、複雑な処理になるかなと思ったのですが、いざ書いてみるとシンプルなコードで書くことができました。
実行結果
サンプルコードを実行して出来上がった音声がこちら
今回はサンプルなので、とても寂しい音声データにはなりますが、無事テキストを音声に変換することができました!
料金や各種制限について
気になる料金についてですが、以下のようになっており、サンプル的な利用であれば無料枠で使用可能です。
・標準品質:
最初のリクエストから12か月間は1か月あたり500万文字無料
無料枠超過後は、100万文字当たり4ドル
・高品質:
最初のリクエストから12か月間は1か月あたり100万文字無料
無料枠超過後は、100万文字当たり16ドル
料金のことはもちろん、それ以外についても、以下記事で詳しく解説しているのでこちらの記事もよければご覧ください。
4つの観点からAmazon Polly と GCP Text-To-Speech を比較してみる – 脱SESした甘党エンジニアブログ (chocolate-spray-engineer.com)
まとめ
以上、Amazon Polly×golang(aws-sdk-go-v2) を試してみた際のコード紹介でした。
サービス利用する際は、もっと色々な処理や、細かい設定値を確認していく必要がありますが、
とりあえずサンプル的に音声合成を行うだけであれば、非常にシンプルなコードで書くことができました!
AWS周りは、仕様書を眺めても中々理解しにくい部分があったりしますので、本記事が少しでも参考になれば幸いです。
コメント