Ein Problem mit AVSpeechSynthesizer, Problemumgehungen?

8

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?

    
vijayst 30.10.2013, 02:34
quelle

5 Antworten

5

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

    
SPA 21.11.2013, 12:46
quelle
22

Ich habe einen Workaround gefunden:

%Vor%

Rufen Sie stopSpeakingAtBoundary: auf, setzen Sie eine leere Äußerung in die Warteschlange und rufen Sie stopSpeakingAtBoundary: erneut auf, um die Warteschlange anzuhalten und zu bereinigen.

    
Antoine 06.03.2014 15:40
quelle
2

Alle Antworten sind fehlgeschlagen, und ich habe den Synthesizer angehalten und instanziiert:

%Vor%     
technophyle 10.09.2016 03:24
quelle
1

Ich habe etwas Ähnliches wie das SPA erwähnt. Von einer Schleife aus jeweils ein Element sprechen. Hier ist die Idee ..

%Vor%     
chuthan20 21.11.2013 01:34
quelle
1

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.

    
vijayst 21.11.2013 17:39
quelle

Tags und Links