Sting Problem (Für eigene Sprachausgabe)



  • @ 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. :p

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

    das 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ß]


Anmelden zum Antworten