利用opensmile批量提取音频特征及opensmile生成文件处理指南

1.opensmile2.3.0下载

2.调用命令行运行opensmile

    opensmile运行基本参数-C(后面加config文件) -I(后面加输入的音频文件) -O(后面加输出的路径),例如:

SMILExtract_Release -C D:/Program/opensmile/opensmile-2.3.0/opensmile-2.3.0/config/IS09_emotion.conf -I C:/Users/dell/Desktop/audio/in/1.wav -O C:/Users/dell/Desktop/audio/out/1.txt

    其中config文件控制opensmile提取的特征的种类和个数。

    直接在dos界面下打开SMILExtract_Release.exe所在文件目录,输入上面的命令就可以得到对应音频的特征。特征可以保存在txt文件或其他格式的文件中,这里以txt格式的文件为例,后面会对该生成文件进行详细说明。

3.用python批量调用命令行

    如果有很多个音频需要去提取特征,那么一个个用dos界面敲命令会非常麻烦。用python批量调用命令行源代码如下:

import os
audio_path='C:/Users/dell/Desktop/audio/in'
output_path='C:/Users/dell/Desktop/audio/out'
audio_list=os.listdir(audio_path)
for audio in audio_list:
    if audio[-4:]=='.wav':
        this_path_input=os.path.join(audio_path,audio)
        this_path_output=os.path.join(output_path,audio[:-4]+'.txt')
        cmd='cd /d D:/Program/opensmile/opensmile-2.3.0/opensmile-2.3.0/bin/Win32 && SMILExtract_Release -C D:/Program/opensmile/opensmile-2.3.0/opensmile-2.3.0/config/IS09_emotion.conf -I '+this_path_input+' -O '+this_path_output
    os.system(cmd)

    这样就在C:\Users\dell\Desktop\audio\out目录下生成了所有音频的包含特征的txt文件。

4.opensmile生成文件(txt文件)处理

    opensmile生成文件个人认为不太友好,需要进行特殊处理之后才能被我们使用。opensmile生成的txt文件格式如下:

利用opensmile批量提取音频特征及opensmile生成文件处理指南_第1张图片

利用opensmile批量提取音频特征及opensmile生成文件处理指南_第2张图片

    第4~387行为特征名称,第392行一共386个元素,第一个元素为‘unknow’;最后一个元素为?;中间384个元素对应上面384个特征。如果要将1个音频的384个特征放到一个list中,那么源代码为:

f=open('C:/Users/dell/Desktop/audio/out/1.txt')
###去最后一行
last_line=f.readlines()[-1]
f.close()
features=last_line.split(',')
###去掉第一个和最后一个元素
features=features[1:-1]

    如果想要将多个音频的特征同时存储以便之后进行处理和运算,那么首先面临着一个问题,那就是文件的读取顺序,如果音频文件的命名一团糟,那么在进行文件读取时也是乱的。所以要进行比较规范的文件命名,举个例子,我的音频列表以1~50的正整数为音频命名,对应的音频名称也是1~50。那么存储到numpy.array时第十三行就是命名为13的音频的特征。

import os
import numpy as np
txt_path='C:/Users/dell/Desktop/audio/out'
txt_list=os.listdir(txt_path)
features_list=[]
for txt in txt_list:
    if txt[-4:]=='.txt':
        this_path=os.path.join(txt_path,txt)
        f=open(this_path)
        last_line=f.readlines()[-1]
        f.close()
        features=last_line.split(',')
        features=features[1:-1]
        features_list.append(features)
features_array=np.array(features_list)
np.save('C:/Users/dell/Desktop/opensmile_features.npy',features_array)

5.调用opensmile(进阶)

    以上就是利用opensmile进行特征提取,并对生成文本进行处理的全过程。

    (1)有能力的同学可以尝试将以上代码合为一个脚本,方便操作。

    (2)如果音频量特别大时,批量调用命令行的效率也显得比较低,有能力的同学可以试着通过多线程的方式调用opensmile。

  

你可能感兴趣的:(项目经验)