Amazon PollyをAWS SDK for iOSから使ってみる #reinvent
1 はじめに
本日、AWS re:Invent 2016 の Keynote 1 で発表されたテキスト読み上げサービス「Amazon Polly」は、ここDevelopers.IOでも瞬殺でレポートされていました。
[新サービス]テキスト読み上げサービス「Amazon Polly」がリリースされました! #reinvent
Amazon PollyをAWS CLIから使ってみる #reinvent
私は、上記を参考にさせて頂いて、同サービスをSDKでiOSに組み込んで見ました。
2 リージョン
現在、Pollyが利用できるのリージョンは、下記のとおりです。
そして、Cognitoを利用できるのが、下記のリージョンです。この中でPollyが使用できるリージョンとして、今回は、US East(N. Virginia)を使用することにしました。
3 Federrated Identities
とりあえず、簡単に認証なしでpoolを作成しました。
roleは、次のようにpollyを全部Allowにしています。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "polly:*" ], "Resource": [ "*" ] } ] }
4 CocoaPods
SDKは、CocoaPodsで導入できました。(見つからなかったら、一度 pod updateしてみて下さい)
pod 'AWSPolly'
依存関係で、AWSCoreと一緒にインストールされます。
$ pod install Analyzing dependencies Downloading dependencies Installing AWSCore (2.4.13) Installing AWSPolly (2.4.13) Generating Pods project Integrating client project [!] Please close any current Xcode sessions and use `PollySample.xcworkspace` for this project from now on. Sending stats Pod installation complete! There is 1 dependency from the Podfile and 2 total pods installed.
5 実装
画面は、UITextFieldとUIBttonを配置しただけの簡単なものです。
import UIKit import AWSCore import AVFoundation import AWSPolly class ViewController: UIViewController { @IBOutlet weak var textField: UITextView! var audioPlayer = AVPlayer() override func viewDidLoad() { super.viewDidLoad() let credentialsProvider = AWSCognitoCredentialsProvider(regionType:.usEast1, identityPoolId:"us-east-1:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX") let configuration = AWSServiceConfiguration(region:.usEast1, credentialsProvider:credentialsProvider) AWSServiceManager.default().defaultServiceConfiguration = configuration } @IBAction func tapButton(_ sender: Any) { let input = AWSPollySynthesizeSpeechURLBuilderRequest() input.text = self.textField.text input.outputFormat = AWSPollyOutputFormat.mp3 input.voiceId = AWSPollyVoiceId.joanna let builder = AWSPollySynthesizeSpeechURLBuilder.default().getPreSignedURL(input) builder.continue(successBlock: { (awsTask: AWSTask<NSURL>) -> Any? in let url = awsTask.result! self.audioPlayer.replaceCurrentItem(with: AVPlayerItem(url: url as URL)) self.audioPlayer.play() return nil }) } }
viewDidLoadで、AWSServiceManagerを初期化し、ボタンを押した際に、AWSPollySynthesizeSpeechURLBuilderでテキストを読み上げています。
なお、APIからは、一旦mp3で受け取り、それをAVPlayerで再生しています。
6 動作確認
ボタンを押してから、読み上げるまでに、ちょっとタイムラグがあります。 テキストを長くしても、短くしても、このタイムラグはあまり変わりませんでした。
7 最後に
まだ、日本語は1種類しかありませんでしたが、この後、バラエティーが増え、近くのリージョンでも利用できるようになると、色々面白くなるような予感がします。
8 参考資料
amazon-polly-sample https://github.com/awslabs/amazon-polly-sample