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

言語の選択に関しては、私は個人的に Matlab を選択します。ただし、お金がかかります。すでに python の経験があるので、numpy モジュールが適切かもしれません。

問題の説明に基づいて、これは 1 つのアプローチである可能性があります。

  • wav を読み込む
  • エンベロープを見つけて高速な時定数で滑らかにする
  • しきい値
  • ビープ音の時間を見つける
  • 応答の時間を見つける
  • 差を計算する

モノにすると問題なく、同時にデータ量を減らすことができます。

于 2013-01-18T00:32:52.700 に答える
0

オーディオを検出するための私のアルゴリズムはかなりお粗末で、あまり正確ではありませんが、機能するソリューションを見つけました。音の振幅や周波数が目に見えるように見えるので、数字の桁数が多いほど音量が大きくなります。これを判断するために長い一連の数字を検出しましたが、1 つの数字がパターンに適合せず、サイクルがリセットされます。前の数字の違いに基づいて決定する方が良いでしょう。

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 に答える