AWS SDK for Goを使ってTwitterのPublic streamをAmazon Pollyに読み上げさせる

eyecatch-rekognition

はじめに

昨日に引き続きAWS SDK for Goの話です。今日はAWS SDK for Goを使ってTwitterPublic streamsAmazon Pollyに読み上げさせてみました。

やってみた

Golang環境の導入

Golang及びAWS SDK for Goの導入については昨日の記事を参照下さい。今回追加で使っているライブラリはanacondaなので、go getでインストールしておきます。

go get github.com/ChimeraCoder/anaconda

スクリプトを作成

以下のスクリプトを書きました。細かい内容はコメントで書いてあります。

package main

import (
	"fmt"
	"io/ioutil"
	"os"
	"os/exec"
	"strings"

	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/session"
	"github.com/aws/aws-sdk-go/service/polly"

	"github.com/ChimeraCoder/anaconda"
)

func main() {
	// AWSセッション作成
	sess := session.Must(session.NewSession())

	// Pollyクライアントを作成
	svc := polly.New(sess, aws.NewConfig().WithRegion("us-east-1"))

	// Twitter認証情報を取得。認証情報は環境変数でセットしておく。
	consumerKey := os.Getenv("TWITER_CONSUMER_KEY")
	consumerSecret := os.Getenv("TWITER_CONSUMER_SECRET")
	AccessToken := os.Getenv("TWITER_ACCESS_TOKEN")
	AccessTokenSecret := os.Getenv("TWITER_ACCESS_TOKEN_SECRET")

	// Twitter認証
	anaconda.SetConsumerKey(consumerKey)
	anaconda.SetConsumerSecret(consumerSecret)
	api := anaconda.NewTwitterApi(AccessToken, AccessTokenSecret)

	// TwitterのPublicStream(statuses/sample)を取得
	twitterStream := api.PublicStreamSample(nil)

	for {
		// データを取得
		data := <-twitterStream.C

		switch tweet := data.(type) {
		// Tweetの場合
		case anaconda.Tweet:

			// URLが含まれているTweetは除外
			if strings.Contains(tweet.Text, "http") == true {
				continue
			}

			// SynthesizeSpeechに渡すパラメータを設定
			params := &polly.SynthesizeSpeechInput{
				OutputFormat: aws.String("mp3"),
				Text:         aws.String(tweet.Text),
				VoiceId:      aws.String("Mizuki"),
			}

			// polly.SynthesizeSpeechを実行
			resp, err := svc.SynthesizeSpeech(params)
			if err != nil {
				fmt.Println(err.Error())
				return
			}

			// 結果をmp3ファイルで出力
			content, err := ioutil.ReadAll(resp.AudioStream)
			ioutil.WriteFile("/tmp/gopolly.mp3", content, os.ModePerm)

			// mp3ファイルを再生
			exerr := exec.Command("afplay", "/tmp/gopolly.mp3").Run()
			if exerr != nil {
				fmt.Println(exerr.Error())
				return
			}

		default:
		}
	}

}

作成したスクリプトはgo fmtで整形します。

$ go fmt gopolly.go

そしてbuildします。

$ go build

バイナリが出来上がります。

$ ls
gopolly    gopolly.go

バイナリを実行

$ ./gopolly

実行結果はこんな感じになって、延々再生され続けます。

ということでちゃんと実行されました!

さいごに

anacondaでPublic streamsを取得する際、languagesの指定は出来ないようです。何か良い方法があればぜひ教えてください。しかし、いやーコード書くの楽しいです。特にこういう何にも役立たないのを作ってるときが一番楽しいですね。

AWS Cloud Roadshow 2017 福岡