PB.Ex Speech (Windows)

Anwendungen, Tools, Userlibs und anderes nützliches.
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

PB.Ex Speech (Windows)

Beitrag von RSBasic »

Hallo,

mit dieser Bibliothek kann man die Spracherkennung (Sprache -> Text) und Sprachausgabe (Text -> Sprache) nutzen.
Mit der Spracherkennung kann man festgelegte Wörter sprechen, die vom Programm erkannt und ausgewertet werden können. Z.B. beim Sprechen des Wortes "Waschmaschine" wird ein Event ausgelöst und man kann darauf reagieren.
Mit der Sprachausgabe kann ein Text von der Computerstimme vorgelesen werden oder in eine Audio-Datei gespeichert werden.

Funktionen:
  • TextToSpeaker()
    • Syntax:

      Code: Alles auswählen

      Result = TextToSpeaker(Text$, Voice$, Speed, Volume, Asynchronous, @ErrorOutput)
    • Beschreibung: Angegebener Text wird von der Computerstimme vorgelesen.
    • Parameter:
      1. Text$: Text, der vorgelesen werden soll.
      2. Voice$: Wenn mehrere Stimmen auf dem Computer installliert sind, kann eine bestimmte Stimme festgelegt werden. Wenn "" angegeben wurde, dann wird die Standard-Stimme genommen.
      3. Speed: Legt die Sprechgeschwindigkeit (-10 (sehr langsam) bis 10 (sehr schnell)) fest.
      4. Volume: Legt die Lautstärke (0-100) fest.
      5. Asynchronous: Wenn 1 angegeben wurde, dann wartet das Programm nicht, bis der Text vollständig vorgelesen wurde, sondern der Text wird im Hintergrund vorgelesen.
      6. @ErrorOutput: Falls ein Fehler auftritt, wird die Fehlermeldung in die String-Variable gespeichert.
    • Rückgabewert:
      • 0: Der Vorgang war erfolgreich.
    • Beispielcode:

      Code: Alles auswählen

      EnableExplicit
      
      Global PBEx_Speech
      
      CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
        PBEx_Speech = OpenLibrary(#PB_Any, "PB.Ex_Speech_x86.dll")
      CompilerElseIf #PB_Compiler_Processor = #PB_Processor_x64
        PBEx_Speech = OpenLibrary(#PB_Any, "PB.Ex_Speech_x64.dll")
      CompilerEndIf
      
      If PBEx_Speech
        Prototype TextToSpeaker(Text.p-Unicode, Voice.p-Unicode, Speed, Volume, Asynchronous, ErrorOutput)
        Global TextToSpeaker.TextToSpeaker = GetFunction(PBEx_Speech, "TextToSpeaker")
        Prototype TextToAudioFile(Text.p-Unicode, Voice.p-Unicode, Speed, Volume, SaveFilePath.p-Unicode, ErrorOutput)
        Global TextToAudioFile.TextToAudioFile = GetFunction(PBEx_Speech, "TextToAudioFile")
        Prototype SpeechRecognition(WordArray, WordArraySize, ErrorOutput)
        Global SpeechRecognition.SpeechRecognition = GetFunction(PBEx_Speech, "SpeechRecognition")
        Prototype WaitSpeechRecognition(RecognizedWord)
        Global WaitSpeechRecognition.WaitSpeechRecognition = GetFunction(PBEx_Speech, "WaitSpeechRecognition")
        Prototype KillSpeechRecognition()
        Global KillSpeechRecognition.KillSpeechRecognition = GetFunction(PBEx_Speech, "KillSpeechRecognition")
        
        Define ErrorOutput$ = Space(1024)
        If TextToSpeaker("Hallo PureBasic-Freunde", "", 1, 100, 0, @ErrorOutput$) <> 0
          Debug ErrorOutput$
        EndIf
        
        CloseLibrary(PBEx_Speech)
      EndIf
  • TextToAudioFile()
    • Syntax:

      Code: Alles auswählen

      Result = TextToAudioFile(Text$, Voice$, Speed, Volume, SaveFilePath$, @ErrorOutput)
    • Beschreibung: Die Sprachausgabe des Textes wird in die angegebene Audio-Datei (Wave) gespeichert.
    • Parameter:
      1. Text$: Text, der vorgelesen werden soll.
      2. Voice$: Wenn mehrere Stimmen auf dem Computer installliert sind, kann eine bestimmte Stimme festgelegt werden. Wenn "" angegeben wurde, dann wird die Standard-Stimme genommen.
      3. Speed: Legt die Sprechgeschwindigkeit (-10 (sehr langsam) bis 10 (sehr schnell)) fest.
      4. Volume: Legt die Lautstärke (0-100) fest.
      5. SaveFilePath$: Legt den Speicherort der Audio-Datei fest.
      6. @ErrorOutput: Falls ein Fehler auftritt, wird die Fehlermeldung in die String-Variable gespeichert.
    • Rückgabewert:
      • 0: Der Vorgang war erfolgreich.
    • Beispielcode:

      Code: Alles auswählen

      EnableExplicit
      
      Global PBEx_Speech
      
      CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
        PBEx_Speech = OpenLibrary(#PB_Any, "PB.Ex_Speech_x86.dll")
      CompilerElseIf #PB_Compiler_Processor = #PB_Processor_x64
        PBEx_Speech = OpenLibrary(#PB_Any, "PB.Ex_Speech_x64.dll")
      CompilerEndIf
      
      If PBEx_Speech
        Prototype TextToSpeaker(Text.p-Unicode, Voice.p-Unicode, Speed, Volume, Asynchronous, ErrorOutput)
        Global TextToSpeaker.TextToSpeaker = GetFunction(PBEx_Speech, "TextToSpeaker")
        Prototype TextToAudioFile(Text.p-Unicode, Voice.p-Unicode, Speed, Volume, SaveFilePath.p-Unicode, ErrorOutput)
        Global TextToAudioFile.TextToAudioFile = GetFunction(PBEx_Speech, "TextToAudioFile")
        Prototype SpeechRecognition(WordArray, WordArraySize, ErrorOutput)
        Global SpeechRecognition.SpeechRecognition = GetFunction(PBEx_Speech, "SpeechRecognition")
        Prototype WaitSpeechRecognition(RecognizedWord)
        Global WaitSpeechRecognition.WaitSpeechRecognition = GetFunction(PBEx_Speech, "WaitSpeechRecognition")
        Prototype KillSpeechRecognition()
        Global KillSpeechRecognition.KillSpeechRecognition = GetFunction(PBEx_Speech, "KillSpeechRecognition")
        
        Define ErrorOutput$ = Space(1024)
        If TextToAudioFile("Hallo PureBasic-Freunde", "", 1, 100, "D:\AudioText.wav", @ErrorOutput$) <> 0
          Debug ErrorOutput$
        EndIf
        
        CloseLibrary(PBEx_Speech)
      EndIf
  • SpeechRecognition()
    • Syntax:

      Code: Alles auswählen

      Result = SpeechRecognition(WordArray, WordArraySize, @ErrorOutput)
    • Beschreibung: Erkennt beim Sprechen die festgelegten Wörter und gibt ein Event an die Funktion WaitSpeechRecognition() zurück.
    • Parameter:
      1. WordArray: Ein String-Array mit Wörtern, die erkannt werden sollen. Wenn 0 übergeben wird, dann werden beliebige Wörter erkannt.
      2. WordArraySize: Anzahl der Elemente. Wenn 0 übergeben wird, dann werden beliebige Wörter erkannt.
      3. @ErrorOutput: Falls ein Fehler auftritt, wird die Fehlermeldung in die String-Variable gespeichert.
    • Rückgabewert:
      • 0: Der Vorgang war erfolgreich.
    • Beispielcode:

      Code: Alles auswählen

      EnableExplicit
      
      Global PBEx_Speech
      
      CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
        PBEx_Speech = OpenLibrary(#PB_Any, "PB.Ex_Speech_x86.dll")
      CompilerElseIf #PB_Compiler_Processor = #PB_Processor_x64
        PBEx_Speech = OpenLibrary(#PB_Any, "PB.Ex_Speech_x64.dll")
      CompilerEndIf
      
      If PBEx_Speech
        Prototype TextToSpeaker(Text.p-Unicode, Voice.p-Unicode, Speed, Volume, Asynchronous, ErrorOutput)
        Global TextToSpeaker.TextToSpeaker = GetFunction(PBEx_Speech, "TextToSpeaker")
        Prototype TextToAudioFile(Text.p-Unicode, Voice.p-Unicode, Speed, Volume, SaveFilePath.p-Unicode, ErrorOutput)
        Global TextToAudioFile.TextToAudioFile = GetFunction(PBEx_Speech, "TextToAudioFile")
        Prototype SpeechRecognition(WordArray, WordArraySize, ErrorOutput)
        Global SpeechRecognition.SpeechRecognition = GetFunction(PBEx_Speech, "SpeechRecognition")
        Prototype WaitSpeechRecognition(RecognizedWord)
        Global WaitSpeechRecognition.WaitSpeechRecognition = GetFunction(PBEx_Speech, "WaitSpeechRecognition")
        Prototype KillSpeechRecognition()
        Global KillSpeechRecognition.KillSpeechRecognition = GetFunction(PBEx_Speech, "KillSpeechRecognition")
        
        Define RecognizedWord$ = Space(1024)
        Define ErrorOutput$ = Space(1024)
        Define IsRecognized
        Dim WordArray.s(5)
        WordArray(0) = "Hallo"
        WordArray(1) = "Waschmaschine"
        WordArray(2) = "Installation"
        WordArray(3) = "Basic"
        WordArray(4) = "Willkommen"
        WordArray(5) = "Liebe"
        
        If SpeechRecognition(0, 0, @ErrorOutput$) = 0
          WaitSpeechRecognition(@RecognizedWord$)
          Debug RecognizedWord$
        EndIf
        
        If SpeechRecognition(WordArray(), ArraySize(WordArray())+1, @ErrorOutput$) = 0
          Repeat
            IsRecognized = WaitSpeechRecognition(@RecognizedWord$)
            If IsRecognized = 1
              Debug "Erkannt: " + RecognizedWord$
              Break
            ElseIf IsRecognized = 2
              If RecognizedWord$ = ""
                Debug "Es wurde nichts richtiges erkannt."
              Else
                Debug "Es wurde nichts richtiges erkannt, vielleicht dieses Wort: " + RecognizedWord$ + "?"
              EndIf
            EndIf
          ForEver
        EndIf
        
        KillSpeechRecognition()
        
        CloseLibrary(PBEx_Speech)
      EndIf
  • WaitSpeechRecognition()
    • Syntax:

      Code: Alles auswählen

      Result = WaitSpeechRecognition(@RecognizedWord$)
    • Beschreibung: Gibt 1 und das Wort zurück, wenn ein festgelegtes Wort von der Funktion SpeechRecognition() erkannt wurde. Oder 2, wenn nichts oder ein ähnliches Wort erkannt wurde.
    • Parameter:
      1. @RecognizedWord$: Das erkannte Wort wird in die String-Variable gespeichert. Falls kein richtiges Wort erkannt wurde, dann wird entweder leer oder ein ähnliches Wort zurückgegeben.
    • Rückgabewert:
      • 1: Ein festgelegtes Wort wurde erkannt.
      • 2: Es wurde kein richtiges Wort erkannt.
  • KillSpeechRecognition()
    • Syntax:

      Code: Alles auswählen

      Result = KillSpeechRecognition()
    • Beschreibung: Beendet hart das Spracherkennungsprogramm von Windows.
    • Parameter: Keine
    • Rückgabewert:
      • 0: Der Vorgang war erfolgreich.
Systemvoraussetzungen:
  • Windows XP oder höher
  • .NET Framework 4 oder höher
  • Unicode-Aktivierung (standardmäßig ab PB 5.50)
Lizenz: Diese DLL-Datei ist kostenlos und darf sowohl privat als auch kommerziell verwendet werden.
Folgende Copyright-Texte müssen mitgeliefert werden:
Copyright © 2019 RSBasic.de
Download: https://www.rsbasic.de/downloads/downlo ... Speech.zip
Bild

Ich würde mich über Feedbacks, Verbesserungsvorschläge, Fehlermeldungen oder Wünsche sehr freuen. Wer mich unterstützen möchte, kann mir auch was kleines spenden. Danke :)
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
¯\_(ツ)_/¯
Beiträge: 141
Registriert: 18.08.2017 09:35

Re: PB.Ex Speech (Windows)

Beitrag von ¯\_(ツ)_/¯ »

Geil danke :allright:
Bild
Benutzeravatar
Bisonte
Beiträge: 2427
Registriert: 01.04.2007 20:18

Re: PB.Ex Speech (Windows)

Beitrag von Bisonte »

Ehrlich gesagt.... Wow.
Nun hab ich das ganze mal ausgetestet.

Schade, das die Windows Spracherkennung automatisch gestartet wird und sichtbar ist, aber wenn das nicht vermeidbar ist. ok.
Interessanterweise wird bei mir die Spracherkennung gestartet und schaltet sich automatisch auf : AUS !

Wenn ich auf Spracheingabe warte... blockiere ich ja komplett den Programmablauf. Das ist nicht so gut. Wie soll man denn nebenbei
noch Events auswerten ? Ein EventSystem wäre gut. Meinetwegen #PB_Ex_SpeechRecognition, besser natürlich eigenes angeben lassen.

Desweiteren wäre es gut, wenn man ausserdem die Arraynummer zurückbekommt, von dem Wort was erkannt wurde.
Also die ID des Wortes im Array würde eigentlich auch schon komplett reichen ;)
Es wäre zusätzlich auch gut zu wissen, was Windows denn nun überhaupt für ein Wort erkannt hat...

Also alles in allem :
- ID des Wortes reicht (spart man sich evt. irgendwelche Stringgeschichten), weil man kennt ja sein Array :mrgreen:
- Bei Rückgabe von -1 eventuell bereitstellen, was erkannt wurde .... Hilft ungemein bei Fehlersuche des Users ob der genuschelt hat ;)
- Und das ganze nicht blockierend, am besten per Event an ein Fenster senden (das man natürlich noch mit angeben müsste)
PureBasic 6.04 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: PB.Ex Speech (Windows)

Beitrag von RSBasic »

Danke für dein Feedback. :)
Bisonte hat geschrieben:Schade, das die Windows Spracherkennung automatisch gestartet wird und sichtbar ist, aber wenn das nicht vermeidbar ist. ok.
Ja, das kommt von der Schnittstelle automatisch. Microsoft wollte anscheinend nicht, dass man heimlich lauscht, sondern dass der Nutzer immer sofort sieht.
Bisonte hat geschrieben:Wenn ich auf Spracheingabe warte... blockiere ich ja komplett den Programmablauf.
Du kannst das in einem separaten Thread laufen lassen. So war mein Plan. Ich könnte später mal schauen, ob es eine andere Möglichkeit gibt. Vielleicht eine separate Get-Funktion, um zu prüfen, ob ein Wort erkannt wurde, aber diese müsste man auch in einer Schleife aufrufen. Eine Prozedur-Übergabe mit externem Call-Aufruf habe ich nicht hingekriegt.
Bisonte hat geschrieben:Es wäre zusätzlich auch gut zu wissen, was Windows denn nun überhaupt für ein Wort erkannt hat...
  • WaitSpeechRecognition()
    • Syntax:

      Code: Alles auswählen

      Result = WaitSpeechRecognition(@RecognizedWord$)
    • Beschreibung: Gibt 1 und das Wort zurück, wenn ein festgelegtes Wort von der Funktion SpeechRecognition() erkannt wurde.
    • Parameter:
      1. @RecognizedWord$: Das erkannte Wort wird in die String-Variable gespeichert.
    • Rückgabewert:
      • 1: Ein festgelegtes Wort wurde erkannt.
:)
Bisonte hat geschrieben:Also die ID des Wortes im Array würde eigentlich auch schon komplett reichen ;)
Das ist nicht möglich, da ich von Windows nur das erkannte Wort als String bekomme. Da müsste ich dann im Array nach dem String suchen, aber wenn das Array mal groß sein sollte, finde ich das nicht so gut.
Bisonte hat geschrieben:- Bei Rückgabe von -1 eventuell bereitstellen, was erkannt wurde .... Hilft ungemein bei Fehlersuche des Users ob der genuschelt hat ;)
Das ist nicht möglich. Ich erhalte von der Schnittstelle keine Rückmeldung, ob ein gesprochenes Wort nicht verstanden wurde, sondern nur, ob was erkannt wurde.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: PB.Ex Speech (Windows)

