【问题标题】:How to create custom config files in OpenSMILE如何在 OpenSMILE 中创建自定义配置文件
【发布时间】:2017-04-22 05:55:33
【问题描述】:

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

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

我使用了 INTERSPEECH 2010 副语言挑战赛 (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 的自定义配置文件?谢谢!

【问题讨论】:

    标签: audio feature-extraction audeering-opensmile


    【解决方案1】:

    感谢您对 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 : 将缓冲区类型设置为环形缓冲区 (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(固定长度窗口)。只有在 fix 选项的情况下,frameSize 设置了这个窗口的大小,而 frameStep 设置了窗口向前移动的速率。在 fix 的情况下,输入级别的缓冲区大小会自动正​​确设置,在其他情况下,您必须手动设置。

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

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

    干杯, 弗洛里安

    【讨论】:

    • 本书的特性名称中的第 4.4 节说 - “它将很快包含一个表格,将特性名称映射到相应的描述或链接到描述特性的组件参考部分”我想知道什么在这种情况下,“很快”意味着。使用此工具最重要的事情之一是了解可用的功能以及它们的作用。目前我不知道某些功能是什么意思(在示例配置中)以及我想添加到我的配置中的功能的名称是什么。
    猜你喜欢
    • 2011-02-02
    • 2015-08-03
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    • 2022-09-29
    • 1970-01-01
    • 1970-01-01
    • 2017-02-03
    相关资源
    最近更新 更多