Sting Problem (Für eigene Sprachausgabe)
-
hallo nobody,
da ich nicht weis wie ich Zeichen für Zeichen einen String abarbeite, habe ich die If Schleife mit Find geschrieben.
Meine Frage war auch Zitat:
Wie mache ich das das immer erst das nächste Zeichen im String geprüft wird, und das entsprechene Wave abgespielt wird.
kannst du mir oder jemand anderes da mit einem kleinen Code Beispiel helfen.
-
Ich habe das jetzt so mit einer for schleife gelöst, habe jedoch ein Problem.
Hier ist erst einmal der Code.
void CSpeekDlg::OnSend() { CString strText; GetDlgItemText( IDC_TEXT, strText); SetDlgItemText( IDC_TEXT, ""); m_cList.SetCurSel(m_cList.AddString( strText));// Text im Chatfenster anzeigen for (int i=0; i< strText.GetLength(); i++) { if(strText[i] == 'a') { ::PlaySound(MAKEINTRESOURCE(IDR_a), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'b') { ::PlaySound(MAKEINTRESOURCE(IDR_b), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'c') { ::PlaySound(MAKEINTRESOURCE(IDR_c), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'd') { ::PlaySound(MAKEINTRESOURCE(IDR_d), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'e') { ::PlaySound(MAKEINTRESOURCE(IDR_e), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'f') { ::PlaySound(MAKEINTRESOURCE(IDR_f), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'g') { ::PlaySound(MAKEINTRESOURCE(IDR_g), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'h') { ::PlaySound(MAKEINTRESOURCE(IDR_h), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'i') { ::PlaySound(MAKEINTRESOURCE(IDR_i), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'j') { ::PlaySound(MAKEINTRESOURCE(IDR_j), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'k') { ::PlaySound(MAKEINTRESOURCE(IDR_k), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if (strText[i] == 'l') { ::PlaySound(MAKEINTRESOURCE(IDR_l), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'm') { ::PlaySound(MAKEINTRESOURCE(IDR_m), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'n') { ::PlaySound(MAKEINTRESOURCE(IDR_n), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'o') { ::PlaySound(MAKEINTRESOURCE(IDR_o), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'p') { ::PlaySound(MAKEINTRESOURCE(IDR_p), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'q') { ::PlaySound(MAKEINTRESOURCE(IDR_q), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'r') { ::PlaySound(MAKEINTRESOURCE(IDR_r), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 's') { ::PlaySound(MAKEINTRESOURCE(IDR_s), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 't') { ::PlaySound(MAKEINTRESOURCE(IDR_t), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'u') { ::PlaySound(MAKEINTRESOURCE(IDR_u), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'v') { ::PlaySound(MAKEINTRESOURCE(IDR_v), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'w') { ::PlaySound(MAKEINTRESOURCE(IDR_w), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'x') { ::PlaySound(MAKEINTRESOURCE(IDR_x), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'y') { ::PlaySound(MAKEINTRESOURCE(IDR_y), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'z') { ::PlaySound(MAKEINTRESOURCE(IDR_z), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == ' ') { ::PlaySound(MAKEINTRESOURCE(IDR_blank), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(300); } } }
das funktioniert soweit ganz gut. Es hört sich aber ein bischen stochend an weshalb ich bevor ich die einzelnen Buchstaben prüfe, Silben prüfen möchte.
Z.B kommt als nächstes im Sting ein "sch" dann spiele Wave "sch.wav" und nich s.wav c.wav und h.wav
Kann mir da jemand helfen?
-
Du müsstest in einer Datenbank alle möglichen Silben ablegen, und dann
den Text darauf testen...Devil
-
ja, so sollte ich es machen. Mein Problem ist aber das "if(strText[i]" ja immer nur ein Zeichen übersprüft.
Aber wenn ich die silbe "sch" prüfen möchte müssten ja die nächsten 3 Buchstaben verglichen werden, und wenn es zutrifft, das die 3 Buchstaben übersprungen werden. Wie stellle ich das an.[ Dieser Beitrag wurde am 18.02.2003 um 10:01 Uhr von asmodia editiert. ]
-
Silben könnte man wie folgt prüfen:
if((strText[i]=='s')&&(strText[i+1]=='c')&&(strText[i+2]=='h')) { //Dann spiele Sound von sch.wav ab i+=3; //Damit die Zeichen 'c' und 'h' übersprungen werden. }
-
Danke "ggt"!
Jetzt sieht mein Code so aus, und das "sch" wird jetzt abgespielt, aber wenn ich nur ein s eingebe kommt ne Fehlermeldung afx.inl Linie 177
Was ist noch falsch?if((strText[i]=='s')&&(strText[i+1]=='c')&&(strText[i+2]=='h')) { ::PlaySound(MAKEINTRESOURCE(IDR_sch), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); i+=3; //Damit die Zeichen 'c' und 'h' übersprungen werden. } if(strText[i] == 'a') { ::PlaySound(MAKEINTRESOURCE(IDR_a), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'b') { ::PlaySound(MAKEINTRESOURCE(IDR_b), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'c') { ::PlaySound(MAKEINTRESOURCE(IDR_c), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'd') { ::PlaySound(MAKEINTRESOURCE(IDR_d), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'e') { ::PlaySound(MAKEINTRESOURCE(IDR_e), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'f') { ::PlaySound(MAKEINTRESOURCE(IDR_f), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'g') { ::PlaySound(MAKEINTRESOURCE(IDR_g), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'h') { ::PlaySound(MAKEINTRESOURCE(IDR_h), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'i') { ::PlaySound(MAKEINTRESOURCE(IDR_i), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'j') { ::PlaySound(MAKEINTRESOURCE(IDR_j), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'k') { ::PlaySound(MAKEINTRESOURCE(IDR_k), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if (strText[i] == 'l') { ::PlaySound(MAKEINTRESOURCE(IDR_l), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'm') { ::PlaySound(MAKEINTRESOURCE(IDR_m), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'n') { ::PlaySound(MAKEINTRESOURCE(IDR_n), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'o') { ::PlaySound(MAKEINTRESOURCE(IDR_o), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'p') { ::PlaySound(MAKEINTRESOURCE(IDR_p), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'q') { ::PlaySound(MAKEINTRESOURCE(IDR_q), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'r') { ::PlaySound(MAKEINTRESOURCE(IDR_r), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 's') { ::PlaySound(MAKEINTRESOURCE(IDR_s), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 't') { ::PlaySound(MAKEINTRESOURCE(IDR_t), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'u') { ::PlaySound(MAKEINTRESOURCE(IDR_u), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'v') { ::PlaySound(MAKEINTRESOURCE(IDR_v), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'w') { ::PlaySound(MAKEINTRESOURCE(IDR_w), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'x') { ::PlaySound(MAKEINTRESOURCE(IDR_x), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'y') { ::PlaySound(MAKEINTRESOURCE(IDR_y), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'z') { ::PlaySound(MAKEINTRESOURCE(IDR_z), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == ' ') { ::PlaySound(MAKEINTRESOURCE(IDR_blank), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(300); } } }
-
Nachtrag:
Der Debugger geht bis zur ZeileASSERT(nIndex < GetData()->nDataLength);
was muss ich ändern damit nicht mehr der Debugger kommt?
-
Du musst es so machen:
if((strText[i]=='s')&&(strText[i+1]=='c')&&(strText[i+2]=='h'))
{
::PlaySound(MAKEINTRESOURCE(IDR_sch), NULL, SND_RESOURCE | SND_ASYNC );
Sleep(150);
i+=3;
continue; // damit wird wieder zum anfang der forschleife gesprungen. Dadurch wird überprüft, ob i gültig ist
}
-
man kann es zwar so machen, aber versuch doch mal einen anderen Lösungsweg,
du müsstest dich mal mit dem Thema Parser auseinandersetzen, sonst hast du ellenlangen
code, den keiner mehr lesen kann...Devil
-
@ dEUs
Wenn nun das "s" in einem Wort steht wie "besser" meldet der Debugger sich nicht. Steht das s alleine oder endet das Wort mit einem s wie bei "Hals" kommt der Debugger! aber nur in der Debug Verion! kann ich das so lassen da kein Fehler in der Release Version kommt. Oder ist das dann fusch.@ devil81
du hast ja recht. Aber ich bi ein Mensch der Erfolge sehen muss um zu begreifen.
Später wenn ich besser Programmieren kann werde ich das mit einem Parser machen.Danke für eure Hilfe!
-
Hi,
Gibt es einen bestimmten Grund switch/ case in diesem Fall zu vermeiden? Das arme Programm muss immer alle ifs abprüfen. Das ist zwar angesichts nahezu unerschöpflicher Resourcen nicht allzu dramatisch, aber es tut einem ja in der Seele weh
!
Grüße, Volle.
-
Hallo ich bins nochmal.
Ich habe den Code ein bischen Kompakter gemacht, habe nun noch ein Problem.
hier ist erst einmal mein neuer Code:
void CSpeekDlg::OnSend() { CString strText; GetDlgItemText( IDC_TEXT, strText); SetDlgItemText( IDC_TEXT, ""); m_cList.SetCurSel(m_cList.AddString( strText));// Text im Listenfeld anzeigen for (int i=0; i< strText.GetLength(); i++) { /// 3 stellen Silben if((strText[i]=='s')&&(strText[i+1]=='c')&&(strText[i+2]=='h')){::PlaySound(MAKEINTRESOURCE(IDR_sch), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); i+=2; continue; } /// 2 stellen Silben if((strText[i]=='l')&&(strText[i+1]=='l')){::PlaySound(MAKEINTRESOURCE(IDR_l), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); i+=1; continue; } if((strText[i]=='e')&&(strText[i+1]=='i')){::PlaySound(MAKEINTRESOURCE(IDR_ei), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); i+=1; continue; } if((strText[i]=='i')&&(strText[i+1]=='e')){::PlaySound(MAKEINTRESOURCE(IDR_ie), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); i+=1; continue; } if((strText[i]=='h')&&(strText[i+1]=='a')){::PlaySound(MAKEINTRESOURCE(IDR_ha), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); i+=1; continue; } if((strText[i]=='h')&&(strText[i+1]=='o')){::PlaySound(MAKEINTRESOURCE(IDR_ho), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); i+=1; continue; } if((strText[i]=='h')&&(strText[i+1]=='u')){::PlaySound(MAKEINTRESOURCE(IDR_hu), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); i+=1; continue; } if((strText[i]=='c')&&(strText[i+1]=='h')){::PlaySound(MAKEINTRESOURCE(IDR_ch), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); i+=1; continue; } if((strText[i]=='k')&&(strText[i+1]=='a')){::PlaySound(MAKEINTRESOURCE(IDR_ka), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); i+=1; continue; } if((strText[i]=='k')&&(strText[i+1]=='o')){::PlaySound(MAKEINTRESOURCE(IDR_ko), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); i+=1; } if((strText[i]=='k')&&(strText[i+1]=='u')){::PlaySound(MAKEINTRESOURCE(IDR_ku), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); i+=1; continue; } // abc if(strText[i] == 'a'){::PlaySound(MAKEINTRESOURCE(IDR_a), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(190); } if(strText[i] == 'ä'){::PlaySound(MAKEINTRESOURCE(IDR_ae_), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'b'){::PlaySound(MAKEINTRESOURCE(IDR_b), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'c'){::PlaySound(MAKEINTRESOURCE(IDR_c), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'd'){::PlaySound(MAKEINTRESOURCE(IDR_d), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'e'){::PlaySound(MAKEINTRESOURCE(IDR_e), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'f'){::PlaySound(MAKEINTRESOURCE(IDR_f), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'g'){::PlaySound(MAKEINTRESOURCE(IDR_g), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'h'){::PlaySound(MAKEINTRESOURCE(IDR_h), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'i'){::PlaySound(MAKEINTRESOURCE(IDR_i), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'j'){::PlaySound(MAKEINTRESOURCE(IDR_j), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'k'){::PlaySound(MAKEINTRESOURCE(IDR_k), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'l'){::PlaySound(MAKEINTRESOURCE(IDR_l), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'm'){::PlaySound(MAKEINTRESOURCE(IDR_m), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'n'){::PlaySound(MAKEINTRESOURCE(IDR_n), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'o'){::PlaySound(MAKEINTRESOURCE(IDR_o), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'ö'){::PlaySound(MAKEINTRESOURCE(IDR_oe_), NULL, SND_RESOURCE | SND_ASYNC );Sleep(150); } if(strText[i] == 'p'){::PlaySound(MAKEINTRESOURCE(IDR_p), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'q'){::PlaySound(MAKEINTRESOURCE(IDR_q), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'r'){::PlaySound(MAKEINTRESOURCE(IDR_r), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 's'){::PlaySound(MAKEINTRESOURCE(IDR_s), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 't'){::PlaySound(MAKEINTRESOURCE(IDR_t), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'u'){::PlaySound(MAKEINTRESOURCE(IDR_u), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'ü'){::PlaySound(MAKEINTRESOURCE(IDR_ue_), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'v'){::PlaySound(MAKEINTRESOURCE(IDR_v), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'w'){::PlaySound(MAKEINTRESOURCE(IDR_w), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'x'){::PlaySound(MAKEINTRESOURCE(IDR_x), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'y'){::PlaySound(MAKEINTRESOURCE(IDR_y), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == 'z'){::PlaySound(MAKEINTRESOURCE(IDR_z), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(150); } if(strText[i] == ' '){::PlaySound(MAKEINTRESOURCE(IDR_blank), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(300); } } }
Mein Problem ist der Befehl Sleep(150); dadurch kann ich erst wieder den Dialog versieben, wenn der String komplett gesprochen wurde. Das ist zeimlich doof. Ich weis das man auch Pausen mit dem Timer machen kann, aber ich habe noch nie mit einem Timer in einer for Schleife gearbeitet.
Kann mir da nocheinmal jemand aus der Patsche helfen?
-
Hallo,
meine Sprachausgabe ist mit eurer Hilfe fast fertig.
Ich kann den Dialog aber wenn gesprochen wird nicht verschieben.Und wenn ich mir den Task meiner Anwendung beim sprechen anschaue,
steht da keine Rückmeldung.Hier ist ersteinmal der komplette Code:
void SpeekText(LPCTSTR strbla) { CString strText; strText +=strbla; strText.MakeLower(); for (int i=0; i< strText.GetLength(); i++) { //// ----------------------------------- Silben ------------------------------------- //// char* VierStellenSilbe[] = {"mail","hall","down","load","uche"}; // 5 char* DreiStellenSilbe[] = {"dra","dre","dro","dru","lei","lie","wei","www"," pc","pc ", "sch",".de","all","mir","dir","ben","ach","och","min","max", "kau","mei","mai","bei","ker","bis","pau","bau","bun","ter", "net","com"}; // 32 char* ZweiStellenSilbe[] = {"ba","be","bo","bu","da","de","do","du","ei","eu", "ga","ge","go","gu","la","le","lo","lu","ss","mm", "nn","ck","ie","ch","sp","ha","ho","hu","ka","ko", "ku","ma","zz","mo","mu","na","ne","no","nu","ta", "to","tu","ch","au","er","pa","pe","po","pu"};// 49 char* EineStelleSilbe[] = {"a","b","c","d","e","f","g","h","i","j", "k","l","m","n","o","p","q","r","s","t", "u","v","w","x","y","z"," ","ä","ö","ü", "ß","0","1","2","3","4","5","6","7","8", "9",".",",",";","(",")","{","}","[","]", "-","+","@","=","\"","/","\\","!","?","#", "%","*","&","<",">",":","`","~","$","²", "_","|"}; // 72 //// ----------------------------------- Wave IDS ----------------------------------- //// int VierSilbenID[] = {IDR_email,IDR_hall,IDR_down,IDR_load,IDR_uche}; // 5 int DreiSilbenID[] = {IDR_dra, IDR_dre, IDR_dro, IDR_dru, IDR_lei, IDR_lie, IDR_wei, IDR_www, IDR__pc, IDR__pc, IDR_sch, IDR__punktDE, IDR_all, IDR_mir, IDR_dir, IDR_ben, IDR_ach, IDR_och, IDR_min, IDR_max, IDR_kau, IDR_mei, IDR_mai, IDR_bei, IDR_ker, IDR_bis, IDR_pau, IDR_bau, IDR_bun, IDR_ter, IDR_net, IDR_com}; // 32 int ZweiSilbenID[] = {IDR_ba, IDR_be, IDR_bo, IDR_bu, IDR_da, IDR_de, IDR_do, IDR_du, IDR_ei, IDR_eu, IDR_ga, IDR_ge, IDR_go, IDR_gu, IDR_la, IDR_le, IDR_lo, IDR_lu, IDR_s, IDR_m, IDR_n, IDR_ck, IDR_ie, IDR_ch, IDR_sp, IDR_ha, IDR_ho, IDR_hu, IDR_ka, IDR_ko, IDR_ku, IDR_ma, IDR_z, IDR_mo, IDR_mu, IDR_na, IDR_ne, IDR_no, IDR_nu, IDR_ta, IDR_to, IDR_tu, IDR_ch, IDR_au, IDR_er, IDR_pa, IDR_pe, IDR_po, IDR_pu}; // 49 int EineSilbeID[] = {IDR_a, IDR_b, IDR_c, IDR_d, IDR_e, IDR_f, IDR_g, IDR_h, IDR_i, IDR_j, IDR_k, IDR_l, IDR_m, IDR_n, IDR_o, IDR_p, IDR_q, IDR_r, IDR_s, IDR_t, IDR_u, IDR_v, IDR_w, IDR_x, IDR_y, IDR_z, IDR_blank, IDR_ae_, IDR_oe_, IDR_ue_, IDR_s, IDR_0, IDR_1, IDR_2, IDR_3, IDR_4, IDR_5, IDR_6, IDR_7, IDR_8, IDR_9, IDR__punkt, IDR__komma, IDR__semicolon, IDR__klammerauf, IDR__klammerzu, IDR__klammerauf, IDR__klammerzu, IDR__eckigeklammerauf, IDR__eckigeklammerzu, IDR__minus, IDR__plus, IDR__aetzeichen, IDR__gleich, IDR__anfuehrungszeichen, IDR__slash, IDR__backslash, IDR__ausrufezeichen, IDR__fragezeichen, IDR__raute, IDR__prozent, IDR__sternchen, IDR__und, IDR__kleinerals, IDR__groesserals, IDR__doppelpunkt, IDR__apostroff, IDR__welle, IDR__dollar, IDR__hochzwei, IDR__unterstrich, IDR__trennstrich}; // 72 //// --------------------------------- Wave Pausen ---------------------------------- //// int VierSilbenP[] = {350, 350, 350, 350, 350}; // 5 int DreiSilbenP[] = {250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 150, 250, 250, 250, 250, 250, 250, 250, 250, 250, 150, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250}; // 32 int ZweiSilbenP[] = {140, 140, 140, 140, 140, 140, 140, 160, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140}; // 49 int EineSilbeP[] = { 80, 80, 80, 80, 80, 80, 30, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 30, 80, 80, 80, 80, 80, 40, 80, 80, 160, 40, 40, 40, 60, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 650, 650, 650, 650, 650, 1150, 1150, 350, 650, 650, 650, 1350, 650, 650, 650, 650, 650, 350, 650, 650, 650, 1350, 650, 650, 650, 650, 650, 650, 650}; // 72 //// ----------------------------- Abfrage Zeichenfolge ----------------------------- //// for(int j = 0;j < 5;j++) { CString strVierStellen = strText.Mid(i, +4); if(strcmp(strVierStellen,VierStellenSilbe[j]) == 0) { ::PlaySound(MAKEINTRESOURCE(VierSilbenID[j]), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(VierSilbenP[j]); i+=4; } } for(int k = 0;k < 32;k++) { CString strDreiStellen = strText.Mid(i, +3); if(strcmp(strDreiStellen,DreiStellenSilbe[k]) == 0) { ::PlaySound(MAKEINTRESOURCE(DreiSilbenID[k]), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(DreiSilbenP[k]); i+=3; } } for(int l = 0;l < 49;l++) { CString strZweiStellen = strText.Mid(i, +2); if(strcmp(strZweiStellen,ZweiStellenSilbe[l]) == 0) { ::PlaySound(MAKEINTRESOURCE(ZweiSilbenID[l]), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(ZweiSilbenP[l]); i+=2; } } for(int m = 0;m < 72;m++) { CString strEineStelle = strText.Mid(i, +1); if(strcmp(strEineStelle,EineStelleSilbe[m]) == 0) { ::PlaySound(MAKEINTRESOURCE(EineSilbeID[m]), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(EineSilbeP[m]); } } } }
zum Sprechen nehme ich dann den Code:
void CSpeekDlg::OnSpeek3() { CString strText; GetDlgItemText( IDC_TEXT, strText); //strText z.B mein name ist hans m_cInput.SetCurSel(m_cInput.AddString( strText));// Text im Inputfeld ablegen m_cList.SetCurSel(m_cList.AddString( strText));// Text im Listenfeld anzeigen SetDlgItemText( IDC_TEXT, ""); SpeekText(strText); }
aber das Problem ist wie schon gesagt das die Anwendung hängt bist der komplette String gesprochen wurde.
Das soll natürlich nicht so sein, da man das unterbrechen können muß, und natürlich auch den Dialog bewegen können muss.
Ich dachte das liegt an dem Sleep Befehl, aber auch wenn ich die Sleep Befehle lösche, und die Waves SND_SYNC abspiele lässt sich der Dialog nicht verschieben.
z.B.
::PlaySound(MAKEINTRESOURCE(DreiSilbenID[k]), NULL, SND_RESOURCE | SND_SYNC );
// Sleep(DreiSilbenP[k]);Hat jemand von euch eine Idee.
[ Dieser Beitrag wurde am 22.02.2003 um 17:00 Uhr von asmodia editiert. ]
[ Dieser Beitrag wurde am 22.02.2003 um 17:01 Uhr von asmodia editiert. ]
-
Erstell einen eigenen Thread mit der Sprachausgabe.
-
Hallo,
ich habe noch nicht mit Thread gearbeitet. Ich habe im Forum nach Thread
gesucht und auch was gefunden. Aber ich weis nicht wie ich da meinen Code reinbekomme. Kannst du mir da ein kleines Beispiel mit meinem Code geben?das wäre echt spitze, denn ich möchte endlich mit einem anderen Teil meiner Anwendung weiter machen als wie mich nur mit meiner Sprachausgabe zu befassen.
-
Ich nicht, aber bestimmt jemand anderes. Aber eigentlich solltest du mit der Suchfunktion schon einige Beispiel gefunden haben.
-
Aber mal im Ernst: Die Sprachausgabemodul von Microsoft mag zwar nicht besonders gut sein (gibt aber auch nichts viel besseres), aber ich denke die ist trotzdem noch viel besser als deine. :p
-
Original erstellt von <handa>:
Aber mal im Ernst: Die Sprachausgabemodul von Microsoft mag zwar nicht besonders gut sein (gibt aber auch nichts viel besseres), aber ich denke die ist trotzdem noch viel besser als deine. :pHallo handa,
Das Hauptproblem weshalb ich die MS Sprachausgage nicht verwenden möchte ist das es ab der 5 er Verion keine Deutsche Spracheausgabe mehr gibt.
Der zweite grund ist das jeder der mein Programm verwenden möchte sich die MSSpeech DLL installieren muss und meine Programme ohne irgendeine Installation auskommen soll.Der große Vorteil an meiner Sprachausgabe ist das jeder für seine eigene Stimme sich ganz einfach eine DLL erstellen kann da meiene Sprachausgabe später wenn Sie fertig ist freeware wird.
Man versteht jetzt schon jeden Satz, und mein ganzes Programm incl. aller Waves ist gerade mal 800 KB klein und man braucht nichst installieren.
Aber nun gut, bis es soweit ist muss ich sie ersteinmal fertig schreiben.
Ich habe mir das Threads Tut. von Henkers reingezogen:
http://mitglied.lycos.de/ehenkes/mfc_einsteigerbuch_kapitel17.htmdas Beispiel Programm funktioniert gut und ich möchte es jetzt auf meine Anwendung übertragen. Das habe ich nun soweit gemacht, aber wie übergebe ich
meinen Text der gesprochen wird in das Tread?hier ist erstmal der Code:
void CSpeekDlg::OnStartthread() { m_Flag = 1; CWinThread* pThread = AfxBeginThread (thrFunction, &m_Flag); } void CSpeekDlg::OnStopthread() { m_Flag = 0; } UINT CSpeekDlg::thrFunction(LPVOID pParam) { int* pFlag = (int*) pParam; while (*pFlag) { Sleep(1000); MessageBeep(0); // hier kommt das mein Code der Sprachausgabe rein } return 0; }
vorher habe ich das ja mit SpeekText(strText); gemacht. Wie kann ich das jetzt in mein Thread übergeben?
[ Dieser Beitrag wurde am 22.02.2003 um 19:28 Uhr von asmodia editiert. ]
-
Ich habe das Prob. gelöst.
bis demnächst!
-
[klugscheiß]Das heißt aber Speak, oder???[/klugscheiß]