Amazon PollyをAWS SDK for iOSから使ってみる #reinvent

2016.12.01

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

1 はじめに

本日、AWS re:Invent 2016 の Keynote 1 で発表されたテキスト読み上げサービス「Amazon Polly」は、ここDevelopers.IOでも瞬殺でレポートされていました。


[新サービス]テキスト読み上げサービス「Amazon Polly」がリリースされました! #reinvent
Amazon PollyをAWS CLIから使ってみる #reinvent

私は、上記を参考にさせて頂いて、同サービスをSDKでiOSに組み込んで見ました。

2 リージョン

現在、Pollyが利用できるのリージョンは、下記のとおりです。

001

そして、Cognitoを利用できるのが、下記のリージョンです。この中でPollyが使用できるリージョンとして、今回は、US East(N. Virginia)を使用することにしました。

006

3 Federrated Identities

とりあえず、簡単に認証なしでpoolを作成しました。

002

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