Audacityを使って複数のwavファイルを一括に発話区間検出(VAD)する

AudacityのSoundFinderを複数のファイルに一括適用します。

VADをしたいファイルを複数用意します。

以下のPython3用のスクリプトを実行します。

import os
import wave

if __name__ == '__main__':
    path = '{wavファイルがあるルートディレクトリ}'
    lof_file = os.path.join(path,'wave_list.lof')
    wav_list = []
    for root, dirs, files in os.walk(path):
        for file in files:
            r, ext = os.path.splitext(file)
            if ext == '.wav':
                fill_path = os.path.join(root,file)
                with wave.open(fill_path,'r') as wf:
                    second = float(wf.getnframes()) / wf.getframerate()
                wav_list.append((fill_path,second))

    with open(lof_file,'w') as f:
        current_second = 0
        for file,second in wav_list:
            f.write("file \"%s\" offset %d\n"%(file,current_second))
            current_second = current_second + second + 60

wavファイルをおいていたディレクトリにwav_list.lofというファイルができているのでAudacityで読み込みます。

Audacityで複数トラックの音声ファイルを時間をずらして読み込めます。

SoundFinderを実行します。この操作でVADを行うことになるので適宜パラメータを調整してください。

VADを行ったラベルデータを書き出します。

以下のPython3用スクリプトを実行します。ラベルのパスとlofファイルのパスは指定してください。

import os
import copy

if __name__ == '__main__':
    path = '/home/garicchi/data/testvad'
    lof_file = os.path.join(path, 'wave_list.lof')
    label_file = '/home/garicchi/Desktop/ラベルトラック.txt'

    with open(lof_file,'r') as f:
        lines = f.readlines()

    wav_list = []
    for line in lines:
        if line.startswith('file'):
            cols = line.replace('file','').replace('offset','').replace('\n','').replace('"','').split(' ')
            file = cols[1]
            second = float(cols[3])
            wav_list.append((file,second))

    with open(label_file,'r') as f:
        lines = f.readlines()

    label_list = []
    current_track = []
    prev_label = '1'
    for line in lines:
        cols = line.replace('\n','').split('\t')

        if prev_label!='1' and cols[2] == '1':
            label_list.append(copy.deepcopy(current_track))
            current_track.clear()

        current_track.append((float(cols[0]),float(cols[1]),cols[2]))
        prev_label = cols[2]
    label_list.append(copy.deepcopy(current_track))

    for i,wav in enumerate(wav_list):
        with open(wav[0] + '.txt', 'w') as f:
            for label in label_list[i]:
                f.write('%f\t%f\t%s\n' % (label[0]-wav[1],label[1]-wav[1],label[2]))

 

複数の音声ファイルに一括で発話区間検出のラベルを作ることができました。

音声ファイル名.txtがAudacityで使えるラベルデータとなります。

あとはこれを読み込んでsoxで切り取るなりすれば発話ごとの音声ファイルになります。

ちなみにファイルパスに2バイト文字(日本語など)が入っているとAudacityの謎仕様により読み込めません

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください