如何在 OpenSMILE 中创建自定义配置文件
How to create custom config files in OpenSMILE
我正在尝试使用 OpenSMILE 从音频样本中提取一些特征,但我意识到设置配置文件有多么困难。
文档不是很有帮助。我能做的最好的事情是 运行 提供的一些示例配置文件,看看结果如何,然后进入配置文件并尝试确定指定功能的位置。这是我所做的:
我使用了 The INTERSPEECH 2010 Paralinguistic Challenge (IS10_paraling.conf) 中使用的默认功能集。
我 运行 它是一个示例音频文件。
我看了看结果。然后我深入阅读配置文件,试图找出指定功能的位置。
这里有一个小降价 table 显示了我的探索结果:
| 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 视频,没有 Whosebug 问题,也没有博客文章讨论如何做到这一点。这真的很令人惊讶,因为这显然是使用 OpenSMILE 的很大一部分。
如果有人找到这个,请告诉我如何创建 OpenSMILE 的自定义配置文件?谢谢!
感谢您对 openSMILE 的兴趣以及构建您自己的配置文件的渴望。
科学界的大多数用户实际上将 openSMILE 用于其基线功能集的预定义配置文件,在 2.3 版中使用起来更加灵活(更多命令行选项可输出到不同的文件格式等) .
我承认提供的文档不尽如人意。然而,openSMILE 是一个非常复杂的软件,具有很多功能,目前只有最重要的部分有很好的文档记录。
最好的起点是阅读 http://opensmile.audeering.com/ 中引用的 openSMILE 书和 SIG'MM 教程。它包含有关如何编写配置文件的部分。下一个重要元素是二进制文件的联机帮助:
- SMILExtract -L 列出可用的组件
- SMILExtract -H cComponentName 列出给定组件支持的所有选项(以及它可以提取的功能),并对每个选项进行简短描述
- SMILExtract -configDflt cComponentName 为您提供组件的模板配置部分,其中列出了所有选项并设置了默认值
由于 openSMILE 的架构以增量处理所有音频功能为中心,因此(至少目前还没有)没有简单的语法来定义您想要的功能。相反,您通过添加组件来定义处理链:
- 数据源将读入数据(例如,从音频文件、csv 文件或麦克风),
- 数据处理器将在各个步骤中进行信号处理和特征提取(windowing、window 函数、FFT、幅度、梅尔谱、倒谱系数 (MFCC),例如用于提取MFCC);每一步都有一个数据处理器。
- 数据接收器将数据写入输出文件或将结果发送到服务器等
您通过 "reader.dmLevel" 和 "writer.dmLevel" 选项连接组件。这些定义了组件用于交换数据的数据存储级别的名称。只有一个组件可以写入一个级别,即 writer.dmLevel=levelName 定义级别并且只能出现一次。通过设置 reader.dmLevel=levelName.
可以从该级别读取多个组件
然后在每个组件中设置选项以启用特征计算并为此设置参数。回答有关 lspFreq 的问题:这可能在 cLsp 组件中默认启用,因此您看不到它的明确选项。对于 openSMILE 的未来版本,将而且应该更严格地遵循明确设置所有选项的做法。
输出中的特征名称将由组件自动定义。通常每个组件都会添加名称的一部分,因此您可以从名称中推断出完整的处理链。选项 nameAppend 和 copyInputName(适用于大多数数据处理器)控制此行为,尽管某些组件可能会在内部覆盖它们或稍微改变行为。
查看每个数据存储级别的名称(和其他信息),包括例如在配置中产生的功能组件,您可以在 componentInstances:cComponentManager.
部分设置选项 "printLevelStats=5"
由于openSMILE中的所有内容都是为实时增量处理而构建的,因此每个数据内存级别都有一个缓冲区,默认情况下是一个环形缓冲区,以便在应用程序运行较长时间时保持内存占用不变。
有时您可能想要总结给定长度的 window 的特征(例如使用 cFunctionals 组件)。在这种情况下,您必须确保此组件的输入级别的缓冲区大小足以容纳完整的 window。您可以通过以下选项执行此操作:
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*(在 input/file 末尾产生的一个向量),**list(指定帧列表),var(接收消息,例如来自 cTurnDetector 组件的动态定义帧的消息)或 fix(固定长度 window)。只有在 fix 的情况下,选项 frameSize 设置此 window 的大小,而 frameStep [=104] 的速率=] 向前移动。在 fix 的情况下,输入级别的缓冲区大小会自动正确设置,在其他情况下,您必须手动设置它。
希望这对您入门有所帮助!对于每个新的 openSMILE 版本,我们在 audEERING 都试图更好地记录事物并通过各种组件统一事物。
我们也欢迎来自社区的贡献(例如,有人愿意编写一个图形配置文件编辑器,您可以在其中 drag/drop 组件并以图形方式连接它们吗?;))- 尽管我们知道更多的文档会使这更容易.在那之前,您总是需要阅读源代码 ;)
干杯,
弗洛里安
我正在尝试使用 OpenSMILE 从音频样本中提取一些特征,但我意识到设置配置文件有多么困难。
文档不是很有帮助。我能做的最好的事情是 运行 提供的一些示例配置文件,看看结果如何,然后进入配置文件并尝试确定指定功能的位置。这是我所做的:
我使用了 The INTERSPEECH 2010 Paralinguistic Challenge (IS10_paraling.conf) 中使用的默认功能集。
我 运行 它是一个示例音频文件。
我看了看结果。然后我深入阅读配置文件,试图找出指定功能的位置。
这里有一个小降价 table 显示了我的探索结果:
| 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 视频,没有 Whosebug 问题,也没有博客文章讨论如何做到这一点。这真的很令人惊讶,因为这显然是使用 OpenSMILE 的很大一部分。
如果有人找到这个,请告诉我如何创建 OpenSMILE 的自定义配置文件?谢谢!
感谢您对 openSMILE 的兴趣以及构建您自己的配置文件的渴望。
科学界的大多数用户实际上将 openSMILE 用于其基线功能集的预定义配置文件,在 2.3 版中使用起来更加灵活(更多命令行选项可输出到不同的文件格式等) .
我承认提供的文档不尽如人意。然而,openSMILE 是一个非常复杂的软件,具有很多功能,目前只有最重要的部分有很好的文档记录。
最好的起点是阅读 http://opensmile.audeering.com/ 中引用的 openSMILE 书和 SIG'MM 教程。它包含有关如何编写配置文件的部分。下一个重要元素是二进制文件的联机帮助:
- SMILExtract -L 列出可用的组件
- SMILExtract -H cComponentName 列出给定组件支持的所有选项(以及它可以提取的功能),并对每个选项进行简短描述
- SMILExtract -configDflt cComponentName 为您提供组件的模板配置部分,其中列出了所有选项并设置了默认值
由于 openSMILE 的架构以增量处理所有音频功能为中心,因此(至少目前还没有)没有简单的语法来定义您想要的功能。相反,您通过添加组件来定义处理链:
- 数据源将读入数据(例如,从音频文件、csv 文件或麦克风),
- 数据处理器将在各个步骤中进行信号处理和特征提取(windowing、window 函数、FFT、幅度、梅尔谱、倒谱系数 (MFCC),例如用于提取MFCC);每一步都有一个数据处理器。
- 数据接收器将数据写入输出文件或将结果发送到服务器等
您通过 "reader.dmLevel" 和 "writer.dmLevel" 选项连接组件。这些定义了组件用于交换数据的数据存储级别的名称。只有一个组件可以写入一个级别,即 writer.dmLevel=levelName 定义级别并且只能出现一次。通过设置 reader.dmLevel=levelName.
可以从该级别读取多个组件然后在每个组件中设置选项以启用特征计算并为此设置参数。回答有关 lspFreq 的问题:这可能在 cLsp 组件中默认启用,因此您看不到它的明确选项。对于 openSMILE 的未来版本,将而且应该更严格地遵循明确设置所有选项的做法。
输出中的特征名称将由组件自动定义。通常每个组件都会添加名称的一部分,因此您可以从名称中推断出完整的处理链。选项 nameAppend 和 copyInputName(适用于大多数数据处理器)控制此行为,尽管某些组件可能会在内部覆盖它们或稍微改变行为。
查看每个数据存储级别的名称(和其他信息),包括例如在配置中产生的功能组件,您可以在 componentInstances:cComponentManager.
部分设置选项 "printLevelStats=5"由于openSMILE中的所有内容都是为实时增量处理而构建的,因此每个数据内存级别都有一个缓冲区,默认情况下是一个环形缓冲区,以便在应用程序运行较长时间时保持内存占用不变。 有时您可能想要总结给定长度的 window 的特征(例如使用 cFunctionals 组件)。在这种情况下,您必须确保此组件的输入级别的缓冲区大小足以容纳完整的 window。您可以通过以下选项执行此操作:
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*(在 input/file 末尾产生的一个向量),**list(指定帧列表),var(接收消息,例如来自 cTurnDetector 组件的动态定义帧的消息)或 fix(固定长度 window)。只有在 fix 的情况下,选项 frameSize 设置此 window 的大小,而 frameStep [=104] 的速率=] 向前移动。在 fix 的情况下,输入级别的缓冲区大小会自动正确设置,在其他情况下,您必须手动设置它。
希望这对您入门有所帮助!对于每个新的 openSMILE 版本,我们在 audEERING 都试图更好地记录事物并通过各种组件统一事物。
我们也欢迎来自社区的贡献(例如,有人愿意编写一个图形配置文件编辑器,您可以在其中 drag/drop 组件并以图形方式连接它们吗?;))- 尽管我们知道更多的文档会使这更容易.在那之前,您总是需要阅读源代码 ;)
干杯, 弗洛里安