获取文本到语音以从数组中读取项目



我现在有线程在工作,所以我可以开始读取数组的一部分并使用按钮来停止它。 问题是我无法重新开始阅读。 有什么想法吗? 非常感谢以前帮助过的人。

import UIKit
import AVFoundation
var jj = 1
var writeString = "English Key Words#Alliteration - first sound in the word the same - ask Andrew#Rhyme - words end in the same sound - Black Jack#Rhythm – beat, regularity – di-da-di-da-di-da#Syllable – sound parts of a word – Happily – 3 syllables#Simile – like – the rain was like a drum on the roof#Metaphor – no ‘like’ – the rain was a drum on the roof#"
var noteArray = writeString.components(separatedBy: "#")
class ViewController: UIViewController {
    @IBAction func stop(_ sender: UIButton) {
        jj=0
        print(jj)
    }
    @IBAction func startIt(_ sender: UIButton) {
        DispatchQueue.global(qos: .userInteractive).async{
            while jj == 1 {
                for i in 27...29{
                    let string = noteArray[i]
                    let utterance = AVSpeechUtterance(string: string)
                    utterance.voice = AVSpeechSynthesisVoice(language: "en-GB")
                    let synthesizer = AVSpeechSynthesizer()
                    synthesizer.speak(utterance)
                    sleep(1)
            }
            sleep(5)
        }
        }
    }
   override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}

这里的问题是您尚未实现AVSpeechSynthesizerDelegate

可以使用它来确定一个语句何时完成,然后播放另一个语句。

因此,这里有一个完整的工作示例:

import UIKit
import AVFoundation
extension ViewController: AVSpeechSynthesizerDelegate{
func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didFinish      utterance: AVSpeechUtterance) {
    audioIndex += 1
    if audioIndex != noteArray.count{
        playWord(noteArray[audioIndex])
     } 
   }
 }
class ViewController: UIViewController {
//1. Create A Speech Utterance To Read Our Words
var wordReader: AVSpeechUtterance!
//2. Create The Speech Synthesizer
let speechSynthesizer = AVSpeechSynthesizer()
//3. Create The Names To Be Read
var noteArray = ["James","John","Jack","Jarred"]
//4. Store Out Current Audio File
var audioIndex = 0

override func viewDidLoad() {
    super.viewDidLoad()
    //1. Assign The SpeechSynteziser Delegate
    speechSynthesizer.delegate = self
    //2. Play The 1st Word
    playWord(noteArray[audioIndex])
}

/// Reads The Word
///
/// - Parameter word: String
func playWord(_ word: String){
        //3. Read The Word
        wordReader = AVSpeechUtterance(string: word)
        wordReader.rate = 0.5
        wordReader.volume = 1
        speechSynthesizer.speak(wordReader)
  }
}

更新:

假设我已经解释了您更新的问题,这应该可以让您开始:

   import UIKit
   import AVFoundation
   //----------------
   //MARK: Delegation
   //----------------
   extension ViewController: AVSpeechSynthesizerDelegate{
  func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didFinish      utterance: AVSpeechUtterance) {
    //1. Increase The Audio Index
    audioIndex += 1
    //2. Only Play The Next Utterance If It Is In Range
    if audioIndex != noteArray.count{
        //3. Play After A Delay Of 1 Secong
        DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
             self.playWordAtIndex(self.audioIndex)
        }
      }
   }
 }
class ViewController: UIViewController {
//1. Create A Speech Utterance To Read Our Words
var wordReader: AVSpeechUtterance!
//2. Create The Speech Synthesizer
let speechSynthesizer = AVSpeechSynthesizer()
//3. Create The Names To Be Read
let writeString = "English Key Words#Alliteration - first sound in the word the same - ask Andrew#Rhyme - words end in the same sound - Black Jack#Rhythm – beat, regularity – di-da-di-da-di-da#Syllable – sound parts of a word – Happily – 3 syllables#Simile – like – the rain was like a drum on the roof#Metaphor – no ‘like’ – the rain was a drum on the roof#"
//4. Create An Array To Store These
var noteArray = [String]()
//4. Store Out Current Audio File
var audioIndex = 0

//-------------------
//MARK: View Lifecyle
//-------------------
override func viewDidLoad() {
    super.viewDidLoad()
    //1. Create The Notes Array From The Necessary Components
    noteArray = writeString.components(separatedBy: "#")
    //2. Assign The SpeechSynteziser Delegate
    speechSynthesizer.delegate = self

}
func playWordAtIndex(_ index: Int){
    //1. Read The Word At The Current Audio Index
    wordReader = AVSpeechUtterance(string: noteArray[index])
    wordReader.rate = 0.5
    wordReader.volume = 1
    speechSynthesizer.speak(wordReader)
}
//----------------------
//MARK: User Interaction
//----------------------

 /// Begins The Audio Sequence
 ///
 /// - Parameter sender: UIButton
 @IBAction func startIt(_ sender: UIButton) {
    //If We Are Still In Range Play The Next Utterance
    if audioIndex != noteArray.count{
        playWordAtIndex(audioIndex)
    }
 }

/// Stops The Audio & Resets The Variable
///
/// - Parameter sender: UIButton
@IBAction func stop(_ sender: UIButton) {
    //1. Reset The Audio Index Count
    audioIndex = 0
    speechSynthesizer.stopSpeaking(at: AVSpeechBoundary.immediate)
   }
}

相关内容

  • 没有找到相关文章

最新更新