感谢您对 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、frameSize和frameStep选项。其中 frameMode 可以是full*(在输入/文件末尾生成的一个向量)、**list(指定帧列表)、var(接收消息,例如从 cTurnDetector 组件接收消息,用于动态定义帧),或修复(固定长度窗口)。只有在fix选项 frameSize 设置这个窗口的大小的情况下,frameStep设置窗口向前移动的速率。在修复输入级别的缓冲区大小的情况下自动正确设置,在其他情况下您必须手动设置。
我希望这可以帮助您入门!对于每一个新的 openSMILE 版本,我们 audEERING 都在尝试更好地记录事物并通过各种组件统一事物。
我们也欢迎来自社区的贡献(例如,任何愿意编写图形配置文件编辑器的人,您可以在其中拖放组件并以图形方式连接它们?;))——尽管我们知道更多的文档会使这更容易。在那之前,您总是必须阅读源代码;)
干杯,弗洛里安