线程不能正常工作

本文关键字:工作 常工作 不能 线程 | 更新日期: 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;