Entwickler-Ecke
Sonstiges (Delphi) - Sprachausgabe über SpVoice
Mathematiker - Mo 16.09.13 22:09
Titel: Sprachausgabe über SpVoice
Hallo,
im Netz habe ich etwas (für mich) Neues gefunden, die Sprachausgabe eines Textes.
Es funktioniert wunderbar mit
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| var oleVoice: OLEVariant; procedure rtferzeugen; begin ... end; begin rtferzeugen; oleVoice := CreateOLEObject('SAPI.SpVoice'); oleVoice.Speak(richedit1.text, 0); end; |
Einziges Problem ist, dass der vorzulesende RTF-Text auch etwas länger sein kann und ich einfach nicht weiß, wie ich die Sprachausgabe unterbrechen kann.
Wer will sich schon minutenlang Text anhören, wenn er ihn langweilig findet? :wink:
Kann mir jemand helfen? Allerdings ahne ich schon, dass die Lösung wohl nicht so einfach ist.
Danke.
Beste Grüße
Mathematiker
Mathematiker - Mo 16.09.13 22:24
Hallo,
Danke.
Aber kaum hatte ich auf Absenden des ersten Eintrags gedrückt, kam mir die "Erleuchtung".
Mit einer Variablen sprachausgabe und der zeilenweise Abarbeitung des RTF-Textes funktioniert es:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| sprachausgabe:=true; rtferzeugen; oleVoice := CreateOLEObject('SAPI.SpVoice'); i:=0; repeat oleVoice.Speak(richedit1.lines[i], 0); application.processmessages; inc(i); until (i>richedit1.lines.count-1) or (not sprachausgabe); |
Ich hätte vielleicht länger nachdenken müssen. :autsch:
Warum muss ich eigentlich nicht oleVoice.free am Ende ausführen? Versuche ich es, fliegt mir das Programm um die Ohren.
Beste Grüße
Mathematiker
Mathematiker - Mo 16.09.13 22:41
Hallo,
FinnO hat folgendes geschrieben : |
Funktioniert das mit der Pausierung trotzdem? |
Nein, funktioniert doch noch nicht. Ich bin wohl heute zu schnell euphorisch. :(
Die vielen Steuerzeichen im RTF-Text sorgen dafür, dass das Vorlesen in jedem Satz mehrfach stoppt. Klingt besch...
Ich habe deshalb auf eine Stringliste umgestellt. Klingt besser.
Ist aber die Zeile lang, nervt es, da man es erst abbrechen kann, wenn eine Zeile komplett vorgelesen ist. Und das dauert!
Danke, sehe ich mir an.
Beste Grüße
Mathematiker
Delete - Di 17.09.13 02:02
- Nachträglich durch die Entwickler-Ecke gelöscht -
Mathematiker - Di 17.09.13 09:30
Hallo,
Frühlingsrolle hat folgendes geschrieben : |
Ich habe mir mal die Typenbibliothek SpeechLib_TLB angesehen, mich ein bisschen herumgespielt und voilà:
Delphi-Quelltext 1: 2:
| oleVoice.Speak(richedit1.text, $00000001); oleVoice.Speak('', $00000002); |
|
Mit der Konstanten $00000001 passiert bei mir gar nichts.
Das liegt daran, dass ich mir wohl erst einmal SpeechLib_TLB besorgen muss. Ich denke, dass es dann funktioniert. Danke.
Beste Grüße
Mathematiker
Delete - Di 17.09.13 13:16
Das geht auch ohne:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| procedure TForm1.Button8Click(Sender: TObject); type SpeechVoiceSpeakFlags = TOleEnum; const SVSFDefault = 0; SVSFlagsAsync = 1; SVSFPurgeBeforeSpeak = 2; var i : Integer; begin oleVoice := CreateOLEObject('SAPI.SpVoice'); for I := 0 to 3 do BEGIN oleVoice.Speak('Hallo', 0); Sleep(1000); END; for I := 0 to 30 do Memo1.lines.add('hallo');
oleVoice.Speak(Memo1.text, 1); Sleep(1000);
oleVoice.Speak('Hallo', 2); end; |
Mathematiker - Di 17.09.13 15:27
Hallo,
Danke Allen für die zahlreiche Hilfe.
Als erstes habe ich die Sprachausgabe in mein Fachwörterbuch
http://www.entwickler-ecke.de/viewtopic.php?t=111548 integriert und ich finde es ziemlich "cool".
Mal sehen, wo so eine Sprachausgabe noch interessant wäre? Vielleicht 1 Million Stellen von Pi vorlesen lassen? Man gönnt sich ja sonst nichts. :lol:
Beste Grüße
Mathematiker
Nersgatt - Di 17.09.13 15:30
Mathematiker hat folgendes geschrieben : |
Mal sehen, wo so eine Sprachausgabe noch interessant wäre? Vielleicht 1 Million Stellen von Pi vorlesen lassen? Man gönnt sich ja sonst nichts. :lol:
|
Yea, darauf hat die Welt gewartet. Endlich muss ich nicht mehr selbst Schäfchen zum Einschlafen zählen. :zustimm:
Delete - Di 17.09.13 16:02
oder:
Delphi-Quelltext
1: 2: 3: 4: 5:
| for I := 0 to 1000000 do BEGIN oleVoice.Speak('Sie liebt mich, sie liebt mich nicht', 0); Sleep(1000); END; |
Mathematiker - Di 17.09.13 16:07
Hallo,
Nersgatt hat folgendes geschrieben : |
Endlich muss ich nicht mehr selbst Schäfchen zum Einschlafen zählen. :zustimm: |
Dein Wunsch war mir ein besonderes Bedürfnis. Im Anhang findest Du Dein zukünftiges Lieblingsprogramm: "Schäfchen zählen". :lol:
Beste Grüße
Mathematiker
Nersgatt - Di 17.09.13 16:19
Hey, super, aaaber :bawling: Funktioniert leider bei mir nicht.
Auf Englisch bekomme ich diese Meldung:
---------------------------
Schäfchen zählen
---------------------------
OLE error 80045039.
---------------------------
OK
---------------------------
Und auf Deutsch:
---------------------------
Schäfchen zählen
---------------------------
Floating point division by zero.
---------------------------
OK
---------------------------
Mathematiker - Di 17.09.13 16:30
Hallo,
Nersgatt hat folgendes geschrieben : |
Hey, super, aaaber :bawling: Funktioniert leider bei mir nicht. |
Mist! :autsch:
Habe ich schon vermutet. Das hat vielleicht etwas mit der jeweiligen Windows-Variante zu tun. Ich habe Win8.
Ich hänge mal den Quelltext an.
Wahrscheinlich muss Du beim Compilieren das GIF-Bild 'rauswerfen, da Du die Unit RXGif vielleicht nicht hast. Oder entsprechend ersetzen.
Ein sich ärgernder Mathematiker :motz:
Ich hatte mich so gefreut. :cry:
Nachtrag: Ich habe es gerade unter Win 7 getestet und es funktioniert nicht! :evil:
Nersgatt - Di 17.09.13 16:46
Ich hab es mal ein bisschen abgeändert. Ich hab scheinbar nur Englisch installiert. Wenn ich die Abfrage auf die Sprache rauswerfe, funktioniert es. Allerdings nur unter meinem Windows 7 32 bit. Unter meinem Windows 7 64-bit funktioniert es nicht.
Ich häng Dir mal meine geänderte Version an, vielleicht hilft es Dir.
Mathematiker - Di 17.09.13 16:51
Hallo,
Nersgatt hat folgendes geschrieben : |
Ich häng Dir mal meine geänderte Version an, vielleicht hilft es Dir. |
Danke.
Den Ärger macht also die Stimmenauswahl
Delphi-Quelltext
1:
| olevoice.GetVoices.item(0); |
Ich werde wohl erst einmal testen müssen, ob mehrere Stimmen installiert sind. Es ist trotzdem ärgerlich.
Beste Grüße
Mathematiker
Nersgatt - Di 17.09.13 16:58
Mathematiker hat folgendes geschrieben : |
Den Ärger macht also die Stimmenauswahl |
Ja, unter der 32-bit version geht es dann. Aber unter der 64-bit Version hab ich es nicht ans Laufen gebracht.
Mathematiker - Di 17.09.13 17:04
Hallo,
Nersgatt hat folgendes geschrieben : |
Ja, unter der 32-bit version geht es dann. Aber unter der 64-bit Version hab ich es nicht ans Laufen gebracht. |
Schaffe ich auch nicht.
Zuerst habe ich
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| Voices := olevoice.getvoices; if voices.count>1 then begin if radiobutton1.checked then olevoice.Voice := voices.item(0) else olevoice.Voice := voices.item(1); end; |
versucht, ohne Ergebnis.
Das vollständige Entfernen von getvoice brachte unter Win 7-64 auch bei mir nichts. Er gibt nur einen Fehler aus und das war's.
Ich wollte mich doch heute abend entspannen. Wird nun nichts. Fehler suchen ist angesagt.
Beste Grüße
Mathematiker
Delete - Di 17.09.13 18:47
Bei WIN 8 ist Hedda als DEUTSCH installiert und zusätzlich eine ENGLISCHE Sprecherin.
"Sie haben Microsoft Hedda Desktop - German als Standardstimme des Computers ausgewählt."
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!