Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Vorleseprogramm liest nicht vor :) (https://www.delphipraxis.net/15466-vorleseprogramm-liest-nicht-vor.html)

MisterNiceGuy 29. Jan 2004 11:44


Vorleseprogramm liest nicht vor :)
 
Hi, hab hier mal angefangen eine Procedure zu schreiben, die ein Memo Buchstabe für Buchstabe durchgeht und jeden einzelnen vorliest. Jedoch tut sie das nicht :)
Wäre nett, wenn mir mal wer sagen könnte, woran das liegt.
Code:
procedure TForm1.play;
var buco, lico:integer;
var zeile:string;
begin
for lico:=0 to memo1.Lines.Count-1 do begin
           zeile := memo1.Lines[lico];
    for buco:=0 to length(zeile) do begin
        case zeile[buco] of
             'a' : begin
                     MP1.FileName := '/a.wav';
                     MP1.Play;
                   end;
             'b' : begin
                     MP1.FileName := '/b.wav';
                     MP2.Play;
                   end;
             'c' : begin
                         if ((zeile[buco-1] = 'a') OR (zeile[buco-1] = 'o') OR (zeile[buco-1] = 'u')) AND (zeile[buco+1] = 'h') then
                         begin
                              mp1.FileName := '/chr.wav';
                              mp1.Play;
                         end;
                         if ((zeile[buco-1] = 'i') OR (zeile[buco-1] = 'e')) AND (zeile[buco+1] = 'h') then
                         begin
                              mp1.FileName := '/ch.wav';
                              mp1.Play;
                         end;
                         if zeile[buco+1] = 'k' then
                         begin
                              mp1.FileName := '/ck.wav';
                              mp1.Play;
                         end;
                     if ((zeile[buco+1] <> 'h') AND (zeile[buco+1] <> 'k')) then
                     begin
                        MP1.FileName := '/c.wav';
                        MP1.Play;
                   end;
                   end;
             'd' : begin
                     MP1.FileName := '/d.wav';
                     MP1.Play;
                   end;
             'e' : begin
                     if zeile[buco+1] = 'i' then begin
                               MP1.FileName := '/ei.wav';
                               MP1.Play;
                               end
                     else begin
                     MP1.FileName := '/e.wav';
                     MP1.Play;
                     end;
                   end;
             'q' : begin
                     if zeile[buco+1] = 'u' then begin
                              MP1.FileName := '/qu.wav';
                              MP1.Play;
                              end
                              else begin
                     MP1.FileName := '/q.wav';
                     MP1.Play;
                     end;
                   end;
             'r' : begin
                     MP1.FileName := '/r.wav';
                     MP1.Play;
                   end;
             's' : begin
                     if ((zeile[buco+1] = 'c') AND (zeile[buco+2] = 'h')) then begin
                              MP1.FileName := '/sch.wav';
                              MP1.Play;
                              end
                              else
                     if (zeile[buco+1] = 's') then begin
                              MP1.FileName := '/ss.wav';
                              MP1.Play;
                              end
                              else begin
                     MP1.FileName := '/s.wav';
                     MP1.Play;
                     end;
                   end;

     end;
end;
end;
memo1.Enabled := true;
end;
Ich hab einige Buchstaben rausgenommen, da es sonst zu viel Text ist...

Buco ist ein Counter für die Buchstaben und Lico einer für die Zeilen des Memos.

sakura 29. Jan 2004 11:47

Re: Vorleseprogramm liest nicht vor :)
 
Das liegt an den Dateinamen - wo sind die zugehörigen Dateien gespeichert? Nimm mal den Slash (/) weg.

...:cat:...

MisterNiceGuy 29. Jan 2004 11:50

Re: Vorleseprogramm liest nicht vor :)
 
Die Dateien befinden sich im selben Verzeichnis wie das Programm. Er liest immer nur den ersten Buchstaben vor. Wenn ich 2 Mediaplayer einbaue, dann liest er auch das b, aber halt nur, wenn es an erster Stelle steht. Da muss irgendwo ein Fehler in den For-Schleifen sein... :wall:

Treffnix 29. Jan 2004 11:54

Re: Vorleseprogramm liest nicht vor :)
 
Hab noch nie mit Mediaplayer gearbeitet, aber kann es sein, dass man den wieder freigeben muss, bevor man ein neues Soundfile laden kann?

