我正在使用sapi并尝试制作简单的控制台应用程序。
class Program
{
static void Main(string[] args)
{
var uniq = Guid.NewGuid().ToString() + ".wav";
string filename = @"C:\Users\Денис\Desktop\" + uniq;
var voc = new Vocalizer("Vocalizer for Enterprise Milena 22kHz");
var sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 2000; i++)
{
voc.SpeakToFile("testphrase", filename);
Console.WriteLine((i + 1) + "times recorded.");
}
sw.Stop();
Console.WriteLine(sw.Elapsed);
}
}
这是类的代码:
public class Vocalizer
{
private SpeechVoiceSpeakFlags _spFlags = SpeechVoiceSpeakFlags.SVSFlagsAsync;
private SpVoice _speaker = new SpVoice();
public Vocalizer(string vocalizerString)
{
_speaker.Voice = _speaker.GetVoices().Cast<SpObjectToken>().Single(vo => vo.GetDescription() == vocalizerString);
}
public void SpeakToFile(string phrase, string filepath)
{
var spFileMode = SpeechStreamFileMode.SSFMCreateForWrite;
var spFileStream = new SpFileStream();
spFileStream.Open(filepath, spFileMode, false);
_speaker.AudioOutputStream = spFileStream;
_speaker.Speak(phrase, _spFlags);
_speaker.WaitUntilDone(Timeout.Infinite);
spFileStream.Close();
}
}
问题是:如果我使用附带的调试器从VS运行我的应用程序,它可以正常工作(无论是Debug还是Release版本)。 但是,如果我试图在VS之外运行它或没有连接调试器,它就会冻结
_speaker.AudioOutputStream = spFileStream;
没有错误,消息,警告或异常。 我通过我的试验发现的最后一件事是,如果我在我的控制台应用程序中放置类的函数代码(SpeakToFile),应用程序就可以在没有附加调试器的情况下工作,但这不是解决方案,因为它应该是单独的类库。
我正在使用自定义发声器Mileena(细微差别)。 默认的Windows预安装的发声器可以正常使用我的应用程序。