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
...    //Richedit1 wird mit RTF gefüllt
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


FinnO - Mo 16.09.13 22:14

Moin Mathematiker,

ich habe im Internet[1] [http://forum.renoise.com/index.php?/topic/26363-sapispvoice/] die Methoden pause und resume gefunden. Vielleicht tun die ja, was sie sollen, testen konnte ich das leider nicht.

Bis dann,


Mathematiker - Mo 16.09.13 22:24

Hallo,
user profile iconFinnO hat folgendes geschrieben Zum zitierten Posting springen:
ich habe im Internet[1] [http://forum.renoise.com/index.php?/topic/26363-sapispvoice/] 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;  //erneuter Klick auf den Startschalter setzt sprachausgabe:=false;
        inc(i);
      until (i>richedit1.lines.count-1or (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


FinnO - Mo 16.09.13 22:28

Funktioniert das mit der Pausierung trotzdem? Wenn dich Sprachausgabe schon überrascht, solltest du die Spracherkennung [http://windows.microsoft.com/de-de/windows-8/using-speech-recognition]ausprobieren. ;)

Zum Thema Freigabe von OLE-Objekten: http://stackoverflow.com/questions/8314183/freeing-olevariant-after-using-createoleobject


Mathematiker - Mo 16.09.13 22:41

Hallo,
user profile iconFinnO hat folgendes geschrieben Zum zitierten Posting springen:
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!

user profile iconFinnO hat folgendes geschrieben Zum zitierten Posting springen:
Wenn dich Sprachausgabe schon überrascht, solltest du die Spracherkennung [http://windows.microsoft.com/de-de/windows-8/using-speech-recognition]ausprobieren. ;)

Danke, sehe ich mir an.

Beste Grüße
Mathematiker


Gerd Kayser - Di 17.09.13 01:14

user profile iconMathematiker hat folgendes geschrieben Zum zitierten Posting springen:
Mit einer Variablen sprachausgabe und der zeilenweise Abarbeitung des RTF-Textes funktioniert es:

Versuch's mal mit "skip": http://msdn.microsoft.com/en-us/library/ms723608%28v=vs.85%29.aspx


Delete - Di 17.09.13 02:02

- Nachträglich durch die Entwickler-Ecke gelöscht -


Mathematiker - Di 17.09.13 09:30

Hallo,
user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Ich habe mir mal die Typenbibliothek SpeechLib_TLB angesehen, mich ein bisschen herumgespielt und voilà:

Delphi-Quelltext
1:
2:
oleVoice.Speak(richedit1.text, $00000001); // abspielen
oleVoice.Speak(''$00000002); // unterbrechen


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); // stoppt die Ausgabe nach 1x Hallo, statt 31x Hallo
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

user profile iconMathematiker hat folgendes geschrieben Zum zitierten Posting springen:
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,
user profile iconNersgatt hat folgendes geschrieben Zum zitierten Posting springen:
Endlich muss ich nicht mehr selbst Schäfchen zum Einschlafen zählen. :zustimm:

schaefchen
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,
user profile iconNersgatt hat folgendes geschrieben Zum zitierten Posting springen:
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,
user profile iconNersgatt hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconMathematiker hat folgendes geschrieben Zum zitierten Posting springen:
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,
user profile iconNersgatt hat folgendes geschrieben Zum zitierten Posting springen:
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."