btw: Warum schreibste dir nicht ne Play-Function, der du in der Case-Struktur nur den Dateinamen übergibst. Das würde ne Menge Zeilen sparen und das ganze etwas übersichtlicher machen.

Edit: Noch ne Idee: Wartet das Programm, bis der Mediaplayer zu Ende gespielt hat oder kann es auch sein, dass der die Schleife schon komplett abgearbeitet hat, bevor der erste Buchstabensound zu Ende gespielt ist?

MisterNiceGuy 29. Jan 2004 12:02

Re: Vorleseprogramm liest nicht vor :)
 
Guter Tip! Danke, das ist mir garnicht eingefallen :) Werde mal ein paar sleeps reinsetzen.
Vielleicht optimier ich dann noch ein bischen, aber erstmal gucken ob es geht :)

danke!

Luckie 29. Jan 2004 12:30

Re: Vorleseprogramm liest nicht vor :)
 
Und nimm mal absolute Pafde anstatt relative. Dass er dei dateien findet ist reine Glückssache. :roll:

Schubi 29. Jan 2004 12:42

Re: Vorleseprogramm liest nicht vor :)
 
Delphi-Quellcode:
mediaplayer1.Wait := True
Dann Play, dein Programm wartet automatisch bis die Datei abgespielt ist. Gleicher Fall beim öffnen, auch hier wartet er!

Praktisch, oder?! :mrgreen:

Phoenix 29. Jan 2004 12:43

Re: Vorleseprogramm liest nicht vor :)
 
Zitat:

Zitat von MisterNiceGuy
Code:
        case zeile[buco] of
             'a' : begin
                     MP1.FileName := '/a.wav';
                     MP1.Play;
                   end;
             'b' : begin
                     MP1.FileName := '/b.wav';
                     MP2.Play;
                   end;
             'd' : begin
                     MP1.FileName := '/d.wav';
                     MP1.Play;
                   end;
Ich hab einige Buchstaben rausgenommen, da es sonst zu viel Text ist...

Okay, den case bei c wegen z.B. ch ist okay, aber warum machst Du nicht folgendes:

Delphi-Quellcode:
  case zeile[buco] of
      c: begin
         ...
         end;
      // alle weiteren spezialverhalten
  else
    begin
      MP1.FileName := zeile[buco] + '.wav';
      MP1.Play;
    end;
  end;
... ich meine, wenn der Buchstabe eh schon Teil vom Dateinamen ist, warum dann so viel tippen und nicht einfach dynamisch zusammenbauen? ;-)

trifid 29. Jan 2004 12:59

Re: Vorleseprogramm liest nicht vor :)
 
@MisterNiceGuy
aber warum verwendest Du nicht eine TTS-Engine (Text-To-Speech) die das für dich macht ?

MisterNiceGuy 29. Jan 2004 15:16

Re: Vorleseprogramm liest nicht vor :)
 
@Phoenix: Vielen Dank für den Tip, ich werd das Programm dann am Ende noch ein bisschen pressen. Hätte nie gedacht, dass das so klein wird! Sind insgesamt nicht mal 500KB inc. Soundfiles!

@trifid: Das tolle an Delphi ist ja, dass man seine eigenen Programme schreiben kann :lol:
Wollte nurmal versuchen, ob ich das hinkriege, die Idee gefällt mir total gut :)

Allerdings ist es sehr schwer, die einzelnen Laute so aufzunehmen, dass sie sich echt anhören, man müsste sie zur Laufzeit noch etwas verändern können. (Z.B. Tonhöhnen bei Satzenden etc.)
Kennt da einer ne Seite, wo es so ein Tutorial gibt??

trifid 29. Jan 2004 15:47

Re: Vorleseprogramm liest nicht vor :)
 
Zitat:

Kennt da einer ne Seite, wo es ...
klar, die machen das täglich :wink:
mbrola

MisterNiceGuy 29. Jan 2004 18:55

Re: Vorleseprogramm liest nicht vor :)
 
Nein Mensch :-D Ich meine eine Seite, die sich mit dem "Manipulieren" von Soundfiles in Delphi auseinandersetzt!

Er überprüft jeden Buchstaben des Memos, aber er spilt immernur den letzten! :wall:
Wahrscheinlich ist er zu schnell, aber mit Wait:=true; müsste er doch warten, bis jeder Buchstabe "gesprochen" wurde!

Hat einer noch eine andere Idee, wie ich ihn dazu bringen kann, dass er erst wartet, bis die Datei komplett abgespielt wurde?
Ich glaube nämlich, dass das Wait nur für die Mediaplayer-Komponente gilt...

