Speech Programm für Console

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Ironsmurf
Beiträge: 111
Registriert: 04.01.2006 12:57
Computerausstattung: AMD FX(tm)-6300 Six-Core Processor
3.50 GHz / 8 GB Ram
Windows 7 / 64bit / Ultimate
Purebasic 5.20 LTS (Windows - x86)
Wohnort: Deutschland

Speech Programm für Console

Beitrag von Ironsmurf »

Hallo zusammen
möchte gerne Texte von einem Programm vorlesen lassen, habe folgenden Programm Code gefunden.

Code: Alles auswählen

Enumeration
  #Window_0
EndEnumeration

Enumeration
  #speechdll
  #StringGadget_0
  #ButtonGadget_1
  #ButtonGadget_2
EndEnumeration

OpenLibrary(#speechdll, "Speech.dll")

Procedure.l InitSpeech()
  value.l = CallFunction(#speechdll, "InitSpeech")
  ProcedureReturn value
EndProcedure

Procedure.l PlaySpeech(s.l,lg.l)
  value.l = CallFunction(#speechdll, "PlaySpeech",s,lg)
  ProcedureReturn value
EndProcedure


Procedure.l StopSpeech()
  value.l = CallFunction(#speechdll, "StopSpeech")
  ProcedureReturn value
EndProcedure


Procedure.l DeInitSpeech()
  value.l = CallFunction(#speechdll, "DeInitSpeech")
  ProcedureReturn value
EndProcedure

Procedure OpenWindow_Window_0()

  If OpenWindow(#Window_0, 236, 180, 400, 400, "Sprachausgabe", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)

    If CreateGadgetList(WindowID(#Window_0))
      StringGadget(#StringGadget_0, 5, 10, 385, 315, "Hallo, ich bin eine Filmdatenbank, was kann ich für Dich tun. Bitte mache eine Eingabe.")
      ButtonGadget(#ButtonGadget_1, 40, 340, 110, 35, "Text sprechen")
      ButtonGadget(#ButtonGadget_2, 160, 340, 110, 35, "Sprache stoppen")
    EndIf
  EndIf
EndProcedure

OpenWindow_Window_0()

InitSpeech()

Repeat

  Event = WaitWindowEvent()

  Select Event

    Case #PB_Event_Gadget

      EventGadget = EventGadget()

      EventType = EventType()

      If EventGadget = #StringGadget_0

      ElseIf EventGadget = #ButtonGadget_1
        
      inhalt.s = GetGadgetText(#StringGadget_0)
      
      PlaySpeech(@inhalt,Len(inhalt))
      
      ElseIf EventGadget = #ButtonGadget_2

      StopSpeech()

      EndIf

    Case #PB_Event_CloseWindow

      EventWindow = EventWindow()

      If EventWindow = #Window_0

      DeInitSpeech()

        Break

      EndIf

  EndSelect

ForEver
Möchte es nun in ein Consolenprogramm übernehmen, habe es auch hin bekommen, jedoch habe ich noch Probleme, das die Computerstimme ausspricht, bis jetzt arbeite ich mit Delay, oder einer For Next Schleife.
eine Repeat, Forever Schleife kommt nicht in Frage, es geht nur um Kommentar zu Beginn des Programms.
Benutze Steffi als Stimme, soweit ist alles Ok, Event = WaitWindowEvent() kann ich nicht benutzen, weil Console, kommt immer Fehlermeldung, Fenster muss geöffnet sein.
Wer kann einem Anfänger unter die Arme greifen, nun noch mein Code.

Code: Alles auswählen

InitSpeech()
Sagen.s = " Ich bin die Computerstimme Steffi."
PlaySpeech(@Sagen,Len(Sagen))
Sagenlaenge = Len(Sagen)
For K = 1 To Sagenlaenge
  Delay(90)
Next 
Wie gesagt, arbeite mit einer Schleife, bin darüber aber nicht sehr glücklich.

Vielen Dank im voraus für eure Hilfe :) :) :)
Es kommt immer auf die Sichtweise des Betrachters an.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Speech Programm für Console

Beitrag von ts-soft »

Die Scheife ist ja auch überflüssig :wink:

Code: Alles auswählen

InitSpeech()
Sagen.s = " Ich bin die Computerstimme Steffi."
PlaySpeech(@Sagen,Len(Sagen))
Sagenlaenge = Len(Sagen)
Delay(90 * Sagenlaenge)
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Speech Programm für Console

Beitrag von STARGÅTE »

Ich kann mir aber nicht vorstellen, das jeder Buchstabe (speziell die Leerzeichen ^^) genau 90ms dauert ...
Gibt es bei dieser DLL nicht auch die möglichkeit abzufragen, ob das PlaySpeech noch "spielt"?
zB mit dem Rückgabewert von PlaySpeech() ?
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Ironsmurf
Beiträge: 111
Registriert: 04.01.2006 12:57
Computerausstattung: AMD FX(tm)-6300 Six-Core Processor
3.50 GHz / 8 GB Ram
Windows 7 / 64bit / Ultimate
Purebasic 5.20 LTS (Windows - x86)
Wohnort: Deutschland

Re: Speech Programm für Console

Beitrag von Ironsmurf »

Darauf wollte ich hinaus, das Programm soll einfach warten bis die Computerstimme ausgesprochen hat und dann im Programmverlauf weiter machen.
Es kommt immer auf die Sichtweise des Betrachters an.
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Speech Programm für Console

Beitrag von bobobo »

Die Länge der erzeugten Wave ist erstmal unbekannt ..
aber das Reden ist doch im Hintergrund

also geht folgendes

Code: Alles auswählen

#Speechdll=0
OpenLibrary(#speechdll, "Speech.dll")
Procedure.l InitSpeech()
  value.l = CallFunction(#speechdll, "InitSpeech")
  ProcedureReturn value
EndProcedure
Procedure.l PlaySpeech(s.l,lg.l)
  value.l = CallFunction(#speechdll, "PlaySpeech",s,lg)
  ProcedureReturn value
EndProcedure
Procedure.l StopSpeech()
  value.l = CallFunction(#speechdll, "StopSpeech")
  ProcedureReturn value
EndProcedure
Procedure.l DeInitSpeech()
  value.l = CallFunction(#speechdll, "DeInitSpeech")
  ProcedureReturn value
EndProcedure
InitSpeech()
OpenConsole()
Procedure abfrage()
  PrintN("Wie heisst Du?")
  what.s="hallo "+Input()
  PlaySpeech(@what,Len(what))
  PrintN("Aha")
  PrintN("und wie lang ist Dein rechter Zeigefinger?")
  what.s=Input()
  PlaySpeech(@what,Len(what))
  PrintN("Aha")
  PrintN("und wie groß ist Dein linkes Ohr?")
  what.s=Input()
  PlaySpeech(@what,Len(what))
  PrintN("Aha")
  PrintN("Schnauze voll?")
  If LCase(Left(Input(),1)) ="j"
    DeInitSpeech()
    CloseConsole()
    End
  Else
    abfrage()
  EndIf
EndProcedure
abfrage()
nur als Ergänzung
die Speech.dll und andere nette Sachen von Frank Abbing finzte übrigens hier
http://frabbing.bplaced.net/
(die speech.dll bei dll , wo auch sonst:))
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
Ironsmurf
Beiträge: 111
Registriert: 04.01.2006 12:57
Computerausstattung: AMD FX(tm)-6300 Six-Core Processor
3.50 GHz / 8 GB Ram
Windows 7 / 64bit / Ultimate
Purebasic 5.20 LTS (Windows - x86)
Wohnort: Deutschland

Re: Speech Programm für Console

Beitrag von Ironsmurf »

Noch mal Vielen Dank für eure Hilfe,
hat mir weiter geholfen.
:mrgreen: :mrgreen: :mrgreen:
Es kommt immer auf die Sichtweise des Betrachters an.
Antworten