しゃべらせつつ口パクアニメーション
Siriにしゃべらせつつ口パクアニメーションを同期させるのを試してみました。
とはいっても、母音に合わせてアニメーションの口を変える・・・などということはしていません(汗
本来はまばたきは目が開いている画像・半目の画像・閉じてる画像の3枚が良いのですが、サンプルで作ったものは人間キャラのアニメーションでは
なかったので、2枚にしてあります。
また、目を開いた状態・半目・閉じた状態の3つのアニメーションのタイミングを個々に細かく記述することが難しかったため、
力技でやっています。
いい方法があればご教授ください。
目を開いた状態・半目・閉じた状態のアニメーションを作る場合は、開いた状態が2秒・半目が0.1秒・閉じた状態が0.1秒くらいです。
なので今回は開いた状態が2秒・閉じた状態が0.2秒にしています。
準備:
1.まばたき用の静止画2枚(目が開いてる画像と閉じてる画像)・口パク静止画(口開けた画像と閉じた画像)を用意し、Imageviewを配置
2.AVFoundationのフレームワークを読み込ませておく
import UIKit import AVFoundation //SpeechSynthesizerクラス var talker = AVSpeechSynthesizer() class ViewController: UIViewController,AVSpeechSynthesizerDelegate { //Siriにしゃべらせる準備 var talker = AVSpeechSynthesizer() @IBOutlet weak var eyesOnPict: UIImageView! @IBOutlet weak var mousePict: UIImageView! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. //まばたきアニメーション 開いた状態が2秒・閉じた状態が0.2秒 //アニメーション画像の準備 var imgArray:[UIImage!] = [ UIImage(named: "BigeyeNormal.png"), UIImage(named: "BigeyeNormal.png"), UIImage(named: "BigeyeNormal.png"), UIImage(named: "BigeyeNormal.png"), UIImage(named: "BigeyeNormal.png"), UIImage(named: "BigeyeNormal.png"), UIImage(named: "BigeyeNormal.png"), UIImage(named: "BigeyeNormal.png"), UIImage(named: "BigeyeNormal.png"), UIImage(named: "BigeyeNormal.png"), UIImage(named: "BigeyeNormalZzz.png")] //アニメーション画像の設定 eyesOnPict.animationImages = imgArray //アニメーション全体の秒数 eyesOnPict.animationDuration = 2.2 //繰り返しは無限にするため0をセット eyesOnPict.animationRepeatCount = 0 //アニメーションスタート eyesOnPict.startAnimating() talker.delegate = self //口パクアニメーション //画像の準備 var imgArray2:[UIImage!] = [ UIImage(named: "mouse1.png"), UIImage(named: "mouse2.png")] //アニメーション画像の設定 mousePict.animationImages = imgArray2 //アニメーション全体の秒数 mousePict.animationDuration = 0.8 //繰り返しは無限にするため0をセット mousePict.animationRepeatCount = 0 speakBig() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } override func prefersStatusBarHidden() -> Bool { return true } //おしゃべりがスタートしたらどうするか func speechSynthesizer(synthesizer: AVSpeechSynthesizer!, didStartSpeechUtterance utterance: AVSpeechUtterance!) { //アニメーションスタート mousePict.startAnimating() } //おしゃべりが終わったらどうするか func speechSynthesizer(synthesizer: AVSpeechSynthesizer!, didFinishSpeechUtterance utterance: AVSpeechUtterance!) { // アニメーション終了 mousePict.stopAnimating() } func speakBig() { let speak1 = AVSpeechUtterance(string:"結局テクノロジーの歴史は欲の歴史なんだよねえ") // 言語を日本に設定 speak1.voice = AVSpeechSynthesisVoice(language: "ja-JP") //しゃべる速度 数値が大きくなるほど早い speak1.rate = 0.2 //声の高さ 数値が大きくなるほど高い speak1.pitchMultiplier = 0.4 // 実行 talker.speakUtterance(speak1) } }