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

Мой код 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/без других модулей/фреймворков и т. д.). Он работает в симуляторе, но на моем устройстве выдает те же ошибки.

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


person lithium    schedule 05.10.2016    source источник
comment
в своем коде попробуйте проверить, существует ли ваш AVSpeechSynthesisVoice(language: lang), если нет .. попробуйте другой язык   -  person TonyMkenu    schedule 06.10.2016
comment
я пробовал что-то вроде этого: let voices = AVSpeechSynthesisVoice.speechVoices() для голоса в голосе { print((voice.language)) print((voice.name)) print((voice.identifier)) } этого достаточно? У меня есть en-US в этом списке.   -  person lithium    schedule 06.10.2016
comment
попробуйте это: guard let voice = AVSpeechSynthesisVoice(identifier: AVSpeechSynthesisVoiceIdentifierAlex) else { return } вместо AVSpeechSynthesisVoice(language: lang)   -  person TonyMkenu    schedule 06.10.2016
comment
нет звука (устройство/симулятор). устройство: [MobileAssetError:1] Невозможно скопировать атрибуты актива 2016-10-06 12:02:13.537430[736:157767] Не удалось получить атрибут «LocalURL»: Error Domain=MobileAssetError Code=1 Невозможно скопировать атрибуты актива UserInfo={ NSDescription=Невозможно скопировать атрибуты актива}   -  person lithium    schedule 06.10.2016
comment
симулятор: [SpeechManager] -[AXSpeechManager _initialize]:339 Создан синтезатор: ‹TTSSpeechSynthesizer: 0x608000116a40› 2016-10-06 12:04:43.632880 MyApp[74183:4880945] [SpeechManager] -[AXSpeechManager _dispatch:6SpeechA queue] : -› 0 2016-10-06 12:04:43.633268 MyApp[74183:4880945] [SpeechManager] -[AXSpeechManager _dispatchSpeechAction:]:667 Указание синтезатору остановиться, потому что это задание не хочет ставиться в очередь и т. д.   -  person lithium    schedule 06.10.2016
comment
Если вы считаете, что видите ошибку, обязательно откройте отчет об ошибке на странице bugreport.apple.com.   -  person Leo Natan    schedule 07.10.2016
comment
убедитесь, что устройство НЕ находится в беззвучном режиме :D. На самом деле, это произошло с одним из наших клиентов.   -  person Ahmad F    schedule 13.10.2016
comment
@lithium Попробуйте мой ответ один раз. У меня работает в IOS 10   -  person Jitendra Modi    schedule 14.10.2016
comment
@lithium Я получаю ту же ошибку «Невозможно скопировать», что и вы, но звук на устройстве воспроизводится нормально. Можете ли вы попробовать бета-версию iOS 10.1, чтобы увидеть, воспроизводит ли она? Возможно проблема с iOS 10.0.   -  person Leo Natan    schedule 14.10.2016
comment
@Leo Natan, к сожалению, нет, сейчас у меня нет бета-версии iOS 10.1 (и у меня нет бесплатного устройства для ее установки). Но теперь у меня есть звук.   -  person lithium    schedule 14.10.2016
comment
Что изменилось с тех пор?   -  person Leo Natan    schedule 14.10.2016
comment
На самом деле ничего. Я создал функцию для воспроизведения mp3-файлов (на всякий случай) и добавил/убрал несколько кокоаподов (appsflyer). Я не верю, что эти действия как-то связаны с проблемой отсутствия звука.   -  person lithium    schedule 14.10.2016
comment
Я так не думаю. Возможно, голос еще не был загружен. iOS загружает голоса по запросу в фоновом режиме.   -  person Leo Natan    schedule 14.10.2016
comment
литий, какие-либо обновления в отчете об ошибке? Судя по вашему последнему комментарию, у вас это уже сработало? @LeoNatan, ты смог заставить это работать? У меня все еще та же ошибка. В моем файле нет кокоаподов или каких-либо надстроек, только стартовый файл. Спасибо   -  person nycdanie    schedule 30.10.2016
comment
У меня такая же проблема.   -  person Henry    schedule 20.11.2016


Ответы (6)


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

