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