我有一个应用程序,重复我听到的数字,然后记录我读到的数字。数字为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);
}
答案 0 :(得分:2)
根据您的评论,属性MaximumSilence
获取或设置在下一个语音功能终止之前允许的最大静音(以秒为单位)。您将其设置为一秒钟,开始录制,然后在开始播放之前休眠两秒钟,提示用户说出某些内容。你看到这个问题吗?假设麦克风在此期间没有收到一些不相关的语音,录音将在播放开始前停止。
由于数字播放之间存在2秒的差距,您可能需要将MaximumSilence
设置为几秒钟。
当然,这是假设您的意图是捕获用户说出所有数字的单个记录(这是您的代码的编写方式)。如果您想单独捕获口述号码,则可能需要在播放每个号码时安排和同步单独的录音。您可能需要仔细检查API以确保您的解决方案符合您的预期。
答案 1 :(得分:0)
由于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;