Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Synthesizer.Speak-System.Speech.dll上的应用程序退出-非Microsoft语音_C#_Speech - Fatal编程技术网

C# Synthesizer.Speak-System.Speech.dll上的应用程序退出-非Microsoft语音

C# Synthesizer.Speak-System.Speech.dll上的应用程序退出-非Microsoft语音,c#,speech,C#,Speech,我有一个问题,我对问题原因的理解是暗示我,而不是回避问题的过程。我想知道是否有人能进一步解释我为什么会遇到这个问题 我用本地计算机安装的语音填充组合框: private void getSystemVoices() { foreach (InstalledVoice voiceName in synthesizer.GetInstalledVoices()) { this.voiceComboBox.Items.Add(voiceName.VoiceInfo.Name); } } 我的应用程序

我有一个问题,我对问题原因的理解是暗示我,而不是回避问题的过程。我想知道是否有人能进一步解释我为什么会遇到这个问题

我用本地计算机安装的语音填充组合框:

private void getSystemVoices()
{
foreach (InstalledVoice voiceName in synthesizer.GetInstalledVoices())
{
this.voiceComboBox.Items.Add(voiceName.VoiceInfo.Name);
}
}
我的应用程序在x86CPU下运行,因此所有已安装的语音都将填充在此组合框中。我安装了一些Acapela Voice,我相信它们符合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);

只有Microsoft SpeechSynthesizer才会出现问题。

当.Net应用程序像那样崩溃时,您通常会在计算机应用程序事件日志中看到事件。您可以通过执行以下操作(Windows 7)来查找事件日志:

  • 单击开始
  • 右键单击
    计算机
    我的计算机
  • 在左树状视图中,展开事件查看器
  • 展开Windows日志
  • 单击
    应用程序
您应该会在日志中看到一个错误图标,其中包含有关崩溃的详细信息


如果要使应用程序崩溃,以防止任何try-catch块捕获异常,可以通过调用
Environment.FailFast()不建议或不建议正常执行此操作(除了少数常见的内存损坏或检测到篡改的情况)。它将产生与一些本机代码的错误行为相同的效果,异常抛出者中如雨后春笋般涌现的SuperMario:-)。虽然这并不能直接回答您的问题,但它通过捕获的方式表明这可能是一个顺序类似的错误(内存损坏,或语音检测到未经许可的使用等)。

CLR无法看到非托管线程中出现的异常。您肯定会在输出窗口中看到一些内容。你需要语音供应商的支持才能成功。谢谢Hans,是的,我还怀疑Microsoft代码和其他安装的语音存在某种广泛的支持问题。Ivona和Acapela都有相同的问题,所以我怀疑这不在语音中,而是在语音中的Microsoft基本代码中。dll这可能是一个有用的链接:您好,Frank,请参阅上面的:SpVoice Voice属性(SAPI 5.3)这是有效的。问题出在System.Speech.Synthesis.SpeechSynthesizer类中,而不是SPVoice类Hi Louis,请理解您的意思,是的,我已经在“应用程序”选项卡和“系统”选项卡下对事件日志进行了典型检查,以查看是否记录了更多信息。没有记录任何错误!我所有的声音都是有执照的,可以在其他应用中使用。在这种情况下,使用Environment.FailFast不起作用。如果您已经测试过此代码,请发布您的代码示例。不幸的是,此信息无助于解决此问题。在没有记录任何事件日志消息的情况下(应该由操作系统记录,而不是由.Net应用程序记录),应用程序如您所述崩溃的情况极为罕见。我怀疑它终究没有崩溃。捕捉后面的断点是否被击中?我假设您在Windows窗体上,那么如果您在主窗体上覆盖
onclose
OnClosed
并在其中放置断点,它们会被命中吗?如果是这样,请检查堆栈跟踪以查看close命令来自何处。我使用计算机已有30多年,我同意不记录事件的情况并不常见。然而,它确实发生了。请随时测试我上面提供的代码。我相信,正如Hans指出的,这里的问题是这是非托管代码。未在应用程序中封送。Microsoft Speech.dll在某些情况下有问题。它似乎不是完全向后兼容的。我确实测试了你的代码,但缺少自定义的声音,这似乎不是免费的。你也查过痕迹了吗?默认情况下,它将记录到VisualStudio中的调试输出,但类似的工具也会显示它们。哇,你已经用电脑很久了!还记得以前的语音API吗?那么在C64上呢?。。。没关系,谢谢你的否决票。是的,老派,Vic 20,ZX频谱,所有从5英寸和1/2英寸软盘或旧磁带机加载游戏的乐趣。我记不起准将C64上的山姆了?是的,输出窗口本身没有错误,这条消息看起来有点不祥。我会尽量把它放到蚂蚁的帖子里,我觉得这和它没有关系。
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);