代码之家  ›  专栏  ›  技术社区  ›  Arctic Vowel

检测串行端口输入中的暂停

  •  0
  • Arctic Vowel  · 技术社区  · 11 年前

    在我的应用程序中,任何一部手机都可以语音连接到我的3G USB调制解调器,通话会立即接听。它通过串行端口接收PCM音频(8000个样本,16位,单声道),并使用Microsoft的语音合成器与呼叫者进行对话。

    问题是,应用程序只应在呼叫方停止通话时进行回复。我怎样才能检测到这一点?

    我尝试实现了一个3秒计时器,当从串行端口接收到数据时,它会自动复位,所以当计时器被“勾选”时,应该意味着呼叫者沉默了3秒。但它不是这样工作的。我做错了什么?

    private void DataRecdFromSerial(object sender, SerialDataReceivedEventArgs e)
    {
         say.Stop(); say.Start(); // reset timer with interval 5000
         int n = usb.BytesToRead;
         byte[] comBuffer = new byte[90000];
         usb.Read(comBuffer, 0, n);
         if(comBuffer.Length > 0)
         {  
              wfw.Write(comBuffer, 0, n); // NAudio Wave File Writer
         }
    }
    
    private void say_Tick(object sender, EventArgs e)
    {
         // Caller stopped speaking for 5 seconds (not working)
     }
    
    1 回复  |  直到 11 年前
        1
  •  2
  •   v.oddou    11 年前

    在沉默的时候,数据流究竟应该以什么魔力中断?只要连接了这条线路,你就会得到源源不断的信息,这是当今所有软件和电子工程实现中最合乎逻辑的。所以你需要分析声波的频谱,并计算振幅的均方根,以获得能量。您可以将其与通过经验测试确定的阈值进行比较(因为沉默实际上是一种需要接受的小噪声)。