person kaka    schedule 26.11.2016
comment
Смущает то, что физическая кнопка не отключает все. [aAVAudioPlayer play] воспроизводит звук... вот почему его нелегко распознать... tx - person Billy; 20.06.2019
comment
Ты искренне задаешься вопросом, не сходишь ли ты с ума, а потом происходит что-то вроде этого. Спасибо случайному интернет-незнакомцу! - person Daniel Soutar; 07.10.2020

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

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

person Carsten    schedule 16.01.2017
comment
Проблемы не решаются сами собой. - person RegularExpression; 13.09.2017

В моем проекте, хотя у меня были проблемы с получением синтеза для создания первого высказывания после инициализации, я смог обойти это, изменив код. Но у меня все еще есть десятки строк мусора, выбрасываемых на консоль, когда 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

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

person Jerry Krinock    schedule 27.12.2016
comment
Спасибо. Это доказывает, что я не схожу с ума. Ничего не нашел об этом, поэтому подумал, что это мой код. Также сделал демонстрационный проект, чтобы воспроизвести его, так что подумал, что это из-за моего конкретного устройства или чего-то еще. Зависает ли он на мгновение (блокировка основного потока) при инициализации и для вас? - person Thermometer; 09.01.2017
comment
@Thermometer, я этого не заметил, потому что, конечно, я создаю только один AVSpeechSynthesizer в своем приложении и повторно использую его. Я просто добавил некоторый код для измерения и обнаружил, что AVSpeechSynthesizer() блокируется в течение 1,2 секунды в симуляторе iPhone 5 и 1,6 секунды в моем реальном iPad Mini. Действительно, это выглядит очень плохо. Это то, что вы подразумеваете под моментом? - person Jerry Krinock; 09.01.2017
comment
Да, точно! Хорошо, что вы измерили это, 1,2 секунды сопоставимы с зависанием, которое я испытываю. Я обнаружил это, когда открытие модального контроллера просмотра заняло ~ 1,5 секунды. Оказалось, что это просто инициализация AVSpeechSynthesizer в viewDidLoad. - person Thermometer; 09.01.2017
comment
Очень хорошо, @Thermometer. Я только что добавил код регистрации производительности в свой демонстрационный проект и дополнительную информацию в свой отчет об ошибках Apple, жалуясь на низкую производительность. Я надеюсь, что это привлечет их внимание! - person Jerry Krinock; 09.01.2017

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

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

Источник

person Shrawan    schedule 10.08.2017

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

 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)
person Jitendra Modi    schedule 14.10.2016
comment
Это изменение связано со Swift 3 (по сравнению со Swift 2.3 в авторском коде). Как он предлагает решение проблемы? - person Leo Natan; 14.10.2016
comment
Язык не меняет поведение фреймворков. Swift 2.3 или Swift 3.0, они оба называют внутренними фреймворками, написанными на Objective C. Эта проблема не имеет ничего общего с используемым языком. - person Leo Natan; 14.10.2016
comment
Вы чушь пишете. Вы можете разрабатывать Swift 2.3 в Xcode 8 и запускать приложения, написанные в Xcode 7, на iOS 10. - person Leo Natan; 14.10.2016
comment
Проблема в том, что он не воспроизводится. Вы можете написать его в Xcode 7 или 8, Objective C, Swift 2.3, Swift 3.0 или Swift 1.1; оно работает. У автора есть конкретная проблема, которую вы не видите на своем устройстве. - person Leo Natan; 14.10.2016
comment
@LeoNatan Извините за беспокойство. Я должен был узнать от тебя что-то новое. Спасибо. - person Jitendra Modi; 14.10.2016
comment
@LeoNatan Просто попробуйте этот код в iOS 10. Вы можете увидеть вывод без ошибок, о которых он упоминал. Еще раз извините - person Jitendra Modi; 14.10.2016
comment
У меня такой же код и ошибки появляются, но я тоже слышу звук. - person Leo Natan; 14.10.2016

Аналогичная проблема у меня решилась сменой языка на es (у меня аппарат на испанском), тогда заработало. Но я хотел, чтобы голос был на английском, а он не говорил с английским акцентом. Оказывается, в моем устройстве у меня в настройках/доступности/VoiceOver/роторных языках был выбран голос Ники, но он не загружался (вероятно, удалялся автоматически после долгого неиспользования). Я выбрал Алекса по умолчанию, и это сработало.

person user2888102    schedule 06.07.2020