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: работает на устройстве. У меня есть похожие сообщения об ошибках (невозможно скопировать атрибуты ресурса и т. Д.), Но пока это работает. Я не знаю что это было
7 ответов
Выключите ваш тихий режим (физический переключатель). Это работает в моем случае.
Я столкнулся с этой же проблемой на iPad Mini 4. В этой версии нет физического переключателя. Но если вы откроете центр управления (проведите пальцем вверх), появится кнопка "Без звука". Выключите это, и проблема решает сама.
В моем проекте, хотя у меня были проблемы с получением синтеза для создания первого высказывания после инициализации, я смог обойти это, переставив код. Но у меня все еще есть десятки строк мусора, выбрасываемых на консоль, когда инициализируется 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
Я воспроизвел это в небольшом демонстрационном проекте и не смог найти обходного пути. К сожалению, я боюсь, что правильным ответом на этот вопрос является сообщение об ошибке, которую я только что сделал:(
В моем сценарии я мог решить эту проблему, включив подключение к Интернету в iPhone.
Распознаватель речи распознает только один язык. При использовании инициализатора по умолчанию вы получаете распознаватель речи для текущей локали устройства, если для этой локали поддерживается распознаватель. Обратите внимание, что поддерживаемый распознаватель речи не совпадает с доступным распознавателем речи; например, для распознавателей для некоторых языков может потребоваться подключение к Интернету. Вы можете использовать метод enabledLocales(), чтобы получить список поддерживаемых локалей, и свойство isAvailable, чтобы узнать, доступен ли распознаватель для конкретной локали.
Я попробовал ваш код только с одним изменением, и он работает. Попробуйте это один раз
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)
Попробуй это
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)
}
Похожая проблема для меня была решена путем изменения языка на "es" (мое устройство на испанском языке), тогда все заработало. Но я хотел, чтобы голос был на английском языке, и он не говорил с английским акцентом. Оказывается, в моем устройстве в настройках / доступности /voiceOver/rotor languages голос, выбранный Niky, но не загруженный (вероятно, автоматически удалялся после длительного перерыва в использовании). Я выбрал Алекс по умолчанию, и он сработал.