C# 螺纹不';我不能正常工作
我有一个应用程序,就是重复我听到的数字,然后记录我读到的数字。数字是C# 螺纹不';我不能正常工作,c#,multithreading,C#,Multithreading,我有一个应用程序,就是重复我听到的数字,然后记录我读到的数字。数字是0,1,2,3,4,5,6,7,8,9。我使用for循环来播放这些数字,并使用文本到语音的技巧,这是来自第三方的 对于录制部分,我必须根据第三方的要求将其放在单独的线程中。要录制语音,方法可能是: recordVoiceResource.Record(fileName); 要停止此操作,请使用: recordVoiceResource.Stop(); 现在我发现有时候我的录音是0秒,这意味着代码可能没有到达Record行
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);
}
您的问题很可能是由于
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;
根据您的评论,属性
MaximumSilence
获取或设置在下一个语音功能终止前允许的最大静音(以秒为单位)。您将其设置为1秒,开始录制,然后在开始播放提示用户说些什么之前睡眠两秒。你看到这里的问题了吗?假设麦克风在这段时间内没有拾取一些无关的语音,录音将在播放开始之前停止
由于数字播放之间有2秒的间隔,您可能需要将最大静音设置为几秒
当然,也就是说,假设您的意图是捕获说所有数字的用户的单个记录(这就是您的代码编写方式)。如果要单独捕获语音数字,则可能需要在播放每个数字时安排并同步单独的录音。您可能需要仔细检查API,以确保您的解决方案符合预期。为什么要线程。睡眠???…像魔鬼一样避免它我必须在每个数字之间等待2秒,这样我才能清楚地听到。播放“0 1 2 3 4 5 6 7 8 9”在每个号码之间留出2秒钟让来电者重复。你的ManualResetEvent在等待什么?那么问题是什么?我的问题是它没有像我说的那样录制声音。-@apomene,你的代码不起作用。请仔细检查terminate的用法,我对此表示怀疑。-@apomene,我感谢您的回答,但您的代码仍然不起作用。运行代码后,它转到最后一个块,然后跳转到线程。我刚刚找到了问题的解决方案,根据我的原始代码设置MaximumSilence=0,然后就可以了。但不知道为什么?需要更多的研究。-@Mike,我删除了第一个线程。Sleep(2000),这是在开始播放之前。我还设置了MaximumSilence=0,这样就行了。根据你的回答,是的。如果MaximumSilence=4,这比2大,那么它可以工作。谢谢我还需要使用ManualResetEvent吗?@Love您可能需要使用ManualResetEvent
等待录制线程完成(在这种情况下,您需要将其设置在RecordNumber
的末尾)。但是t.Join()
也应该工作(等待线程完成)。