2013-01-17 76 views
1

我有一個音頻文件序列(它們目前都是wav和mp3)。這些文件包括嘟嘟聲,暫停和一個人的回覆。我需要找到嘟嘟聲和回覆人之間的反應時間。有很多數據,所以我想製作一個可以爲我做這個的程序。有沒有人有任何想法這可以做什麼語言,或知道任何現有的程序,將這樣做。我已經研究了python中的wave工具,似乎無法找到任何代表低時刻的數據。音頻分析檢測低音量週期

我程序,以充當這樣的:

wav = open(wave file) 
chunk = getNextChunk(wav) 
volume = analyse(chunk) 
check against threshold 
if silent period, check for loud period 
find difference 
log time in seconds 

誰能幫我這個,我知道它的一個非常開放式的問題,但我不知道從哪裏開始有了這個,我在已設定java和python等,但會使用最好的,與聲音格式相同的。將文件製成單聲道還會更好嗎?

感謝您的幫助!

回答

0

至於你對語言的選擇,我會親自選擇Matlab。然而,它會花錢,而且你已經有了python的經驗,numpy模塊可能對你來說是正確的。

基於你對你的問題的描述,這可能是一種方法:

  • 負載WAV
  • 查找信封和快速的時間常數
  • 閾值
  • 找點時間,蜂鳴
  • 順利
  • 回覆時間
  • 計算差值

去單聲道會很好,同時減少你的數據量。

0

我發現了一個可行的解決方案,雖然我的音頻檢測算法非常糟糕,而且不太準確。聲音的幅度或頻率似乎是可見的,所以數字越多,數字越大。我檢測長序列的數字來確定這一點,但一個數字不適合模式和週期重置。根據以前的數字之間的差異,將會更好。

import wave, struct, logging 

# open up a wave 
w = wave.open('wavefile.WAV', 'rb') 
length = w.getnframes() 
rate = w.getframerate() 
logging.basicConfig(filename='example.log',level=logging.DEBUG) 
count = 0 
start = 1 
end = 0 
startData = 0 
endData = 0 
for i in range(0,length): 
    waveData = w.readframes(1) 
    data = struct.unpack("<h", waveData) 
    if (start == 1): 
     if (len(str(int(data[0])))>=len(str(1234))): 
      count=count+1 
     else: 
      count=0 
     if (count == 100): 
      startData=i-100 
      print("Start "+str(startData/float(rate))) 
      count = 0 
      start = 0 
      end = 1 
    if (end == 1): 
     if (len(str(int(data[0])))<=len(str(12))): 
      count=count+1 
     else: 
      count=0 
     if (count == 10): 
      endData=i-10 
      print("End "+str(endData/float(rate))) 
      count = 0 
      start = 1 
      end = 0 
      frames=endData-startData 
      duration=frames/float(rate) 
      print("Duration: "+str(duration)) 
+1

我試過你的腳本,但得到'struct.error:解包需要解壓縮行中的長度爲2的字節對象。 – jcubic