2014-02-27 33 views
4

我有一個問題,因爲我對問題原因的理解暗指我,而不是解決問題的過程。我想知道是否有人可以進一步解釋我爲什麼會遇到這個問題?Synthesizer.Speak上的應用程序退出 - System.Speech.dll - 非微軟聲音

我填充本地計算機的安裝聲音組合框:

private void getSystemVoices() 
{ 
foreach (InstalledVoice voiceName in synthesizer.GetInstalledVoices()) 
{ 
this.voiceComboBox.Items.Add(voiceName.VoiceInfo.Name); 
} 
} 

我的應用程序的x86 CPU使所有已安裝的音色填充在ComboBox的下運行。我有一些安裝了Acapela的聲音,我相信他們是符合SAPI 5.1的。露西,希瑟和瑞安。

我測試此代碼使用聲音:

// Initialize a new instance of the SpeechSynthesizer... 
SpeechSynthesizer synthesizer = new SpeechSynthesizer(); 

// Config the audio output... 
synthesizer.SetOutputToDefaultAudioDevice(); 

// Initialize a new instance of the PromptBuilder... 
PromptBuilder promptBuilder = new PromptBuilder(); 

// Config SSML... 
promptBuilder.AppendSsmlMarkup("<voice xml:lang=\"en-AU\">"); 
promptBuilder.StartVoice(this.voiceComboBox.SelectedItem.ToString()); 
promptBuilder.AppendText("The quick brown fox jumps over the lazy dog."); 
promptBuilder.EndVoice(); 
promptBuilder.AppendSsmlMarkup("</voice>"); 

// Speak the prompt... 
synthesizer.Speak(promptBuilder); 

我的問題: 如果我有任何音色的選擇除了「微軟安娜」,我的應用程序退出。即使我使用Try/Catch語句。我沒有錯誤,也沒有調試信息說出現錯誤。如果我不更改默認語音,則不會發生此問題。

在我的理解中,Microsoft Speech API是向後兼容的?

Microsoft Speech

我使用.net4.5

,引用System.Speech.dll V4.0.0.0。

有人能解釋這種行爲嗎?

[編輯] 請注意:SPVoice代碼工作:

using SpeechLib; 

// SAPI 5.1 Speech Config... 
SpVoice voice = new SpVoice(); 
voice.Rate = speechRate.Value; 
voice.Volume = speechVolume.Value; 
voice.Voice = voice.GetVoices("", "").Item(voiceComboBox.SelectedIndex); 
voice.Speak(readerTextBox.Text, SpeechVoiceSpeakFlags.SVSFlagsAsync); 

只與微軟SpeechSynthesizer時出現的問題及其影響。

+2

CLR無法看到發生在非託管線程中的異常。你一定會在Output窗口看到一些東西。您需要來自語音供應商的支持才能到達某個地方。 –

+0

感謝Hans,是的,我也懷疑Microsoft代碼和其他Installed Voices的廣泛支持問題。 Ivona和Acapela都有同樣的問題,所以我懷疑它不是那麼強烈,但是在Speech.dll –

+0

中的Microsoft Base Code中,這可能是一個有用的鏈接:http://msdn.microsoft.com/en- us/library/ms723614(v = vs.85).aspx –

回答

0

當您的.Net應用程序崩潰時,您通常會在計算機應用程序事件日誌中看到一個事件。您可以通過以下操作(Windows 7)中的事件日誌:

  • 單擊開始
  • 右鍵單擊computermy computer
  • 在左樹視圖,展開Event Viewer
  • 展開Windows Logs
  • 點擊on Application

您應該看到一個錯誤圖標在日誌中提供有關崩潰的詳細信息。

如果您想要防止任何try-catch塊捕獲異常的應用程序崩潰,您可以通過調用Environment.FailFast();故意這樣做,不建議或通常這樣做(除了一些常見情況,其中內存已損壞或檢測到篡改)。它會和一些本地代碼的不良行爲 - 異常投擲者之間的Mushroomed-SuperMario有相同的效果:-)。雖然這並不能直接回答你的問題,但它通過你的捕獲發出的方式表明它可能是類似順序的錯誤(內存損壞,或者語音檢測到未經許可的使用等)。

+0

Hi Louis中,理解你在說什麼,是的,我已經在應用程序選項卡和系統選項卡下對事件日誌進行了典型檢查查看是否有更多的信息被記錄。沒有錯誤記錄!我所有的聲音都獲得許可,並在其他應用程序中工作。在這種情況下使用Environment.FailFast不起作用。如果你已經測試過這個代碼,請發佈你的代碼示例。不幸的是,這些信息並不能解決這個問題。 –

+0

對於應用程序來說,如果沒有記錄任何事件日誌消息(應該由操作系統記錄,而不是由.Net應用程序記錄),就像描述的那樣崩潰是非常罕見的。畢竟,我懷疑它並沒有崩潰。抓到背後的斷點是否受到打擊?我假設你在Windows窗體上,所以如果你在主窗體上重寫'OnClosing'和'OnClosed',並在其中放置斷點,它們會被擊中嗎?如果是這樣,請檢查堆棧跟蹤以查看關閉命令來自何處。 –

+0

我已經使用了大約30年的計算機,我同意看到事件未記錄的情況並不常見。但是,它確實發生。請隨時測試我上面提供的代碼。我相信,就像漢斯指出的那樣,這裏的問題就是Un-Managed Code。不適用於應用程序。 Microsoft Speech.dll在某些情況下有問題。看起來它並不完全向後兼容。 –