iPhoneでみずきちゃんとチュッチュしたいだけの人生だった(AWS Polly + Swift)

  • 10
    Like
  • 0
    Comment

3次元で合成音声話す女子がいたら今すぐ連絡ください。
ペッパーはだめです。

というわけでやっていきます。

AWS Polly

いろんな言語を話してくれる音声合成AIです。AIに入るの?
CLIからの利用記事が目立ちますが、今回はどうしてもiPhoneにいれて好きな言葉を話させたかったので、swiftでラッパーを作りました。
ちなみにVersionが違うせいか公式docのままじゃ動きません。

手元の環境

  • iOS = 10.0
  • Xcode = 8.2
  • Swift = 2.2

構築手順

  • CognitoIdentityPoolをつくる
    enable access to unauthenticated identities みたいなのにチェックいれとく
  • サービスクラスをつくる
import Foundation
import UIKit
import AVFoundation
import AWSCore
import AWSPolly
import AWSCognito

class AudioGuidanceService: UIViewController, NSURLSessionDownloadDelegate {
    var audioPlayer = AVAudioPlayer()

    func say(message: String) {
        let credentialsProvider = AWSCognitoCredentialsProvider(
            regionType: .USWest2,
            identityPoolId: "作成したPoolID"
        )

        // 匿名で認証する
        let configuration = AWSServiceConfiguration(region: .USWest2, credentialsProvider: credentialsProvider)
        AWSServiceManager.defaultServiceManager().defaultServiceConfiguration = configuration

        // みずきちゃんフォーマットを組み立てる
        let input = AWSPollySynthesizeSpeechURLBuilderRequest()

        input.textType = AWSPollyTextType.Text
        input.text = message
        input.outputFormat = AWSPollyOutputFormat.Mp3
        input.voiceId = AWSPollyVoiceId.Mizuki

        let builder = AWSPollySynthesizeSpeechURLBuilder.defaultPollySynthesizeSpeechURLBuilder().getPreSignedURL(input)

        // みずきちゃん召喚!
        builder.continueWithSuccessBlock({ (awsTask: AWSTask) in
            let result = awsTask.result! as! NSURL

            let config: NSURLSessionConfiguration = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier("backgroundSession")
            let session: NSURLSession = NSURLSession(configuration: config, delegate: self, delegateQueue: nil)

            let url: NSURL = result
            let request: NSURLRequest = NSURLRequest(URL: url)
            let task:NSURLSessionDownloadTask = session.downloadTaskWithRequest(request)

            // タスクを実行.
            task.resume()

            return nil
        })
    }

    // みずきちゃん召喚後の実体に喋らせる
    func URLSession(
        session: NSURLSession,
        downloadTask: NSURLSessionDownloadTask,
        didFinishDownloadingToURL url: NSURL) {
        do {

            self.audioPlayer = try AVAudioPlayer(contentsOfURL: url)

            self.audioPlayer.prepareToPlay()
            self.audioPlayer.play()
        } catch let error as NSError {
            print(error)
        } catch {
            print("error")
        }
    }
}
  • 利用する
var audio = AudioGuidanceService()
audio.say("はろーわーるど!!")

余談

swift歴2週間なので変なところがあったらご指摘ください!

ちなみに 4 の発音が疑問形っぽくなってかわいい。