语音情感计算经常会用到openSMILE进行语音特征的提取,openSMILE作为一款已经被很多研究者使用的提取情感特征的工具箱,却没有一个完整的中文版手册,也是为了自己查阅方便吧,慢慢翻译一下,算是记录自己的工作,如能给有需要的同行觉得有点用处当然好,即便不能方便什么人,也算是自己的一点积累吧。水平有限,难免错漏,请不吝赐教。先放上来,边写边修正和排版吧。
现在,您已经成功下载并安装了二进制版本的openSMILE或者自己编译了源代码,你已经准备好测试程序并提取你的第一个特征。要检查您是否可以运行SMILExtract,请输入:
SMILExtract -h
如果你看到openSMILE的使用信息和版本号,那么一切都设置正确。你会在输出结尾看到一些以(MSG)开头的行,你可以放心地忽略。要检查您的SMILExtract二进制文件是否支持实时录音和播放,键入:
SMILExtract -H cPortaudio
如果你看到cPortaudio组件的各种配置选项,那么你的二进制文件支持实时音频I/O。如果你只看到三行消息,那么你没有实时音频支持。要检查您的SMILExtract二进制文件是否通过OpenCV支持视频功能,请键入:
SMILExtract -H cOpenCV
如果你看到 cOpenCV组件的各种配置选项,那么你的二进制文件支持实时视频I/O。
请注意:在Unix上,如果SMILExtract不在系统搜索路径而是在当前的目录,您可能必须加上一个“./”作为前缀。
现在我们将开始使用SMILExtract从wave中提取非常简单的音频特征文件。您可以使用自己的wave文件,或者使用wav-samples目录中提供的文件。
为了快速入门,我们将使用openSMILE提供的示例配置文件。在openSMILE包的顶层目录中键入以下命令(如果在不同的目录中启动openSMILE,则必须调整配置文件和
wave文件路径):
SMILExtract -C config/demo/demo1_energy.conf -I wav_samples/speech01.wav -O speech01.energy.csv
如果只获取(MSG)和(WARN)类型的消息,并且您在里面看到Processing finished!出现在最后一个输出行,那么openSMILE成功运行。如果失败了,你会得到一个(ERROR)
信息。
Windows用户注意:由于错误的异常处理,如果有异常,在DLL中引发一个错误,并捕获到主要的可执行文件,Windows将出现程序崩溃对话。在大多数情况下,openSMILE将显示错误信息,所以可以关闭对话。然而在某些情况下,Windows会在程序显示错误信息之前杀死程序。如果是这样的话,请使用Linux,或联系作者,并提供一些有关您的问题的细节。
现在,如果openSMILE成功运行,请在文本编辑器中打开文件speech01.energy.csv以查看结果。您也可以使用gnuplot以图形方式绘制结果。这在2.8节中讨论。
接下来,我们将从上面的简单例子自己生成配置文件,学习如何编写openSMILE配置文件。 openSMILE可以生成简单场景的配置文件模板。我们将使用这个函数来生成我们的第一个配置文件,这将能够读取wave文件,计算帧能量,并保存输出到一个CSV文件。首先,创建一个目录myconfig,它将保存你的配置文件。现在键入以下内容(不包括换行符)以生成第一个配置文件:
inst/bin/SMILExtract -cfgFileTemplate -configDflt cWaveSource,cFramer,cEnergy,cCsvSink -l 1
-cfgFileTemplate选项指示openSMILE生成配置文件模板,而-configDflt选项用于指定逗号分隔的组件列表,列表是生成的配置的一部分。 -l 1选项将日志级别设置为1,抑制任何消息,不会出现在配置文件中(你仍然会得到错误日志级别的消息,例如消息通知您已经指定的组件不存在等)。模板文本被打印到标准错误输出端,因此我们使用2>将其转储到
文件myconfig/demo1.conf。如果您想添加描述个别选项的注释在生成的配置文件中,将选项-cfgFileDescriptions添加到上面命令行。
新生成的文件由两个逻辑部分组成。第一部分看起来像这样(请请注意,例子中的注释是由或者//开始,且必须出现在所在行的首列):
;= component manager configuration (= list of enabled components!) =
[componentInstances:cComponentManager]
// this line configures the default data memory:
instance[dataMemory].type = cDataMemory
instance[waveSource].type = cWaveSource
instance[framer].type = cFramer
instance[energy].type = cEnergy
instance[csvSink].type = cCsvSink
// Here you can control the amount of detail displayed for the
// data memory level configuration. 0 is no information at all,
// 5 is maximum detail.
printLevelStats = 1
// You can set the number of parallel threads (experimental):
nThreads = 1
它包含组件管理器的配置,它决定了哪些组件在您调用SMILExtract时被实例化。总是必须有一个cDataMemory组件,再是其他组件。 []中给出指定组件的实例名称,在一个配置中必须是唯一的。
下一部分包含组件配置部分,每部分以块标题开始:
[waveSource:cWaveSource]
...
[framer:cFramer]
...
[energy:cEnergy]
...
[csvSink:cCsvSink]
...
节标题遵循以下格式:[instanceName:componentType]。模板中会把组件配置设置到默认值。目前这个功能仍然是实验性的,因为有些值可能会覆盖其他的值,或者显式指定的时候具有不同的含义。因此,你应该仔细检查所有的可用选项,并只列出您需要的配置文件中的选项。即使在有些情况下可能会将一些默认值(如谱带数量等)包含在配置文件中的良好做法。这将确保兼容性与未来的版本,以防万一缺省 - 无论出于何种原因 - 可能会改变。而且,它会的增加配置文件的可读性,因为所有参数都可以在一个文件中中查看,而无需本手册中查找默认值。
接下来,您必须配置组件连接。这可以通过分配dataReader和dataWriter组件并设置名为数据存储器“levels”实现,它们总是包含在每个源,汇或处理组件中,可修改reader.dmLevel和writer.dmLevel行。您可以在这里为writer level选择任意名称,因为dataWriters会在数据存储区注册并创建您为writer.dmLevel的level。然后通过赋值reader.dmLevel的读取level来连接组件。
因此,下列规则适用:对于一个level,只有一个writer可以存在,即只有一个组件可以写入一个level;然而,读取的组件数量没有限制,一个组件可以从多个level读取,如果您指定多个level名称用“;”隔开,比如reader.dmLevel = energy;loudness 从energy和loudness level中读取数据。数据将以列的形式串联。
对于我们的示例配置,我们希望cFramer组件从输入PCM中读取由cWaveSource组件提供的流,每10毫秒创建一个25毫秒的帧,把这些帧写入到一个新的level,我们称之为“energy”),因此我们需按照下面改变内容:
[waveSource:cWaveSource]
writer.dmLevel =“XXXX”
至
[waveSource:cWaveSource]
writer.dmLevel = wave
及framer部分
[framer:cFramer]
reader.dmLevel =“XXXX”
writer.dmLevel =“XXXX”
...
(注意,我们删除了一些多余的frameSize *选项,并将frameStep更改为0.010):
[framer:cFramer]
reader.dmLevel = wave
writer.dmLevel = waveframes
copyInputName = 1
frameMode = fixed
frameSize = 0.025000
frameStep = 0.010000
frameCenterSpecial = left
noPostEOIprocessing = 1
接下来,cEnergy组件将读取音频帧并计算信号对数能量,cCsvSink会把他们写进一个CSV格式的文件。因此我们把相应的行改为:
[energy:cEnergy]
reader.dmLevel = waveframes
writer.dmLevel = energy
...
rms = 0
log = 1
...
[csvSink:cCsvSink]
reader.dmLevel = energy
filename = myenergy.csv
...
现在我们就可以用SMILExtract 来使用我们的配置文件
SMILExtract -C myconfig/demo1.conf
这将打开当前目录下文件”input.wav”(确保已经把可用文件放在当前目录下并重命名),进行特征抽取,然后保存结果到”myenergy.csv”。结果应该和例子配置文件中的一样。
如果你想在命令行中再提供输入和输出文件名,你必须在配置文件中添加用户定义的command-line option。为此,需要改变wave source和csv sink中的filename行:
[waveSource:cWaveSource]
...
filename = \cm[inputfile(I):file name of the input wave file]
...
[csvSink:cCsvSink]
...
filename = \cm[outputfile(O):file name of the output CSV file]
...
现在可以这样执行:
SMILExtract -C myconfig/demo1.conf -I wav\_samples/speech01.wav -O
speech01.energy.csv
现在总结本小节。我们希望你已经明白openSMILE的基本使用和配置方法,以及准备好了接触2.5节中更加复杂的例子,此外,还有一些国际科研比赛的标准基线特征集。本节同样解析了几个标准特征集文件中同样包含的用于控制数据输入输出的命令行选项。
要挖掘openSIMLE配置文件的全部性能,请参考4.2节。它对格式进行了细述,而4.3节则进一步对所有组件函数以及配置选项的细节进行说明。如果你对openSMILE的内在运作感兴趣,除了通过配置文件实例化和连接组件外,还有更多的术语的使用情感2.4节中程序结构的细节。
to be continue