2017-06-02 107 views
0

我正在嘗試製作一些語音檢測代碼。我正試圖以零交叉率來做到這一點。我做了一些研究,發現當某人說話時,零交叉率應該是一箇中等的價值,不要太高也不能太低,但是當我對着麥克風講話時,零交叉率變得比只有背景更高噪音(幾乎沒有),這是我現在正在計算的。如何使用PyAudio流數據計算零交叉率

((audioData[:-1] * audioData[1:]) < 0).sum() 

audioData是numpy的表,它的內容是pyAudioStream.read的結果()誰能告訴我正確的方法來計算呢?謝謝

回答

1

這是很多不必要的乘法。通過np.diff使用布爾比較並運行它可能會更快:

zero_crosses = np.nonzero(np.diff(audioData > 0)))[0] 

這是什麼做的:

  1. 創建的,其中的信號是大於0(audioData > 0
  2. 做了布爾數組(np.diff),所以過零的位置變爲1(上升)和-1(下降)
  3. 選取非零值所在數組的索引(np.nonzero)。

然後,如果你想要過關的數量,你可以只需要zero_crosses.size

作爲獎勵你有所有的十字架的時間,所以你可以做一些事情,如直方圖,顯示你的時間歷史中發生更多的十字架。