PureBoard
http://forums.purebasic.com/german/

PB.Ex Speech (Windows)
http://forums.purebasic.com/german/viewtopic.php?f=11&t=30692
Seite 1 von 4

Autor:  RSBasic [ 10.03.2018 23:49 ]
Betreff des Beitrags:  PB.Ex Speech (Windows)

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:
      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:
      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:
      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:
      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:
      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:
      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:
      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:
      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:
Zitat:
Copyright © 2019 RSBasic.de


Download: http://www.rsbasic.de/downloads/downloa ... 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 :)

Autor:  ¯\_(ツ)_/¯ [ 12.03.2018 16:38 ]
Betreff des Beitrags:  Re: PB.Ex Speech (Windows)

Geil danke :allright:

Autor:  Bisonte [ 12.03.2018 18:39 ]
Betreff des Beitrags:  Re: PB.Ex Speech (Windows)

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)

Autor:  RSBasic [ 12.03.2018 19:22 ]
Betreff des Beitrags:  Re: PB.Ex Speech (Windows)

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...

Zitat:
  • WaitSpeechRecognition()
    • Syntax:
      Code:
      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.

Autor:  RSBasic [ 12.03.2018 19:49 ]
Betreff des Beitrags:  Re: PB.Ex Speech (Windows)

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.

Autor:  Bisonte [ 12.03.2018 19:50 ]
Betreff des Beitrags:  Re: PB.Ex Speech (Windows)

Zitat:
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 ;)

Autor:  RSBasic [ 12.03.2018 20:57 ]
Betreff des Beitrags:  Re: PB.Ex Speech (Windows)

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.

Autor:  Bisonte [ 12.03.2018 21:51 ]
Betreff des Beitrags:  Re: PB.Ex Speech (Windows)

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....)

Autor:  RSBasic [ 12.03.2018 22:45 ]
Betreff des Beitrags:  Re: PB.Ex Speech (Windows)

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?

Autor:  Kirito [ 13.03.2018 14:53 ]
Betreff des Beitrags:  Re: PB.Ex Speech (Windows)

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

Seite 1 von 4 Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/