Beitrag von RSBasic »

Bisonte hat geschrieben:- Bei Rückgabe von -1 eventuell bereitstellen, was erkannt wurde .... Hilft ungemein bei Fehlersuche des Users ob der genuschelt hat ;)
Es gibt doch noch einen weiteren EventHandler, der aufgerufen wird, wenn keines der angegebenen Wörter erkannt wurde. Update kommt später.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Bisonte
Beiträge: 2427
Registriert: 01.04.2007 20:18

Re: PB.Ex Speech (Windows)

Beitrag von Bisonte »

Beschreibung: Gibt 1 und das Wort zurück, wenn ein festgelegtes Wort von der Funktion SpeechRecognition() erkannt wurde.
Wenn ein Wort aus dem übergebenen Array erkannt wurde, gibt es eine 1 und das Wort zurück.
ABER wenn der User nuschelt und nicht Waschmaschine erkannt wurde, sondern was anderes ..... Das ware klasse...

Kennst du "VoiceAttack" ? Das ist ein Programm das die Windows Sprachsteuerung benutzt, um z.B. in Spielen auf Sprachbefehl Tasten zu drücken,
Maus bewegen etc....

Da funktioniert das ähnlich wie hier. Eine Liste von Wörtern die bestimmten Befehlen zugeordnet sind.
Wenn irgendwie das Mikro aktiv wird, wird angezeigt, was da erkannt wurde... egal ob das Wort in der Liste steht oder nicht,
und wenn es passt gibts erfolgmeldung und die dazugehörige aktion wird ausgeführt.

Das mit dem Event, dachte ich du könntest irgendwie ein SendMessage an eine WindowID machen, wenn ein Wort erkannt wurde....
Also das ganze intern (DLL) regeln. Dass der User eventuell die WindowID und die Eventnummer seiner Wahl mit angibt.

Im Thread hatte ich das nicht probiert, da ich nicht wusste ob das auch läuft ;)

Edit : Überschnitten ;)
PureBasic 6.04 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: PB.Ex Speech (Windows)

Beitrag von RSBasic »

PB.Ex Speech 1.0.1.0 wurde veröffentlicht.

Changelog:
  • Hinzugefügt: Rückgabewert "2" der Funktion WaitSpeechRecognition(), wenn kein richtiges oder ähnliches Wort erkannt wurde.
Bisonte hat geschrieben:du könntest irgendwie ein SendMessage an eine WindowID machen, wenn ein Wort erkannt wurde....
Diese Idee hatte ich anfangs auch, aber ich wollte kein Fenster voraussetzen.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Bisonte
Beiträge: 2427
Registriert: 01.04.2007 20:18

Re: PB.Ex Speech (Windows)

Beitrag von Bisonte »

Schon ganz gut, obwohl meistens das RecognizedWord$ leer bleibt .... aber das ist Windows SpeechRecognition ;)

