Подтвердить что ты не робот

AVSpeechSynthesizer не работает на iOS10

Мой код AVSpeechSynthesizer не работает на устройстве (iOS 10), но он работал на iOS 9.x и теперь работает в симуляторе.

let str = self.audioOutput //just some string here, this string exists, and it 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

Кто-нибудь знает, как решить эту проблему? Я знаю, что есть некоторые обходные пути (пользователь должен пойти в Настройки- > Общие и переключить Speak Selection, например), но я не думаю, что это настоящее решение здесь.

Обновление: Я создал новый проект (XCode8/Swift3/no other pods/frameworks и т.д.). Он работает в симуляторе, но он дает мне те же ошибки на моем устройстве.

Обновление 2: Работает на устройстве. У меня есть аналогичные сообщения об ошибках (невозможно копировать атрибуты активов и т.д.), Но теперь это работает. Я не знаю, что это было.

4b9b3361

Ответ 1

Выключите свой бесшумный режим (физический переключатель). Это работает в моем случае.

Ответ 2

Я просто столкнулся с этой проблемой на iPad Mini 4. У этой версии нет физического переключателя. Но если вы откроете центр управления (проведите по экрану вверх), появится кнопка "Без звука". Выключите это, и проблема будет исправлена.

введите описание изображения здесь

Ответ 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

Я воспроизвел это в небольшом демонстрационном проекте и не смог найти обходной путь. К сожалению, я боюсь, что правильный ответ на этот вопрос - файл с ошибкой, который Я просто сделал: (

Ответ 4

Я попробовал свой код только с одним изменением и его работой. Попробуйте это раз

 synth.speak(utterance)

Весь мой код похож на

**`import  AVFoundation`**


        let str = "once" //just some string here, this string exists, and it 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)

Ответ 5

В моем сценарии я мог бы решить эту проблему, включив Подключение к Интернету в iPhone.

Функция распознавания речи распознает только один язык. Когда вы используете инициализатор по умолчанию, вы получаете распознаватель речи для устройства текущая локаль, если для этого языкового стандарта поддерживается распознаватель. Заметка что поддерживаемый распознаватель речи не совпадает с доступным распознаватель речи; например, распознаватели для некоторых локалей могут требуется подключение к Интернету. Вы можете использовать поддерживаемыеLocales() метод для получения списка поддерживаемых локалей и isAvailable чтобы узнать, распознает ли распознаватель для определенной локали доступны.

Источник