d3g 29. Jan 2004 19:41

Re: Vorleseprogramm liest nicht vor :)
 
Zitat:

Zitat von MisterNiceGuy
Hat einer noch eine andere Idee, wie ich ihn dazu bringen kann, dass er erst wartet, bis die Datei komplett abgespielt wurde?
Ich glaube nämlich, dass das Wait nur für die Mediaplayer-Komponente gilt...

Da liegst du nicht so falsch. Im Prinzip blockiert das Abspielen eines Sounds das MCI-Device (das MCI-API liegt dem Mediaplayer zugrunde(sp?)). Das heißt auf Deutsch, dass nur ein Mediaplayer im ganzen System einen Sound spielen kann (wenn er über MCI geht). Du müsstest auf DirectSound ausweichen.

Schubi 29. Jan 2004 20:26

Re: Vorleseprogramm liest nicht vor :)
 
In der OH steht eindeutig, dass Wait das Programm stopp, so lang der Mediaplayer irgendwas macht

Mir fällt gerade ein, dass ich da auch mal so ein Problem hatte. Ich glaub es reicht nicht wenn du das File dem Mediaplayer nur zuweißt. Da gabs irgendwas wie loadfromfile, das musste nehmen wenn ich mich recht erinnere

probierst doch aus mit dem wait. nimm dir ne wav, spiel sie ab und danach ein showmessage

MisterNiceGuy 30. Jan 2004 08:25

Re: Vorleseprogramm liest nicht vor :)
 
Okay, hab jetzt wieder was interessates rausbekommen. .wait wird jedesmal nach dem Abspielen einer Datei wieder auf FALSE gesetzt. Find ich persönlich total dämlich! :gruebel:

Schubi 30. Jan 2004 08:39

Re: Vorleseprogramm liest nicht vor :)
 
Blöd isses, stimmt :mrgreen:
Geht jetzt?

MisterNiceGuy 30. Jan 2004 13:33

Re: Vorleseprogramm liest nicht vor :)
 
Hilfe, ich bin echt am Verzweifeln! :wall: Wie schaff ich es, dass das Programm mal wartet, bis der Mediaplyer seine Datei abgespielt hat?

Das muss doch jemand wissen :cry:

Schubi 30. Jan 2004 13:36

Re: Vorleseprogramm liest nicht vor :)
 
Funktioniert es denn nicht, wenn du wait jedesmal neu auf true setzt?

MisterNiceGuy 30. Jan 2004 13:52

Re: Vorleseprogramm liest nicht vor :)
 
Nein, hab ich schon probiert, man hört immernur den letzten Buchstaben :?

Schubi 30. Jan 2004 14:13

Re: Vorleseprogramm liest nicht vor :)
 
Na gut, dann auf die altmodische Tour! :mrgreen:

Setz Wait auf True, mach play, und setz danach ne Schleife hin.

Delphi-Quellcode:
repeat until not Mediaplayer1.Wait;
dann spielste den nächsten ab

Matze 30. Jan 2004 14:32

Re: Vorleseprogramm liest nicht vor :)
 
[OT]Klingen die Sätze nachher gut und deutlich?

Kann ich mir nicht so vorstellen. ;)[/OT]

Treffnix 30. Jan 2004 15:11

Re: Vorleseprogramm liest nicht vor :)
 
Zitat:

Zitat von Matze
[OT]Klingen die Sätze nachher gut und deutlich?

Kann ich mir nicht so vorstellen. ;)[/OT]

Definitiv: Nein.

Es wird sich immer nur wie eine Abfolge von Buchstaben, nie wie ein Wort anhören. Dazu müssten schon ganze Silben aufgenommen werden. Und selbst da würde es sich immer noch abgehackt anhören.

MisterNiceGuy 1. Feb 2004 09:16

Re: Vorleseprogramm liest nicht vor :)
 
Hmm, wenn ihr z.B. WebSpeech kennt, wisst ihr ja, dass sich die Sätze einigermaßen gut anhören. Es liegt nur daran, wieviele Sonderformen von Buchstaben integriert werden. Ich liege jetzt so bei 32 Unterscheidungen aber e werde sicherlich noch dutzende hinzukommen!

Leiderfunktioniert das Prog immernochnicht, muss wohl mal meinen Inf Lehrer fragen :pale:


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:25 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz