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 等中编程过,但会使用最好的,与声音格式相同。将文件制作成单声道会更好吗?

谢谢你的帮助!

4

2 回答 2

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))
于 2013-01-20T17:48:08.010 回答
0

至于您选择的语言,我个人会选择 Matlab。但是它要花钱,而且由于您已经有使用 python 的经验,因此 numpy 模块可能对您来说是正确的选择。

根据您对问题的描述,这可能是一种方法:

  • 加载 wav
  • 寻找包络线并以快速时间常数平滑
  • 临界点
  • 找时间发出哔声
  • 找时间回复
  • 计算差异

去单声道会很好,同时减少你的数据量。

于 2013-01-18T00:32:52.700 回答