AVSpeechSynthesizer で英語→日本語→英語→日本語と交互に話すアプリを作ってみました。AVSpeechSynthesizer は一個の String を喋ると終了してしまいます。複数の String や複数の言語を喋らせるには工夫が必要です。
以下のコードをコピペして IBAction func speechButtonPushed() を画面のスピーチボタンに紐付けます。
import UIKit
import AVFoundation
class ViewController: UIViewController, AVSpeechSynthesizerDelegate {
let synthesizer = AVSpeechSynthesizer()
var speechCounter = 0
var speechText = [String]()
override func viewDidLoad() {
super.viewDidLoad()
synthesizer.delegate = self
let english = "alternately"
let japanese = "交互に"
let sentence = "This app speaks English and Japanese alternately."
let yaku = "このアプリは英語と日本語を交互に話します。"
speechText = [english,japanese,sentence,yaku]
}
@IBAction func speechButtonPushed(){
speechCounter = 0
speech(text: speechText[0])
}
func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didFinish utterance: AVSpeechUtterance) {
speechCounter += 1
guard speechCounter < speechText.count else {return}
speech(text: speechText[speechCounter])
}
func speech(text: String) {
let utterance = AVSpeechUtterance(string: text)
switch speechCounter {
case 0, 2:
utterance.voice = AVSpeechSynthesisVoice(language: "en-US")
case 1, 3:
utterance.voice = AVSpeechSynthesisVoice(language: "ja-JP")
default:
break
}
synthesizer.speak(utterance)
}
}