线程无法正常工作

我有一个应用程序,重复我听到的数字,然后记录我读到的数字。 数字是0,1,2,3,4,5,6,7,8,9 。 我使用for循环播放这些数字与文本到语音技能,这是来自第三方。

对于录制部分,我必须按照第三方要求将其放在单独的线程中。 要录制语音,方法很可能是:

  recordVoiceResource.Record(fileName); 

要停止它,请使用:

  recordVoiceResource.Stop(); 

现在我发现有时我的录音是0秒,这意味着代码可能没有达到Record行。 有时它只有2秒钟。 我相信线程安排是错误的。

  private ManualResetEvent terminate = new ManualResetEvent(false); PlayTTS("Please repeat the following numbers as you hear them."); Thread t = new Thread(() => RecordNumbers()); t.Start(); Thread.Sleep(2000); terminate.Set(); terminate.WaitOne(); PlayNumbers(); recordVoiceResource.Stop(); 

线程方法是:

  private void RecordNumbers() { recordVoiceResource = TelephonyServer.GetVoiceResource(); recordVoiceResource.MaximumSilence = 1; recordVoiceResource.MaximumTime = 30; // Start recording what I read from I heard recordVoiceResource.Record(fileName); } 

要玩游戏,

  private void PlayNumbers() { foreach (var item in numbers) { try { vr.PlayTTS(item.ToString()); // will be 0,1,2,...9 Thread.Sleep(2000); } 

根据您的评论,属性MaximumSilence获取或设置在下一个语音function终止之前允许的最大静音(以秒为单位)。 您将其设置为一秒钟,开始录制,然后在开始播放之前hibernate两秒钟,提示用户说些什么。 你在这看到问题吗? 假设麦克风在此期间没有拾取一些不相关的语音,录制将在播放开始之前停止。

由于数字播放之间有2秒的间隙,您可能需要将MaximumSilence设置为几秒钟。

也就是说,当然,假设您的目的是捕获用户说出所有数字的单个记录(这是您的代码的编写方式)。 如果您想单独捕获口述号码,则可能需要在播放每个号码时安排和同步单独的录音。 您可能需要仔细检查API以确保您的解决方案符合您的预期。

由于Thread.Sleep()很可能导致您的问题。 改为使用计时器:

 System.Timers.Timer Record = new System.Timers.Timer(); Record.Interval = 2000; Record.Elapsed += new System.Timers.ElapsedEventHandler(Record_Elapsed); void Record_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { Record.Enabled=false; PlayNumbers(); recordVoiceResource.Stop(); } 

并设置:

 Thread t = new Thread(() => RecordNumbers()); t.Start(); Record.Enabled=true;