AVSpeechSynthesizer不能在iOS10

时间:2016-10-05 16:27:09

标签: ios swift avspeechsynthesizer

我的AVSpeechSynthesizer代码无法在设备上运行(iOS 10),但它可以在iOS 9.x上运行,现在可以在模拟器中运行。

let str = self.audioOutput //just some string here, this string exists, and it's in english
let synth = AVSpeechSynthesizer()
let utterance = AVSpeechUtterance(string: str)
    utterance.rate = AVSpeechUtteranceDefaultSpeechRate
let lang = "en-US"

utterance.voice = AVSpeechSynthesisVoice(language: lang)
synth.speakUtterance(utterance)

我收到此错误:

MobileAssetError:1] Unable to copy asset attributes
Could not get attribute 'LocalURL': Error Domain=MobileAssetError Code=1 "Unable to copy asset attributes"
UserInfo={NSDescription=Unable to copy asset attributes}
0x1741495e0 Copy assets attributes reply: XPC_TYPE_DICTIONARY  <dictionary: 0x1741495e0> { count = 1, transaction: 0, voucher = 0x0, contents =
"Result" => <int64: 0x1744203a0>: 1}

之前有类似的错误消息:

Unable to copy asset information from https://mesu.apple.com/assets/ for asset type

有谁知道如何解决这个问题?我知道有一些解决方法(例如,用户必须转到“设置” - >“常规”并切换“说出选择”),但我认为这不是一个真正的解决方案。

更新:我创建了一个新项目(XCode8 / Swift3 /没有其他pod /框架等等)。它在模拟器中工作,但它在我的设备上给了我相同的错误。

更新2:适用于设备。我有类似的错误消息(无法复制资产属性等),但它现在有效。我不知道它是什么。

6 个答案:

答案 0 :(得分:20)

关闭静音模式(物理开关)。 它适用于我的情况。

答案 1 :(得分:5)

我刚刚在iPad Mini 4上遇到过同样的问题。这个版本没有物理开关。但是如果你打开控制中心(向上滑动),就会出现一个静音按钮。关闭它,问题就解决了。

enter image description here

答案 2 :(得分:3)

在我的项目中,虽然在初始化后我无法通过合成来产生第一个话语,但我能够通过重新排列代码来解决这个问题。但是当AVSpeechSynthesizer初始化时,以及第一次产生话语时,我仍然会向控制台喷出数十行垃圾。这是一个小样本:

2016-12-27 06:45:08.579510 SpeechBug1226[2155:859123] [MobileAssetError:1] Unable to copy asset attributes
2016-12-27 06:45:08.580248 SpeechBug1226[2155:859123] Could not get attribute 'LocalURL': Error Domain=MobileAssetError Code=1 "Unable to copy asset attributes" UserInfo={NSDescription=Unable to copy asset attributes}
2016-12-27 06:45:08.585959 SpeechBug1226[2155:859123] 0x174157fa0 Copy matching assets reply: XPC_TYPE_DICTIONARY  <dictionary: 0x174157fa0> { count = 2, transaction: 0, voucher = 0x0, contents =
"Assets" => <data: 0x17426c700>: { length = 1237 bytes, contents = 0x62706c6973743030d4010203040506636458247665727369... }
"Result" => <int64: 0x174220180>: 0

我在small demo project中复制了此内容,但无法找到解决方法。可悲的是,我担心这个问题的正确答案是file a bugI just did :(

答案 3 :(得分:1)

我只需要进行一次更改即可尝试您的代码。尝试一次

 synth.speak(utterance)

我的整个代码就像

**`import  AVFoundation`**


        let str = "once" //just some string here, this string exists, and it's in english
        let synth = AVSpeechSynthesizer()
        let utterance = AVSpeechUtterance(string: str)
        utterance.rate = AVSpeechUtteranceDefaultSpeechRate
        let lang = "en-US"

        utterance.voice = AVSpeechSynthesisVoice(language: lang)
        synth.speak(utterance)

答案 4 :(得分:1)

在我的方案中,我可以通过在iPhone中启用 Internet连接来解决此问题。

  

语音识别器只识别一种语言。当你使用   默认初始值设定项,您将获得设备的语音识别器   当前区域设置,如果该区域设置支持识别器。注意   支持的语音识别器与可用的语音识别器不同   语音识别器;例如,某些区域设置的识别器可能   需要互联网连接。你可以使用supportedLocales()   获取受支持的语言环境列表和isAvailable的方法   找出特定区域设置的识别器的属性   可用。

Source

答案 5 :(得分:0)

对我来说,类似的问题也解决了,方法是将语言更改为“ es”(我的设备使用西班牙语),然后就可以了。 但是我想用英语发声,但声音不讲英语。 事实证明,在我的设备中,我使用了偏好/可访问性/ voiceOver /转子语言,但Niky选择了语音,但并未下载(很长时间不使用后,它会自动删除)。我选择了Alex,它是默认的,并且有效。