2

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

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

我使用了来自 The 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 的自定义配置文件?谢谢!

4

1 回答 1

9

感谢您对 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(适用于大多数数据处理器)控制此行为,尽管某些组件可能在内部覆盖它们或稍微改变行为。

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

由于 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、frameSizeframeStep选项。其中 frameMode 可以是full*(在输入/文件末尾生成的一个向量)、**list(指定帧列表)、var(接收消息,例如从 cTurnDetector 组件接收消息,用于动态定义帧),或修复(固定长度窗口)。只有在fix选项 frameSize 设置这个窗口的大小的情况下,frameStep设置窗口向前移动的速率。在修复输入级别的缓冲区大小的情况下自动正确设置,在其他情况下您必须手动设置。

我希望这可以帮助您入门!对于每一个新的 openSMILE 版本,我们 audEERING 都在尝试更好地记录事物并通过各种组件统一事物。

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

干杯,弗洛里安

于 2017-04-22T08:38:40.607 回答