Lazarus mit Sprach Ein- und Ausgabe

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
Benutzeravatar
juelin
Beiträge: 267
Registriert: Sa 24. Jul 2021, 18:03
OS, Lazarus, FPC: Linux Ubuntu 22. Windows 10 Delphi 11.3 (L 0.9.xy FPC 2.2.z)
CPU-Target: 64Bit
Wohnort: Mannheim

Lazarus mit Sprach Ein- und Ausgabe

Beitrag von juelin »

Hallo,
Nun noch eine Frage für Spezialisten.

Spracheingabe:
Gibt es eine Möglichkeit das Programm (die Form) zu minimieren.
Dabei verliert ja das TEDIT den Focus und die Spracheingabe funktioniert nicht mehr.
Spracheinagbe mit dem Tastencode WIN+H aktiviert.

Sprachausgabe
Und noch ne Frage, wie kann man der Sprachausgabe eine andere Stimme geben?
Sprachausgabe mit
SpVoice := ComObj.CreateOleObject('SAPI.SpVoice');
SpVoice.Speak(Textout, 0);

Danke und Gruß
Jürgen

Benutzeravatar
Jorg3000
Lazarusforum e. V.
Beiträge: 375
Registriert: So 10. Okt 2021, 10:24
OS, Lazarus, FPC: Win64
Wohnort: NRW

Re: Lazarus mit Sprach Ein- und Ausgabe

Beitrag von Jorg3000 »

juelin hat geschrieben: Do 22. Mai 2025, 10:30 Gibt es eine Möglichkeit das Programm (die Form) zu minimieren.
Dabei verliert ja das TEDIT den Focus und die Spracheingabe funktioniert nicht mehr.
Die Windows-Diktat-Funktion überwacht den Fokuswechsel und bricht sofort ab, wenn das ursprüngliche Control den Fokus verliert.
Ich vermute, dass dies zwei Gründe hat: der User quatscht nicht unbemerkt in ein falsches (gewechseltes) Feld - und eine Malware kann nicht unbemerkt eine Stimmaufnahme kapern. Ich denke, dass man es nur schwerlich oder gar nicht austricksen kann.

Falls es dir weiterhilft, könntest du versuchen das Fenster quasi unsichtbar zu machen, aber nicht über .Visible Eigenschaft, sondern über Transparenz.
Hier ein kleines Schnipsel für Transparenz aus meinem Programm. Bei Bedarf müsstest du es aber selber für dein Form anpassen.

Code: Alles auswählen

uses Windows;

procedure TTransparentForm.FormCreate(Sender: TObject);
var Style: LongInt;
begin
  Style := GetWindowLong(Handle, GWL_EXSTYLE);
  Style := Style or WS_EX_LAYERED;
  SetWindowLong(Handle, GWL_EXSTYLE, Style);

  SetLayeredWindowAttributes(Handle, 0, 1{Deckkraft 0..255}, LWA_ALPHA);  // muss mindestens 1 Deckkraft haben, damit es Events erhält!
end;

Benutzeravatar
Jorg3000
Lazarusforum e. V.
Beiträge: 375
Registriert: So 10. Okt 2021, 10:24
OS, Lazarus, FPC: Win64
Wohnort: NRW

Re: Lazarus mit Sprach Ein- und Ausgabe

Beitrag von Jorg3000 »

juelin hat geschrieben: Do 22. Mai 2025, 10:30 wie kann man der Sprachausgabe eine andere Stimme geben?
Eine andere Stimme geht, siehe unten meine erweiterte Funktion, aber nur die Standardstimme (Index 0) spricht deutsch, zumindest bei mir unter Windows 10.
In meinem Windows werden noch zwei weitere Stimmen bereitgestellt, aber englisch! (Index 1 = männlich englisch, 2 = weiblich englisch).
Vermutlich kann man im TTS-System (Text to Speech) weitere Stimmen nachinstallieren, aber das habe ich nicht ausprobiert.

Code: Alles auswählen

uses Variants, ComObj;    

function SpeakText(const Text: String): Boolean;
var
  SpVoice: OleVariant;
begin
  Result := true;
  try
    SpVoice := ComObj.CreateOleObject('SAPI.SpVoice');  // https://learn.microsoft.com/en-us/previous-versions/windows/desktop/ms723602(v=vs.85)
   except
    Result := false;  // ShowMessage('Could not find or start SAPI.SpVoice');
    Exit;
  end;

  ShowMessage('verfügbare Stimmen Index 0..'+IntToStr(SpVoice.GetVoices.Count-1));  // bei mir 0..2
  SpVoice.Voice := SpVoice.GetVoices.Item(0);  // Index 0 = weibliche deutsche Stimme, weitere Stimmen englisch!

  SpVoice.Volume := 90;  // Lautstärke 0..100
  SpVoice.Rate := 0;     // -10..10, which represent the slowest and the fastest speaking rates

  SpVoice.Speak(Text, 0);
end;
Grüße, Jörg

Benutzeravatar
juelin
Beiträge: 267
Registriert: Sa 24. Jul 2021, 18:03
OS, Lazarus, FPC: Linux Ubuntu 22. Windows 10 Delphi 11.3 (L 0.9.xy FPC 2.2.z)
CPU-Target: 64Bit
Wohnort: Mannheim

Re: Lazarus mit Sprach Ein- und Ausgabe

Beitrag von juelin »

Hallo Jorg3000,
wie immer toll geholfen. Danke.
Das mit dem minimieren (Fokus) hatte ich mir schon gedacht.
Aber habe trotzdem mal gefragt.
Müsste eigenlich gehen, weil WIN+STRG+S ja auch den Focus verliert
und trotzdem weiter läuft.
Ich wollte halt mein Programm als Batch laufen lassen.

Zur Stimme, das mit dem SpVoice.GetVoices.Item(0) hatte ich auch schon gefunden.
Aber bei mir geht nur 0=weibliche Stimme deutsch und 1=weibliche Stimme englisch.
Ich hätte ber gerne auch eine männliche Stimme in deutsch gehabt.
Habe schon im Internet gesucht (den ganzen Nachmitag) aber nix gefunden mit der SAPI.
Habe nur gefunden was mit Azure von Mikrosoft.
Kostet aber Geld und ich bin nicht sicher ob damit auch die SAPI läuft.

Na ja, so ist es.
Alles Gute und Gruß
Jürgen

PS In Einstellungen -> Barrierefreiheit -> Sprachausgabe kann man zwar eine Stimme einstellen,
aber die zieht nicht in meinem Lazarusprogramm. Geht wahrscheinlich nur in Office.

Antworten