Mon*_*eck 1 audio feature-extraction
我试图使用OpenSMILE从音频样本中提取一些功能,但我意识到设置配置文件有多困难.
文档不是很有帮助.我能做的最好的事情是运行一些提供的示例配置文件,看看是什么,然后进入配置文件并尝试确定功能的指定位置.这是我做的:
我使用了INTERSPEECH 2010 Paralinguistic Challenge(IS10_paraling.conf)中使用的默认功能集.
我把它放在一个示例的audiofile上.
我看了看出来了.然后我深入阅读配置文件,试图找出指定功能的位置.
这是一个小的降价表,显示了我的探索结果:
| 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] |
Run Code Online (Sandbox Code Playgroud)
我所看到的是4个不同的功能,全部由配置文件中的不同指令生成.好吧,对于其中一个,我找不到配置文件中没有令人费解的指令.没有模式或直观的语法或明显的系统,我不知道如何最终弄清楚如何指定我想要生成的自己的功能.
没有教程,没有YouTube视频,没有StackOverflow问题,也没有关于如何做到这一点的博客文章.这真是令人惊讶,因为这显然是使用OpenSMILE的一个重要部分.
如果有人发现这个,请你告诉我如何创建OpenSMILE的自定义配置文件?谢谢!
小智 6
感谢您对openSMILE的兴趣以及您对构建自己的配置文件的渴望.
科学界的大多数用户实际上使用openSMILE作为基线功能集的预定义配置文件,在版本2.3中使用它们更灵活(更多命令行选项输出到不同的文件格式等).
我承认所提供的文件不尽如人意.但是,openSMILE是一个非常复杂的软件,具有许多功能,其中只有最重要的部分目前已有详细记录.
最好的起点是阅读http://opensmile.audeering.com/上引用的openSMILE书籍和SIG'MM教程.它包含有关如何编写配置文件的部分.下一个重要元素是二进制文件的在线帮助:
由于openSMILE的体系结构以所有音频功能的增量处理为中心,因此(至少还没有)没有简单的语法来定义您想要的功能.而是通过添加组件来定义处理链:
您可以通过"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可以是*(在输入/文件末尾生成一个向量),**list(指定帧列表),var(接收消息,例如来自cTurnDetector组件,即动定义帧),或修复(固定长度窗口).仅在修复的情况下,选项frameSize设置此窗口的大小,frameStep选择窗口向前移动的速率.在修复的情况下,输入级别的缓冲区大小自动设置正确,在其他情况下,您必须手动设置它.
我希望这可以帮助你开始!随着每个新的openSMILE版本,我们在audEERING都试图通过各种组件更好地记录事物并统一事物.
我们也欢迎社区的贡献(例如,任何愿意编写图形配置文件编辑器的人,你拖放组件并以图形方式连接它们?)) - 虽然我们知道更多文档会使这更容易.在那之前,你总是需要源代码来阅读;)
干杯,弗洛里安