web-dev-qa-db-fra.com

AVSpeechSynthesizer ne fonctionne pas sur iOS10

Mon code AVSpeechSynthesizer ne fonctionne pas sur l'appareil (iOS 10), mais il a fonctionné sur iOS 9.x et il fonctionne maintenant dans le simulateur.

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 cela, 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-il comment résoudre ce problème? Je sais qu'il existe des solutions de contournement (l'utilisateur doit aller dans Paramètres-> Général et changer la sélection de parole, par exemple) mais je ne pense pas que ce soit une vraie solution ici.

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

pdate 2: Cela fonctionne sur l'appareil. J'ai des messages d'erreur similaires (Impossible de copier les attributs des actifs, etc.), mais cela fonctionne pour l'instant. Je ne sais pas ce que c'était.

22
lithium

Désactivez votre mode silencieux (le commutateur physique). Cela fonctionne dans mon cas.

23
kaka

Je viens de rencontrer ce même problème sur un iPad Mini 4. Cette version n'a pas de commutateur physique. Mais si vous ouvrez le centre de contrôle (faites glisser vers le haut), il y a un bouton Silencieux. Désactivez-le et le problème se résout.

enter image description here

6
Carsten

Dans mon projet, bien que j'aie eu du mal à obtenir la synthèse pour produire le premier énoncé après l'initialisation, j'ai pu contourner cela en réorganisant le code. Mais j'ai encore des dizaines de lignes de déchets rejetées sur la console lorsque AVSpeechSynthesizer est initialisé et lorsque sa première déclaration est produite. 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

J'ai reproduit cela dans un petit projet de démonstration et je n'ai pas pu trouver de solution. Malheureusement, je crains que la bonne réponse à cette question soit signalez un bogue , qui je viens de le faire :(

3
Jerry Krinock

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

 synth.speak(utterance)

Tout mon code 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)
1
Jitendra Modi

Dans mon scénario, je pourrais le résoudre en activant la connexion Internet dans l'iPhone.

Un identificateur de reconnaissance vocale ne reconnaît qu'une seule langue. Lorsque vous utilisez l'initialiseur par défaut, vous obtenez un identificateur vocal pour les paramètres régionaux actuels du périphérique, si un identificateur est pris en charge pour ces paramètres régionaux. Notez qu'un reconnaissance vocale prise en charge n'est pas la même chose qu'un reconnaissance vocale disponible; par exemple, les modules de reconnaissance de certains paramètres régionaux peuvent nécessiter une connexion Internet. Vous pouvez utiliser la méthode supportedLocales () pour obtenir une liste des paramètres régionaux pris en charge et la propriété isAvailable pour savoir si le module de reconnaissance pour un paramètre régional spécifique est disponible.

Source

1
Shrawan