Autor |
Beitrag |
Mathematiker
      
Beiträge: 2622
Erhaltene Danke: 1447
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: Mo 16.09.13 22:09
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?
Kann mir jemand helfen? Allerdings ahne ich schon, dass die Lösung wohl nicht so einfach ist.
Danke.
Beste Grüße
Mathematiker
_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
Zuletzt bearbeitet von Mathematiker am Di 17.09.13 22:44, insgesamt 1-mal bearbeitet
|
|
FinnO
      
Beiträge: 1331
Erhaltene Danke: 123
Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
|
Verfasst: Mo 16.09.13 22:14
Moin Mathematiker,
ich habe im Internet [1] die Methoden pause und resume gefunden. Vielleicht tun die ja, was sie sollen, testen konnte ich das leider nicht.
Bis dann,
Für diesen Beitrag haben gedankt: Mathematiker
|
|
Mathematiker 
      
Beiträge: 2622
Erhaltene Danke: 1447
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: Mo 16.09.13 22:24
Hallo,
FinnO hat folgendes geschrieben : | ich habe im Internet[1] die Methoden pause und resume gefunden. |
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.
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
_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
|
|
FinnO
      
Beiträge: 1331
Erhaltene Danke: 123
Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
|
Verfasst: Mo 16.09.13 22:28
Funktioniert das mit der Pausierung trotzdem? Wenn dich Sprachausgabe schon überrascht, solltest du die Spracherkennung ausprobieren.
Zum Thema Freigabe von OLE-Objekten: stackoverflow.com/qu...sing-createoleobject
Für diesen Beitrag haben gedankt: Mathematiker
|
|
Mathematiker 
      
Beiträge: 2622
Erhaltene Danke: 1447
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: 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!
FinnO hat folgendes geschrieben : | Wenn dich Sprachausgabe schon überrascht, solltest du die Spracherkennung ausprobieren.
|
Danke, sehe ich mir an.
Beste Grüße
Mathematiker
_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
|
|
Gerd Kayser
      
Beiträge: 632
Erhaltene Danke: 121
Win 7 32-bit
Delphi 2006/XE
|
Verfasst: Di 17.09.13 01:14
Mathematiker hat folgendes geschrieben : | Mit einer Variablen sprachausgabe und der zeilenweise Abarbeitung des RTF-Textes funktioniert es: |
Versuch's mal mit "skip": msdn.microsoft.com/e...08%28v=vs.85%29.aspx
Für diesen Beitrag haben gedankt: Mathematiker
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 17.09.13 02:02
- Nachträglich durch die Entwickler-Ecke gelöscht -
Für diesen Beitrag haben gedankt: Mathematiker
|
|
Mathematiker 
      
Beiträge: 2622
Erhaltene Danke: 1447
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: 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
_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
|
|
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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; |
Für diesen Beitrag haben gedankt: Mathematiker
|
|
Mathematiker 
      
Beiträge: 2622
Erhaltene Danke: 1447
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: Di 17.09.13 15:27
Hallo,
Danke Allen für die zahlreiche Hilfe.
Als erstes habe ich die Sprachausgabe in mein Fachwörterbuch www.entwickler-ecke....ewtopic.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.
Beste Grüße
Mathematiker
_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
|
|
Nersgatt
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: Di 17.09.13 15:30
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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 
      
Beiträge: 2622
Erhaltene Danke: 1447
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: Di 17.09.13 16:07
Hallo,
Nersgatt hat folgendes geschrieben : | Endlich muss ich nicht mehr selbst Schäfchen zum Einschlafen zählen.  |
Dein Wunsch war mir ein besonderes Bedürfnis. Im Anhang findest Du Dein zukünftiges Lieblingsprogramm: "Schäfchen zählen".
Beste Grüße
Mathematiker
Einloggen, um Attachments anzusehen!
_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
Für diesen Beitrag haben gedankt: Martok
|
|
Nersgatt
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: Di 17.09.13 16:19
Hey, super, aaaber  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
---------------------------
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
Mathematiker 
      
Beiträge: 2622
Erhaltene Danke: 1447
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: Di 17.09.13 16:30
Hallo,
Nersgatt hat folgendes geschrieben : | Hey, super, aaaber Funktioniert leider bei mir nicht. |
Mist!
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
Ich hatte mich so gefreut.
Nachtrag: Ich habe es gerade unter Win 7 getestet und es funktioniert nicht! 
Einloggen, um Attachments anzusehen!
_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
|
|
Nersgatt
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: 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.
Einloggen, um Attachments anzusehen!
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
Für diesen Beitrag haben gedankt: Mathematiker
|
|
Mathematiker 
      
Beiträge: 2622
Erhaltene Danke: 1447
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: 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
_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
|
|
Nersgatt
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: 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.
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
Mathematiker 
      
Beiträge: 2622
Erhaltene Danke: 1447
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: 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
_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
|
|
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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."
|
|