特徴融合のopenSMILEオーディオ特徴抽出とファイル生成の処理


以下の内容があなたに役に立つなら、いいねをクリックしてボハに注目してください.
OpenSMILEのダウンロード
OpenSMILEの主なバージョンには、Windows(32ビット)とLinux(64ビット)、AndroidのバイナリファイルARM(2.1以降、android-10)が含まれています.
Windowsの友達にとって、linuxシステムをもう一つインストールしなければなりません(Windows XPでない限り).
ここでは仮想マシンにlinuxシステムをインストールすることをお勧めします.では、具体的にどのようにインストールするかは、他の場所では多くのリソースが参考になるはずですが、これは多くの説明にすぎません.
linuxシステムがインストールされている場合は、先に行きます.http://opensmile.audeering.com/Openmileをダウンロードします.
Linuxシステムは、静的リンクを含む主な実行可能ファイルSMILExtractを発行します.サンプルプロファイルはconfig/フォルダ、ビジュアル化スクリプト、およびモデリングタスクなどのscrrpts/フォルダ、その他のリソースはsrc/フォルダです.
ダウンロードが終わったら、もう一人のブロガーのブログを参考にして、翻訳がとても上手です.https://blog.csdn.net/lccever/article/details/78649538
もしこの過程で何か問題があったら、下でコメントしたり、私信したりして、できるだけ早く返事します.
抽出プロセス
ここではopensmileが持参したプロファイルについて説明します.
emobase2010.conf感情特徴:1582次元特徴ベクトルemobase_live4_batch_single.confフィールド感情認識:988次元特徴ベクトルIS 09_emotion.conf感情的挑戦:384次元特徴ベクトルemo_large.conf:大集合6552次元ベクトルIS 12_speaker_trait.デジタル互換性conf音声韻律の特徴の音調と響度
(異なるバージョンのopensmileフィーチャーの数は少し違います)
したがって、以下のコマンドのconfファイル名を自分のニーズに合わせて交換すればよいので、オーディオファイルは無損のwav形式でなければならないことに注意してください.
SMILExtract -C config/IS09_emotion.conf -I wav_samples/opensmile.wav -O speech01.energy.csv

それは正式に特徴を抽出する前に、私たちが抽出する必要があるオーディオを複数の短いオーディオに切断する必要があります(もし後で特徴が融合する需要があれば)、短いオーディオの時間と長さは具体的に自分の需要によって変更することができます.私はここで複数の100 ms(0.1 s)の短いオーディオに切断しました.△多くの場合、実は文でカットされていることが多い!
具体的なコードは以下の通りです.
import os
import wave
from pydub import AudioSegment
import contextlib


def get_wav_time(wav_path):
    '''
            

    :param wav_path:     
    :return:      (   )
    '''
    with contextlib.closing(wave.open(wav_path, 'r')) as f:
        frames = f.getnframes()
    rate = f.getframerate()
    duration = frames / float(rate)
    return duration


def get_ms_part_wav(main_wav_path, start_time, end_time, part_wav_path):
    '''
        ,              

    :param main_wav_path:        
    :param start_time:         
    :param end_time:         
    :param part_wav_path:          
    :return:
    '''
    start_time = int(start_time)
    end_time = int(end_time)

    sound = AudioSegment.from_mp3(main_wav_path)
    word = sound[start_time:end_time]

    word.export(part_wav_path, format="wav")


if __name__ == '__main__':

    path = r'E:/123/'  #      
    path_segment = r'E:/234/'  #         

    print('      !')
    time_segment = 100  #          
    for root, dir, files in os.walk(path):
        for i in range(len(files)):
            audio = root + files[i]
            time_all = int(get_wav_time(audio) * 1000)  #      
            start_time = 0  #   0ms    
            index = 1  #        ,   1    
            while start_time <= time_all - time_segment:
                # print(str(i)+ ': ' + str(index))
                end_time = start_time + time_segment
                aduio_segment = path_segment + files[i][:-4] + '_' + str(index) + '.wav'
                get_ms_part_wav(audio, start_time, end_time, aduio_segment)
                start_time += time_segment
                index += 1
            #                 time_segment        
            aduio_segment = path_segment + files[i][:-4] + '_' + str(index) + '.wav'
            get_ms_part_wav(audio, start_time, time_all, aduio_segment)

    print('      !')

注釈は超詳しくははは!
オーディオをカットした後、次にカットした複数の短いオーディオを処理します.
考えてみてください.一つずつ抽出すれば、元のオーディオが30 sであれば、切断後のオーディオは300個あります.ましてや、私たちは多くのオーディオを処理する必要があります.
だからこの時は私たちがバッチを処理する必要があります!(実はosというみんながよく知っているモジュールを使っただけなのですがハハ)
あまり話さないで、コードをつけます.
"""

        ,            opensmile     。
     os.system('cd path')  #    path   opensmile    

"""

import os

path = './audio27_segment/'  #         
count = 0
for root,dir,files in os.walk(path):
    for i in range(len(files)):
        print(files[i])
        print(count)
        # path_remake(files[i])
        try:
            os.system('SMILExtract -C config/IS09_emotion.conf -I ' + 'audio27_segment/' + files[i] + ' -O ' + 'audio27_segment_fea/' + files[i][:-4] + '.csv')
        except:
            count += 1
print(count)  #     ,           。

ファイル生成処理
以上の操作を実行すると、基本的にあなたの仕事を完成します.
最後のステップは、本当に必要なオーディオの特徴をcsvファイルから取り出すことです.
まず、この生成されたcsvファイルについて説明します.ここでは、プロファイルIS 09_emotion.confを例に挙げます.
生成されたcsvファイルでは、4~387行目の特徴名、392行目の386要素、1つ目の要素は「unknow」である.最後の要素は?中間384要素は上の384特徴に対応する.
では、私たちが必要とする384の特徴をどのように抽出しますか.
コードは次のとおりです.
import os
import re
frome natsort import natsorted

#         
path2 = r'E:/audio27_segment_fea/'  #           
arr = [[] for i in range(45)]  # 45      ,                !
index_num2 = []
for root, dir, files in os.walk(path2):
    num = len(files)
    files = natsorted(files) 
    for i in range(len(files)):
        with open(root + files[i], 'r') as f:
            content = f.readlines()
            fea = content[-1]
            fea1 = re.findall(r'\d+\.?\d*e?[-+]?\d+', fea)
            fea1 = list(map(float, fea1))
            index = int(re.findall(r'^(.*?)_', files[i])[0])
            if index not in index_num2:
                index_num2.append(index)
            arr[index].append(fea1)

f_A1 = []
for i in arr:
    if i != []:
        f_A1.append(i)

#           (    0)(                   )
for index1, value1 in enumerate(f_A1):
    for index2, value2 in enumerate(value1):
        if len(value2) != 384:
            print('holly shit!')
            print(index1,end=': ')
            print(index2,end=' ')
            print(len(value2))
            value1.pop(index2)
            break

#    f_A1        


ここであげたコードは詳しいですね.
終わりの言葉
ブロガーの能力が限られているため、ブロガーが言及した情報にも漏れがあるのは避けられない.漏れを発見した友达が熱心にその中の間違いを指摘して、次回の修正時にもっと完璧で厳格な姿でみんなの前に現れることを望んでいます.また、より良い方法があれば教えてください.
もし何か問題があれば、コメントに注目して自分の問題を残して、私はできるだけタイムリーに送信します!
そしてもしこれらの内容があなたに役に立つなら、いいねやコメントを教えていただけませんか(これでブログを更新するスピードがますます速くなります!!)