web-dev-qa-db-ja.com

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:デバイスで動作します。同様のエラーメッセージ(アセット属性をコピーできないなど)がありますが、今のところは動作します。私はそれが何だったのか分かりません。

22
lithium

サイレントモード(物理スイッチ)をオフにします。私の場合はうまくいきます。

23
kaka

IPad Mini 4でこの同じ問題に遭遇しました。このバージョンには物理的なスイッチがありません。ただし、コントロールセンターを開く(上にスワイプする)場合は、サイレントボタンがあります。これをオフにすると、問題が修正されます。

enter image description here

6
Carsten

私のプロジェクトでは、初期化後に最初の発話を生成するために合成を取得するのが困難でしたが、コードを再配置することでそれを回避することができました。しかし、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

これを 小さなデモプロジェクト で再現したため、回避策が見つかりませんでした。悲しいことに、この質問に対する正しい答えは バグを報告する 、これは 私はちょうどやった :(

3
Jerry Krinock

私はあなたのコードをたった一つの変更とその動作で試してみました。これを一度試してください

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

私のシナリオでは、iPhoneでインターネット接続を有効にすることで解決できました。

音声認識エンジンは1つの言語のみを認識します。デフォルトのイニシャライザーを使用すると、デバイスの現在のロケールの認識エンジンが取得されます(そのロケールで認識エンジンがサポートされている場合)。サポートされている音声認識エンジンは、利用可能な音声認識エンジンと同じではないことに注意してください。たとえば、一部のロケールのレコグナイザーにはインターネット接続が必要な場合があります。 supportedLocales()メソッドを使用して、サポートされているロケールのリストを取得し、isAvailableプロパティを使用して、特定のロケールの認識エンジンが使用可能かどうかを確認できます。

ソース

1
Shrawan