音频领域特定语言与Python

0 投票
3 回答
564 浏览
提问于 2025-04-17 13:23

我想写一些代码来进行声学分析,现在在考虑用什么工具比较合适。通常我会用Python来写这类代码,配合numpy和scipy,可能还会用Cython来处理分析部分。不过我发现Python的音频库有点乱,很多包功能有限,而且开发状态各不相同。

我还遇到了一些专门用于音频/声学的语言,比如SuperCollider、Faust等,这些语言似乎能让音频处理变得简单,但在输入输出和分析能力上可能会有一些限制。

我现在在Linux系统上工作,默认安装了Alsa和PulseAudio。我希望尽量不使用其他各种音频包,比如Jack,虽然这不是绝对的要求。

我主要想知道的是,是否有一种专门的语言可以更快地进行原型设计和测试,还是像Python这样的通用语言更合适。谢谢。

3 个回答

0

我不太确定你想要做什么,但我可以给你一个额外的建议:可以试试用Common Lisp来编写脚本。如果你正在做的事情涉及很多频谱分析,那么你可以在Spear里完成大部分的工作,然后用Common Lisp和Common Music来编写相关的脚本。Spear在编辑一些特定的音频成分方面有很棒的工具。

2

SuperCollider有很多支持这类功能的工具,可以作为外部插件或者Quarks使用。不过,具体要看你想做什么。如果你只是想检测事件,Onsets.kr就可以了。如果你想获取频率或音高的信息,Pitch或者Tartini都可以用(我觉得Tartini更准确)。如果你想追踪音量,可以用Amplitude.ar加上一些简单的数学运算。

类似的,还有SpecCentroid.kr(用于一种亮度分析)、Loudness.krSpecFlatness.kr等等。

这些都是比较通用的,还有很多其他的工具(JoshUGens这个外部插件包里有一些有趣的与FFT相关的声学工具)。所以我建议你下载这个程序,加入邮件列表(如果你有更多问题),邮件列表可以在这里找到,顺便看看Externals、Quarks和Standard UGens。

不过,由于我不太清楚你具体想做什么,所以不能给出比上面更具体的建议。我觉得去使用SC会更合理,而不是从头开始用Python自己写所有工具。

4

我在SuperCollider和Python(有用Numpy和没有用Numpy的)方面有很多经验。我做了很多音频分析,不过我担心答案会根据你想做的事情而不同。

  1. 如果你想创建可以实时输入或输出音频的系统,那么Python就不太合适了。你提到的音频输入输出库有点不稳定。而且,Python的垃圾回收机制并不是专门为实时处理设计的。你应该使用一个从一开始就为实时处理设计的系统。SuperCollider在这方面表现不错,正如caseyanderson提到的,音频分析的一些基本构件就在这里。还有其他环境也可以选择。

  2. 如果你想做一些比较复杂的工作,比如应用各种机器学习算法,而不一定要实时处理(也就是说,如果你可以处理WAV文件而不是实时音频),那么你应该使用一种通用的编程语言,这种语言有广泛的支持和良好的库生态系统,以满足你想要的额外功能。使用Python配合像numpy和scikits-learn这样的库在这方面效果很好。这种方式适合快速原型开发,但它不仅缺乏稳定的实时音频处理,而且标准的音频构件也少得多。这两点在你构建音频处理流程时会成为重要的障碍。

所以,你在这两种选择之间左右为难。根据你的应用需求,你可能可以将两者结合起来,在实时环境中处理音频输入输出,同时使用OSC消息或shell脚本与外部的Python进程进行通信。这里的限制是,你不能在两者之间随意传输大量数据(把所有音频数据传输到另一个进程是没意义的,那样做太傻了)。

撰写回答