Ich verwende AVSpeechSynthesizer, um Text zu spielen. Ich habe eine Reihe von Äußerungen zu spielen.
%Vor%Ich habe eine Abbrechen-Taste, um mit dem Sprechen aufzuhören. Wenn ich auf die Abbrechen-Schaltfläche klicke, wenn die erste Äußerung gesprochen wird, hört die Sprache auf und löscht alle Äußerungen in der Warteschlange. Wenn ich die Löschtaste drücke, nachdem die erste Äußerung gesprochen wurde (d. H. Die zweite Äußerung), dann spült das Stoppen der Sprache die Äußerungswarteschlange nicht. Der Code, den ich dafür verwende, ist:
%Vor%Kann jemand bestätigen, dass dies ein Fehler in der API ist oder verwende ich die API falsch? Wenn es sich um einen Fehler handelt, gibt es eine Problemumgehung, um dieses Problem zu beheben?
ist sehr wahrscheinlich ein Fehler, da die Delegate-Methode synthesizer didCancelSpeechUtterance nicht nach der ersten Äußerung aufgerufen wird;
Eine Umgehungslösung würde darin bestehen, die Äußerungen zu verketten, anstatt sie in einem Array zu haben und sie auf einmal anzuordnen.
Verwenden Sie die Delegate-Methode synthesizer didFinishSpeechUterance , um einen Array-Zeiger zu inkrementieren und den nächsten Text von diesem Array zu sprechen. Wenn Sie dann versuchen, die Sprache zu stoppen, legen Sie ein BOOL fest, das in dieser Delegate-Methode überprüft wird, bevor Sie versuchen, den nächsten Text zu sprechen.
Zum Beispiel:
1) Implementieren Sie das Protokoll im View-Controller, der die Sprachsynthese ausführt
%Vor%2) instanziieren Sie den AVSpeechSynthesizer und setzen Sie seinen Delegaten auf self
%Vor%3) Verwenden Sie einen Äußerungszähler, der zu Beginn des Sprechens auf Null gesetzt wird
4) Verwenden Sie ein Array von Texten zum Sprechen
%Vor%5) Fügen Sie die Delegate-Methode didFinishSpeechUtterance hinzu, um die nächste Äußerung aus dem Array zu sprechen von Texten und erhöhen Sie den Äusserungszähler
%Vor%5) Um mit dem Sprechen aufzuhören, setzen Sie den Äusserungszähler auf die Anzahl der Texte und versuchen Sie, den Synthesizer zu stoppen
%Vor%6) Wenn Sie erneut sprechen, setzen Sie den Äusserungszähler auf Null zurück
Alle Antworten sind fehlgeschlagen, und ich habe den Synthesizer angehalten und instanziiert:
%Vor%didCancelSpeechUtterance funktioniert nicht mit demselben AVSpeechSynthesizer-Objekt, obwohl die Äußerungen in der Methode didFinishSpeechUtterance verkettet sind.
%Vor%In speakInternal erstelle ich AVSpeechSynthesizer-Objekt mehrmals, um sicherzustellen, dass didCancelSpeechUtterance funktioniert. Eine Art Workaround.
Tags und Links ios xcode cocoa-touch