Allerdings fällt mir grade auf :

Das Programm startet, und es wird die Spracherkennung gestartet.
Allerdings beim beenden wird diese nicht geschlossen. Das muss man immer von Hand machen.

Geht das, die Spracherkennung wieder zu schliessen, meinetwegen auch per Extra Befehl ?
(Das kleine Fenster mit dem Mikro drin das irgendwo auf dem Desktop erscheint....)
PureBasic 6.04 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: PB.Ex Speech (Windows)

Beitrag von RSBasic »

Ich konnte leider nichts finden, um das automatisch von Windows gestartete Programm per Methode zu beenden.
Die Methoden wie Dispose() u.ä. sorgen leider nicht dafür, dass das Programm beendet wird.
Ich könnte den Prozess manuell killen (sowas wie KillSpeechRecognitionProgram()), aber ist nur die Frage, ob das in Ordnung ist?
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Kirito
Beiträge: 11
Registriert: 23.01.2018 13:54

Re: PB.Ex Speech (Windows)

Beitrag von Kirito »

Wow! Erstmal vielen Dank für deine Mühe - das ist sehr nützlich :)
Wie ich das lese, braucht man vordefinierte Worte. Ist es irgendwie möglich
auch Worte erkennen zu lassen? Sprich ich sage "Hallo dies ist ein Test"
und erhalte den Satz als String von der Funktion? :)

Mfg,
Kirito
~ Lately, there are days I can’t even remember the other world.
Antworten