2016-10-05 1 views
21

Mon code AVSpeechSynthesizer ne fonctionne pas sur le périphérique (iOS 10), mais il a fonctionné sur iOS 9.x et il fonctionne maintenant en simulateur.AVSpeechSynthesizer ne fonctionne pas sur iOS10

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) 

Je reçois cette erreur:

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} 

Avant qu'il y avait des messages d'erreur comme ça:

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

Quelqu'un sait comment résoudre ce problème? Je sais qu'il y a quelques solutions de contournement (l'utilisateur doit aller à Paramètres-> Général et changer de sélection de Speak, par exemple) mais je ne pense pas que ce soit une vraie solution ici.

Mise à jour: J'ai créé un nouveau projet (XCode8/Swift3/pas d'autres pods/frameworks et ainsi de suite). Cela fonctionne en simulateur, mais cela me donne les mêmes erreurs sur mon appareil.

Mise à jour 2: Fonctionne sur l'appareil. J'ai des messages d'erreur similaires (Impossible de copier les attributs d'actifs et ainsi de suite), mais cela fonctionne pour le moment. Je ne sais pas ce que c'était.

+0

dans votre code essayer de vérifier si votre 'AVSpeechSynthesisVoice (langue: lang)' existe, sinon .. essayer autre langue – TonyMkenu

+0

j'ai essayé quelque chose comme ça: laisse voix = AVSpeechSynthesisVoice.speechVoices() pour la voix dans les voix { print ("\ (voix.langue) ") print (" \ (voice.name) ") print (" \ (voice.identifier) ​​") ​​ } est-il suffisant? Je "dans cette liste en-US". – lithium

+0

essayer cette : 'garde laisse voix = AVSpeechSynthesisVoice (identifiant: AVSpeechSynthesisVoiceIdentifierAlex) else {return}' la place 'AVSpeechSynthesisVoice (langue: lang).' – TonyMkenu

Répondre

1

J'ai essayé votre code avec un seul changement et son fonctionnement. Essayez cette fois

synth.speak(utterance) 

Mon code entier est comme

**`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) 
+0

Ce changement est lié à Swift 3 (vs Swift 2.3 dans le code de l'auteur). Comment fournit-il une solution au problème? –

+0

Le langage ne change pas le comportement des frameworks. Swift 2.3 ou Swift 3.0, ils appellent tous deux des cadres internes écrits en Objective C. Ce problème n'a rien à voir avec le langage utilisé. –

+0

Vous tapez un non-sens. Vous pouvez développer dans Swift 2.3 dans Xcode 8, et vous pouvez exécuter des applications écrites en Xcode 7 sur iOS 10. –

10

Éteignez votre mode silencieux (le commutateur physique). Cela fonctionne dans mon cas.

+0

Cela m'aide aussi! Merci! – Karbaman

+0

Vous avez sauvé ma journée. –

3

Dans mon projet, même si j'avais de la difficulté à synthétiser pour produire le premier énoncé après l'initialisation, j'ai pu contourner ce problème en réorganisant le code. Mais j'ai toujours des douzaines de lignes d'ordures crachées sur la console quand AVSpeechSynthesizer est initialisé, et quand son premier énoncé est produit. Voici un petit échantillon:

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 

Je reproduit cela dans un small demo project et n'a pas pu trouver une solution de contournement. Malheureusement, je crains que la bonne réponse à cette question est à file a bug, qui

+0

Merci. Cela prouve que je ne deviens pas fou. Je n'ai rien trouvé à propos de ça alors j'ai pensé que c'était mon code. J'ai aussi fait un projet de démo pour le reproduire, donc j'ai pensé que c'était à cause de mon appareil spécifique ou de quelque chose. Est-ce qu'il gèle un moment (blocage du thread principal) lors de l'initialisation pour vous aussi? – Thermometer

+1

@Thermometer, je n'avais pas remarqué cela parce que, bien sûr, je ne fais que créer un AVSpeechSynthesizer dans mon application et le réutiliser. J'ai juste ajouté du code pour mesurer et j'ai trouvé que 'AVSpeechSynthesizer()' bloque pendant 1,2 secondes dans le simulateur de l'iPhone 5 et 1,6 secondes dans mon iPad Mini actuel. En effet, cela semble plutôt mauvais. Est-ce que vous voulez dire par * un moment *? –

+0

Ouais exactement! Nice que vous l'avez mesuré, 1,2 secondes est comparable au gel que je vis. Je l'ai découvert lors de l'ouverture d'un viewcontroller modal a pris ~ 1,5 secondes. Il s'est avéré qu'il initialisait juste 'AVSpeechSynthesizer' dans' viewDidLoad'. – Thermometer

5

Je viens de courir dans ce même problème sur un iPad Mini 4. Cette version n'a pas un commutateur physique Mais si vous ouvrez centre de contrôle (balayez vers le haut), il y a un bouton silencieux. Désactivez cette option et les correctifs de question elle-même.

enter image description here

+1

Les problèmes ne se résolvent pas eux-mêmes. – RegularExpression

1

dans mon scénario, je pouvais le résoudre en permettant Connexion Internet dans l'iPhone.

A speech recognizer recognizes only one language. When you use the default initializer, you get a speech recognizer for the device's current locale, if a recognizer is supported for that locale. Note that a supported speech recognizer is not the same as an available speech recognizer; for example, the recognizers for some locales may require an Internet connection. You can use the supportedLocales() method to get a list of supported locales and the isAvailable property to find out if the recognizer for a specific locale is available.

Source