Bug in AVSpeechSynthesizer unter iOS 16

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Bug in AVSpeechSynthesizer unter iOS 16

    Allen eine schönen (verregneten) Sonntag! Ich sitze gerade über einem Problem bei der Sprachausgabe von Calculy und wenn ich nicht ganz blöd bin, ist das wohl ein böser Bug in iOS 16. Könnte bitte mal jemand zu Überprüfung dieses kleine Programm testen?

    Quellcode

    1. import SwiftUI
    2. import AVFoundation
    3. struct ContentView: View {
    4. var body: some View {
    5. VStack {
    6. Button("Play Audio") {
    7. let utterance = AVSpeechUtterance(string: "Hallo Welt")
    8. utterance.voice = AVSpeechSynthesisVoice(language: "de-DE")
    9. let synthesizer = AVSpeechSynthesizer()
    10. synthesizer.speak(utterance)
    11. }
    12. }
    13. }
    14. }
    Alles anzeigen
    Unter iOS 15 funktioniert das problemlos. Rufe ich es im Simulator unter iOS 16 auf, wird kein Text gesprochen und es gibt folgende Fehlermeldung (immer 4 mal):


    2022-09-18 14:54:57.718033+0200 AudioTest[3155:966742] [catalog] Unable to list voice folder
    2022-09-18 14:54:57.736092+0200 AudioTest[3155:966742] [catalog] Unable to list voice folder
    2022-09-18 14:54:57.744052+0200 AudioTest[3155:966742] [catalog] Unable to list voice folder
    2022-09-18 14:54:57.785339+0200 AudioTest[3155:966742] [catalog] Unable to list voice folder


    Rufe ich es auf einem iPhone mit iOS 16 auf, kommen zusätzlich zu diesen 4 Meldungen noch diese Fehlermeldungen dazu:


    2022-09-18 14:54:57.798185+0200 AudioTest[3155:966792] [AXTTSCommon] MauiVocalizer: 11016 (Ruleset parse failed: Ignoring unknown option): option=u
    2022-09-18 14:54:57.798383+0200 AudioTest[3155:966792] [AXTTSCommon] MauiVocalizer: 11018 (Ruleset parse failed: Ignoring trailing string): trailingString=\e\\lang=ENG\\\e\\toi=lhp\\'wAp\e\\toi=orth\\\e\\lang=default\\"
    2022-09-18 14:54:57.849566+0200 AudioTest[3155:966792] [AXTTSCommon] MauiVocalizer: 11018 (Ruleset parse failed: Ignoring trailing string): trailingString="


    MauiVocalizer sagt mir gar nichts und auch Google findet nichts dazu. Sowohl auf dem iPhone, als auch im Simulator sind Stimmen in der Sprache installiert. Auch bei anderen Sprachen wie en-GB oder en-US kommt der Fehler.

    Ich bin hier mit meinem Latein am Ende und lade gerade noch die Xcode-Beta mit iOS 16.1 runter, aber viel Hoffnung habe ich da nicht. Zumindest mit iPadOS 16.1 ist das Verhalten nämlich auch so.

    Wenn noch jemand den Bug bestätigen kann, melde ich es Apple.

    Gruß
    So Long, and Thanks for All the Fish.
  • Danke, so funktioniert es. Allerdings gehen die Fehler weiter und es wird mit AVSpeechSynthesizer noch verrückter.

    Unten poste ich mal eine kleine App, die alle verfügbaren Stimmen auflistet und einen Text ausspricht. Bei ca. der Hälfte aller Stimmen funktioniert das auch, bei der anderen Hälfte kommt folgender Fehler und statt dem Text wird diese Fehlermeldung ausgesprochen:

    <speak><voice name="com.apple.eloquence.de-DE.Sandy">Hello, World!</voice></speak>

    „Hello, World!“ ist der ursprüngliche Text und ausgesprochen wird „speak voice name com apple eloquence de de Sandy hallo world voice speak“. ;( Die Fehlermeldung in der Konsole:


    Quellcode

    1. 2022-09-19 12:34:14.983541+0200 AudioTest[4605:1504748] Could not retrieve voice [AVSpeechSynthesisProviderVoice 0x2802a3cf0] Name: Sandy, Identifier: com.apple.eloquence.de-DE.Sandy, Supported Languages (
    2. "de-DE"
    3. ), Age: 0, Gender: 0, Size: 0, Version: (null)
    4. 2022-09-19 12:34:14.983931+0200 AudioTest[4605:1504748] [AXTTSCommon] Audio Unit failed to start after 5 attempts.
    5. 2022-09-19 12:34:14.984109+0200 AudioTest[4605:1504748] [AXTTSCommon] VoiceProvider: Could not start synthesis for request SSML Length: 82, Voice: [AVSpeechSynthesisProviderVoice 0x2802a3cf0] Name: Sandy, Identifier: com.apple.eloquence.de-DE.Sandy, Supported Languages (
    6. "de-DE"
    7. ), Age: 0, Gender: 0, Size: 0, Version: (null), converted from tts request [TTSSpeechRequest 0x2818fc000] <speak><voice name="com.apple.eloquence.de-DE.Sandy">Hello, World!</voice></speak> language: de-DE footprint: premium rate: 0.500000 pitch: 1.000000 volume: 1.000000
    8. 2022-09-19 12:34:14.988204+0200 AudioTest[4605:1504716] [VOTSpeech] Failed to speak request with error: Error Domain=TTSErrorDomain Code=-4010 "(null)". Attempting to speak again with fallback identifier: com.apple.voice.compact.de-DE.Anna
    9. 2022-09-19 12:34:23.148324+0200 AudioTest[4605:1505554] [AXTTSCommon] File did not exist at content path: (null) com.apple.ttsbundle.Yannick-premium. Attempting to fallback to default voice for language: de-DE
    10. 2022-09-19 12:34:26.975083+0200 AudioTest[4605:1505555] [AXTTSCommon] MauiVocalizer: 27004 (File open for read failed, invalid data header): file=clc/ged/cfg4:dt/ged/cfg4
    11. 2022-09-19 12:34:26.984933+0200 AudioTest[4605:1505555] [AXTTSCommon] MauiVocalizer: 11018 (Ruleset parse failed: Ignoring trailing string): trailingString='be:_t&sva&i.hUn.d$Rt.zi:.b$.nUn.'fYnf.t&sIC"
    12. 2022-09-19 12:34:26.985119+0200 AudioTest[4605:1505555] [AXTTSCommon] MauiVocalizer: 11018 (Ruleset parse failed: Ignoring trailing string): trailingString="
    13. 2022-09-19 12:34:26.986484+0200 AudioTest[4605:1505555] [AXTTSCommon] MauiVocalizer: 11006 (Can't compile rule): regularExpression=(?<!\w)Wenn\sdu\smöchtests\kanns\ichs\im Webs\nachs\wies\geht\'ss\suchen(?!\w), message=\k is not followed by a braced, angle-bracketed, or quoted name, characterPosition=29
    14. 2022-09-19 12:34:26.986904+0200 AudioTest[4605:1505555] [AXTTSCommon] MauiVocalizer: 16038 (Resource load failed): component=ttt/re, uri=rlst/yosemite/compact/ged/helena, contentType=application/x-vocalizer-rettt+text;loader=broker, lhError=88602000
    15. 2022-09-19 12:34:27.013577+0200 AudioTest[4605:1505555] [AXTTSCommon] MauiVocalizer: 11016 (Ruleset parse failed: Ignoring unknown option): option=u
    16. 2022-09-19 12:34:27.013752+0200 AudioTest[4605:1505555] [AXTTSCommon] MauiVocalizer: 11018 (Ruleset parse failed: Ignoring trailing string): trailingString=\e\\lang=ENG\\\e\\toi=lhp\\'wAp\e\\toi=orth\\\e\\lang=default\\"
    17. 2022-09-19 12:34:27.063947+0200 AudioTest[4605:1505555] [AXTTSCommon] MauiVocalizer: 11018 (Ruleset parse failed: Ignoring trailing string): trailingString="
    Alles anzeigen
    Die erste Zeile bei den Fehlermeldungen erscheint 6 mal. Sehr schräg das ganze. Der Fehler tritt bei allen Sprachen auf, also nicht nur bei Deutsch. So wird im Deutschen bspw. Helena richtig und Sandy falsch gesprochen. Im Englischen ist bspw. Fred richtig und Eddy falsch.


    Hier mal der Quellcode für den Testcase. Im Simulator wird es jedoch nicht viel bringen, da dort – zumindest bei mir – nur 4 Stimmen aufgelistet werden, die auch alle funktioniert. Auf dem iPhone selbst gibt es dagegen viel mehr Stimmen.

    Vielleicht hat ja einer noch eine Idee. An Apple habe ich es schon gemeldet aber da erwarte ich nicht so schnell eine Antwort. Gruß


    Quellcode: ContentView.swift

    1. import SwiftUI
    2. import AVFoundation
    3. struct ContentView: View {
    4. let synthesizer = AVSpeechSynthesizer()
    5. @State private var audioText: String = "Hello, World!"
    6. @State private var voices: [AVSpeechSynthesisVoice] = AVSpeechSynthesisVoice.speechVoices()
    7. @State private var selectedVoice: String?
    8. var body: some View {
    9. VStack(alignment: .leading) {
    10. HStack {
    11. TextField("Text", text: $audioText)
    12. .textFieldStyle(RoundedBorderTextFieldStyle())
    13. Button {
    14. speakText()
    15. } label: {
    16. Label("Speak", systemImage: "speaker.wave.2")
    17. .labelStyle(IconOnlyLabelStyle())
    18. }
    19. .buttonStyle(BorderedProminentButtonStyle())
    20. }
    21. .padding()
    22. Text("Voices").font(.title).bold()
    23. .padding()
    24. List (voices, id: \.identifier, selection: $selectedVoice) { voice in
    25. VStack(alignment: .leading) {
    26. HStack {
    27. Text(voice.name).bold()
    28. Spacer()
    29. Text(voice.language)
    30. }
    31. Text(voice.identifier)
    32. .font(.caption)
    33. .foregroundColor(.gray)
    34. }
    35. .tag(voice.identifier)
    36. }
    37. .scrollContentBackground(.hidden)
    38. .listStyle(PlainListStyle())
    39. .onChange(of: selectedVoice) { id in
    40. speakText()
    41. }
    42. Spacer()
    43. }
    44. }
    45. fileprivate func speakText() {
    46. if let selectedVoice {
    47. let voice = AVSpeechSynthesisVoice(identifier: selectedVoice)
    48. let utterance = AVSpeechUtterance(string: audioText)
    49. utterance.voice = voice
    50. synthesizer.speak(utterance)
    51. }
    52. }
    53. }
    Alles anzeigen
    So Long, and Thanks for All the Fish.
  • Noch ein Nachtrag: Der Fehler tritt offenbar nur mit Stimmen auf, die den String .eloquence. im Identifier haben. Wenn ich es so filtere, bleiben nur noch die „guten“ Stimmen übrig:

    @State private var voices = AVSpeechSynthesisVoice.speechVoices().filter { !$0.identifier.contains(".eloquence.") }

    Ist denke ich mal trotzdem ein Bug in iOS 16 aber mit diesem WorkAround kann man es zumindest umgehen.
    So Long, and Thanks for All the Fish.