线程不能正常工作
本文关键字:工作 常工作 不能 线程 | 更新日期: 2023-09-27 18:06:48
我有一个应用程序,它是重复我听到的数字,然后记录我读到的数字。数字是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);
}
playNumbers ,
private void PlayNumbers()
{
foreach (var item in numbers)
{
try
{
vr.PlayTTS(item.ToString()); // will be 0,1,2,...9
Thread.Sleep(2000);
}
根据您的评论,属性MaximumSilence
获取或设置以秒为单位的最大沉默,直到下一个语音功能终止。您将其设置为一秒,开始录制,然后休眠两秒钟,然后开始播放,提示用户说些什么。你看到问题了吗?假设麦克风在这段时间内没有接收到一些不相关的语音,录制将在播放开始之前停止。
由于数字播放之间有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;