如何在OpenSMILE

时间:2017-04-22 05:55:34

标签: audio feature-extraction

我正在尝试使用OpenSMILE从音频样本中提取一些功能,但我意识到设置配置文件有多么困难。

文档不是很有帮助。我能做的最好的事情是运行一些提供的示例配置文件,看看是什么,然后进入配置文件并尝试确定功能的指定位置。这就是我的所作所为:

我使用了INTERSPEECH 2010 Paralinguistic Challenge(IS10_paraling.conf)中使用的默认功能集。

我把它放在一个示例音频文件上。

我看着发生了什么。然后我深入阅读配置文件,试图找出指定功能的位置。

这是一张显示我探索结果的小降价表:

| Feature generated | instruction in the conf file                            |
|-------------------|---------------------------------------------------------|
| pcm_loudness      | I see: 'loudness=1'                                     |
| mfcc              | I see a section: [mfcc:cMfcc]                           |
| lspFreq           | no matches for the text 'lspFreq' anywhere              |
| F0finEnv          | I seeF0finalEnv = 1 under [pitchSmooth:cPitchSmoother]  |

我看到的是4种不同的功能,全部由配置文件中的不同指令生成。好吧,对于其中一个,我找不到配置文件中没有令人费解的指令。没有模式或直观的语法或明显的系统,我不知道如何最终弄清楚如何指定我想要生成的自己的功能。

没有教程,没有YouTube视频,没有StackOverflow问题,也没有关于如何做到这一点的博客文章。这真是令人惊讶,因为这显然是使用OpenSMILE的一个重要部分。

如果有人发现这个,请你告诉我如何创建OpenSMILE的自定义配置文件?谢谢!

1 个答案:

答案 0 :(得分:6)

感谢您对openSMILE的兴趣以及您对构建自己的配置文件的渴望。

科学界的大多数用户实际上使用openSMILE作为基线功能集的预定义配置文件,在版本2.3中使用它们更灵活(更多命令行选项输出到不同的文件格式等)。

我承认所提供的文件不尽如人意。但是,openSMILE是一个非常复杂的软件,具有很多功能,其中只有最重要的部分目前有很好的文档记录。

最好的出发点是阅读所有http://opensmile.audeering.com/引用的openSMILE书和SIG&#MM教程。它包含有关如何编写配置文件的部分。下一个重要元素是二进制文件的在线帮助:

  • SMILExtract -L 列出了可用的组件
  • SMILExtract -H cComponentName 列出了给定组件支持的所有选项(因此也提供了可以提取的功能),并为每个
  • 提供了简短描述
  • SMILExtract -configDflt cComponentName 为您提供了列出所有选项且默认设置为
  • 的组件的模板配置部分

由于openSMILE的体系结构以所有音频功能的增量处理为中心,因此(至少还没有)没有简单的语法来定义您想要的功能。相反,您可以通过添加组件来定义处理链:

  • 数据源将读取数据(例如,来自音频文件,csv文件或麦克风),
  • 数据处理器将在各个步骤(窗口,窗口函数,FFT,幅度,梅尔谱,倒谱系数(MFCC)中进行信号处理和特征提取,例如用于提取MFCC);每个步骤都有一个数据处理器。
  • 数据接收器会将数据写入输出文件或将结果发送到服务器等。

您可以通过" reader.dmLevel"连接组件。和" writer.dmLevel"选项。这些定义了组件用于交换数据的数据内存级别的名称。只有一个组件可以写入一个级别,即writer.dmLevel = levelName定义级别,并且只能出现一次。通过设置reader.dmLevel = levelName。

,可以从此级别读取多个组件

在每个组件中,您可以设置选项以启用功能计算并为此设置参数。要回答关于lspFreq的问题:这可能是cLsp组件中默认启用的,因此您没有看到明确的选项。对于openSMILE的未来版本,明确设置所有选项的做法将更加严格地遵循。

输出中的要素名称将由组件自动定义。通常每个组件都会添加一个名称的一部分,因此您可以从名称中推断出完整的处理链。选项nameAppend和copyInputName(可用于大多数数据处理器)控制此行为,尽管某些组件可能会在内部覆盖它们或稍微更改行为。

查看每个数据存储级别的名称(和其他信息),包括例如哪个功能组件在配置中产生,你可以设置选项" printLevelStats = 5"在componentInstances:cComponentManager。

部分

由于openSMILE中的每个内容都是为实时增量处理而构建的,因此每个数据内存级别都有一个缓冲区,默认情况下它是一个环形缓冲区,用于在应用程序运行较长时间时保持内存占用不变。 有时,您可能希望在给定长度的窗口上汇总要素(例如,使用cFunctionals组件)。在这种情况下,您必须确保此组件的输入级别的缓冲区大小足以容纳整个窗口。您可以通过以下选项执行此操作:

  • writer.levelconf.isRb = 1/0:将缓冲区类型设置为ringbuffer(1)或固定大小的缓冲区

  • writer.levelconf.growDyn = 1/0:如果向其写入更多数据,则将缓冲区设置为动态增长(1)

  • writer.levelconf.nT =以帧为单位设置缓冲区的大小。或者,您可以使用bufferSizeSec = x以秒为单位设置大小,并自动转换为帧。

在大多数情况下,尺寸将自动正确设置。后续级别还继承先前级别的配置。例外情况是当您设置cFunctionals组件以读取完整输入时(例如,仅在文件末尾生成一个特征),您必须在函数组件读取的级别上使用growDyn = 1,或者如果您使用变量框架模式(见下文)。

cFunctionals组件提供 frameMode,frameSize, frameStep 选项。其中frameMode可以是 full *(在输入/文件末尾生成一个向量),** list (指定帧列表), var (接收消息,例如来自cTurnDetector组件,用于定义动态框架),或修复(固定长度窗口)。仅在修复的情况下,选项frameSize设置此窗口的大小, frameStep 窗口向前移动的速率。如果修复,则会自动正确设置输入级别的缓冲区大小,在其他情况下,您必须手动设置它。

我希望这有助于您开始使用!随着每个新的openSMILE版本,我们在audEERING都试图通过各种组件更好地记录事物并将事物统一起来。

我们也欢迎社区的贡献(例如,任何愿意编写图形配置文件编辑器的人,你拖放组件并以图形方式连接它们?)) - 虽然我们知道更多的文档会使这更容易。在那之前,你总是需要源代码来阅读;)

干杯, 弗洛里安