Swift 中的 AVSpeechUtterance 和无语音/语音缺失
AVSpeechUtterance and no speech / missing speech in Swift
我目前正在使用 XCode 9.4.1 和 Swift 组装我的第一个应用程序。在我的代码中,我正在处理一个列表,我希望大声说出列表中的每个值。下面是我的代码
// classificationResults is my list
for returnedValue in self.classificationResults{
let utterance = AVSpeechUtterance(string: returnedValue)
utterance.voice = AVSpeechSynthesisVoice(language: "en-GB")
utterance.rate = 0.5
let synthesizer = AVSpeechSynthesizer()
synthesizer.speak(utterance)
// print(returnedValue)
当 运行 在模拟器中使用它时,它可以工作,但它只说允许列表中的第一个或两个值(有 7 个)。然后,当我直接在我的设备上 运行 时,什么也没有大声说出来。
有什么想法/建议吗?提前致谢
我已经实现了以下代码,通过使用 AVSpeechSynthesizer
将我的所有文本转换为语音。此代码为例,您可以通过您的代码尝试。
class TextToVoiceVC: UIViewController, AVSpeechSynthesizerDelegate {
var arrSpeechCount = ["One", "Two", "Three", "Four", "Five", "Six", "Seven"]
var count : Int = 0
let speechSynthesizer = AVSpeechSynthesizer()
//----------------------------------------------------------------
// MARK:- AVSpeechSynthesixerDelegate
//----------------------------------------------------------------
func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didStart utterance: AVSpeechUtterance) {
}
//----------------------------------------------------------------
func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didFinish utterance: AVSpeechUtterance) {
speechSynthesizer.stopSpeaking(at: .word)
count += 1
if count < arrSpeechCount.count {
let speechUtterance = AVSpeechUtterance(string: (arrSpeechCount[count]))
DispatchQueue.main.async {
self.speechSynthesizer.speak(speechUtterance)
}
}
}
//----------------------------------------------------------------
// MARK:- View Life Cycle Methods
//----------------------------------------------------------------
override func viewDidLoad() {
super.viewDidLoad()
speechSynthesizer.delegate = self
}
//----------------------------------------------------------------
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
// Code to start speech
if speechSynthesizer.isSpeaking {
speechSynthesizer.stopSpeaking(at: .immediate)
} else {
let speechUtterance = AVSpeechUtterance(string: (arrSpeechCount[count]))
DispatchQueue.main.async {
self.speechSynthesizer.speak(speechUtterance)
}
}
}
}
此代码在我的模拟器和设备中均有效。我希望这对你也有用。您应该尝试委托您的数据。
问题可能出在你的玩家生命周期:最重要的是要记住保留你的AVSpeechSynthesizer
实例,直到完成完整的演讲.
将您创建的合成器移出循环并使其保持活动状态直到演讲结束:这 也可能有所帮助。
我目前正在使用 XCode 9.4.1 和 Swift 组装我的第一个应用程序。在我的代码中,我正在处理一个列表,我希望大声说出列表中的每个值。下面是我的代码
// classificationResults is my list
for returnedValue in self.classificationResults{
let utterance = AVSpeechUtterance(string: returnedValue)
utterance.voice = AVSpeechSynthesisVoice(language: "en-GB")
utterance.rate = 0.5
let synthesizer = AVSpeechSynthesizer()
synthesizer.speak(utterance)
// print(returnedValue)
当 运行 在模拟器中使用它时,它可以工作,但它只说允许列表中的第一个或两个值(有 7 个)。然后,当我直接在我的设备上 运行 时,什么也没有大声说出来。
有什么想法/建议吗?提前致谢
我已经实现了以下代码,通过使用 AVSpeechSynthesizer
将我的所有文本转换为语音。此代码为例,您可以通过您的代码尝试。
class TextToVoiceVC: UIViewController, AVSpeechSynthesizerDelegate {
var arrSpeechCount = ["One", "Two", "Three", "Four", "Five", "Six", "Seven"]
var count : Int = 0
let speechSynthesizer = AVSpeechSynthesizer()
//----------------------------------------------------------------
// MARK:- AVSpeechSynthesixerDelegate
//----------------------------------------------------------------
func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didStart utterance: AVSpeechUtterance) {
}
//----------------------------------------------------------------
func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didFinish utterance: AVSpeechUtterance) {
speechSynthesizer.stopSpeaking(at: .word)
count += 1
if count < arrSpeechCount.count {
let speechUtterance = AVSpeechUtterance(string: (arrSpeechCount[count]))
DispatchQueue.main.async {
self.speechSynthesizer.speak(speechUtterance)
}
}
}
//----------------------------------------------------------------
// MARK:- View Life Cycle Methods
//----------------------------------------------------------------
override func viewDidLoad() {
super.viewDidLoad()
speechSynthesizer.delegate = self
}
//----------------------------------------------------------------
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
// Code to start speech
if speechSynthesizer.isSpeaking {
speechSynthesizer.stopSpeaking(at: .immediate)
} else {
let speechUtterance = AVSpeechUtterance(string: (arrSpeechCount[count]))
DispatchQueue.main.async {
self.speechSynthesizer.speak(speechUtterance)
}
}
}
}
此代码在我的模拟器和设备中均有效。我希望这对你也有用。您应该尝试委托您的数据。
问题可能出在你的玩家生命周期:最重要的是要记住保留你的AVSpeechSynthesizer
实例,直到完成完整的演讲.
将您创建的合成器移出循环并使其保持活动状态直到演讲结束:这