swift AVSpeechSynthesizer无法在iOS10上运行

7jmck4yq  于 2023-06-04  发布在  Swift
关注(0)|答案(7)|浏览(270)

我的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

有人知道如何解决这个问题吗?我知道有一些变通方法(例如,用户必须转到设置->通用并切换说话选择),但我不认为这是一个真实的的解决方案。

**更新:**我创建了一个新项目(XCode 8/Swift 3/没有其他pod/frameworks等)。它在模拟器中工作,但在我的设备上给我同样的错误。
**更新2:**可在设备上运行。我也有类似的错误消息(无法复制资产属性等),但它现在有效。我不知道那是什么

cidc1ykv

cidc1ykv1#

关闭静音模式(物理开关)。在我的情况下它工作。

ctehm74n

ctehm74n2#

我刚刚在iPad Mini 4上遇到了同样的问题。此版本没有物理交换机。但是如果你打开控制中心(向上滑动),有一个静音按钮。关闭此功能,问题会自行修复。

6uxekuva

6uxekuva3#

在我的项目中,虽然我在初始化后合成第一句话时遇到了麻烦,但我能够通过重新排列代码来解决这个问题。但是,当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 bug,其中I just did:(

e7arh2l6

e7arh2l64#

在我的场景中,我可以通过在iPhone中启用Internet连接来解决这个问题。
语音识别器只能识别一种语言。使用默认初始值设定项时,如果设备的当前区域设置支持识别器,则会获得该区域设置的语音识别器。请注意,支持的语音识别器与可用的语音识别器不同;例如,某些地区的识别器可能需要因特网连接。可以使用supportedLocales()方法获取支持的区域设置列表,使用isAvailable属性查看特定区域设置的识别器是否可用。
Source

vsnjm48y

vsnjm48y5#

我已经尝试你的代码只有一个变化和它的工作。试试这个

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)
xfb7svmp

xfb7svmp6#

对我来说,一个类似的问题通过将语言改为“es”(我的设备是西班牙语的)得到了解决,然后它就工作了。但我想要的是英语的声音,它没有英国口音。事实证明,在我的设备中,我在首选项/可访问性/画外音/转子语言中选择了Niky的语音,但没有下载(可能在很长一段时间不使用它后自动删除)。我选择了亚历克斯,默认的一个,它的工作。

kiayqfof

kiayqfof7#

试试这个

import Foundation
import AVFoundation

let synthesizer = AVSpeechSynthesizer() //initialize synthesizer outside the function.

func speak(text: String) {
    let utterance = AVSpeechUtterance(string: text)
    utterance.voice = AVSpeechSynthesisVoice(language: "en-US")

    synth.speak(utterance)
}

相关问题