2014-01-21 72 views
0

所有。感謝您的時間任何幫助表示讚賞。所有代碼的函數之前不執行被稱爲

這裏是我的問題:我已經寫在「Windows窗體VC++」一些代碼,將需要一個文本文件,在文件上執行語音到文本,使用文本到的翻轉語音算法。文字是用MS發聲後「說話」功能,那麼它應該寫入一個文本框,一些頭信息,並說了些什麼。之後,計數變量更新,然後另一個函數被調用時會從不同的方向合成另一種聲音。

問題是第一個聲音在正確的時間被正確合成,但是在標題信息和說出的單詞可以寫入文本框之前,第二個函數被調用並且一旦它結束,它就會用它的信息填充文本框只要。第一個信息沒有寫入文本框。

什麼可能會造成這個?我試圖拖延調用第二功能,但沒有成功幾種不同的方式。我可以確保使用盡可能多的幫助。我在這個問題中都編寫了代碼片段。謝謝你在前進,我希望尋求幫助是非常快的。再次感謝。

與呼叫到第二個第一代碼:

for(ClickCount_ATCText = 0; ClickCount_ATCText < FilesSelected_ATC_A; ClickCount_ATCText++) 
        { 
        SetChannelVolumeLevel(ATC_OverLord); 
        PlaySound(TEXT("c:\\SSL_Sound\\AC_AudioBackground.wav"), NULL, SND_FILENAME); 
        //GetWavFilePath(ATC_OverLord); 

        //if(ClickCount_ATCText > (FilesSelected_ATC_A - 1)) 
        //{ 
         //ClickCount_ATCText = 0; 
        //}// End DataLink if statement 

        SpeechSynthesizer^ Vocalize  = gcnew SpeechSynthesizer();             //Create a voice synthesizer instance. 

        string TTS_TxtPath    = ATC_TxtFiles[ClickCount_ATCText];            //The following two lines converts the standard string in to a system string for use in the StreamReader function. 
        String^ TTS_FilePath   = gcnew String(TTS_TxtPath.c_str());   

        StreamReader^ FileRead   = gcnew StreamReader(TTS_FilePath);            //Get the text file from the path identified. 
        String^ AutoTTSFileRead   = FileRead->ReadToEnd();              //Read the entire file and store the text characters in the string variable "AutoTTSFileRead".        

        Vocalize->Speak(AutoTTSFileRead);                    //Vocalize the text in the textbox. 

        //Sleep(3000);                         //Pause half a second before displaying the text. Not needed, but kept for reference. 

        //* The 6 lines code below provides a timestamp and formats the output of the data link message. 
        TextToSpeechTextbox->Text   = "       Data Link Message \r\n \r\n"; 
        time(&WhatTimeIsIt); 
        String^ strNew      = gcnew String(ctime(&WhatTimeIsIt)); 
        TextToSpeechTextbox->Text   = TextToSpeechTextbox->Text + "Timestamp: " + strNew + "\r\n"; 
        TextToSpeechTextbox->Text   = TextToSpeechTextbox->Text + "\r\n"; 
        TextToSpeechTextbox->Text   = TextToSpeechTextbox->Text + "Message: " + AutoTTSFileRead + "\r\n"; //Display the speech data in the text box.    

        ClickCount_ATCText++; 
        NE_STT_SLL_Function(); 

        }//End for loop 

**NE_STT_SLL_Function:** 

void NE_STT_SLL_Function() 
     { 
      //Sleep(3000); 

      SetChannelVolumeLevel(North_East);        //Set the volume level for this SSL and zero the rest. 

      PlaySound(TEXT("c:\\SSL_Sound\\AC_AudioBackground.wav"), NULL, SND_FILENAME);         //Play a snippet of radio noise in the background before sythesizing 

      if(ClickCount_NorthEastText >= (FilesSelected_NE - 1)) 
       { 
       ClickCount_NorthEastText = 0; 
       }// End DataLink if statement 

      SpeechSynthesizer^ Vocalize  = gcnew SpeechSynthesizer();             //Create a voice synthesizer instance. 

      string TTS_TxtPath    = NorthEast_TxtFiles[ClickCount_NorthEastText];         //The following two lines converts the standard string in to a system string for use in the StreamReader function. 
      String^ TTS_FilePath   = gcnew String(TTS_TxtPath.c_str());   

      StreamReader^ FileRead   = gcnew StreamReader(TTS_FilePath);            //Get the text file from the path identified. 
      String^ AutoTTSFileRead   = FileRead->ReadToEnd();              //Read the entire file and store the text characters in the string variable "AutoTTSFileRead".        

      Vocalize->Speak(AutoTTSFileRead);                    //Vocalize the text in the textbox. 

      //* The 6 lines code below provides a timestamp and formats the output of the data link message. 
      TextToSpeechTextbox->Text   = "     (NE) Sound Source Location Message \r\n \r\n"; 
      time(&WhatTimeIsIt); 
      String^ strNew      = gcnew String(ctime(&WhatTimeIsIt)); 
      TextToSpeechTextbox->Text   = TextToSpeechTextbox->Text + "Timestamp: " + strNew + "\r\n"; 
      TextToSpeechTextbox->Text   = TextToSpeechTextbox->Text + "\r\n"; 
      TextToSpeechTextbox->Text   = TextToSpeechTextbox->Text + "Message: " + AutoTTSFileRead + "\r\n"; //Display the speech data in the text box. 

      ClickCount_NorthEastText++; //Increment array index value. 
      return; 

      }//End NE STT SSL function 

回答

1

Windows窗體應用程序是基於一個消息循環。如果消息循環沒有時間執行,則不會顯示或刷新任何內容。如果您在for循環中更改文本,則只會顯示最後一個文本。另外請注意,Text2Speach通常是asynchonus。所以即使文本沒有被說出,函數也會返回。所以請使用完成的事件來處理您的操作...(SpeechSynthesizer::SpeakCompleted

此外,您不應該在Windows UI應用程序中使用Sleep或其他緊密循環。請考慮使用計時器(Windows :: Forms :: Timer)或考慮使用基於事件的處理!

相關問題