[小声团队] - 技术大起底,我们是怎么构建出一款专业音乐软件的

1,672 阅读6分钟

本文由小声团队出品,小声团队是一个专注于音频&音乐技术的初创团队,深度使用Flutter构建跨平台应用,希望与大家一起共同探索Flutter在桌面端&移动端的可能性。

背景

本文主要尝试向大家介绍一下我们在构建《律Studio》这款产品中采用了哪些技术以及如何抉择的。首先,我们先看一支简短的影片了解一下软件的基本功能。

在浏览器中查看视频

正如视频中所示,《律Studio》是一款音乐制作垂直领域的专业软件,功能繁多,交互复杂,并且对于性能很敏感。这些特点是我们做所有技术选型时候的重要衡量目标。

当前,我们的软件也在小规模的进行技术性测试,我们欢迎更多的用户&开发者参与到我们的测试计划中帮助我们更快的成长。更多信息可以点击 律Studio - 创作是一件有趣的事情

行业知识

作为一款音乐制作软件而言,存在着两大领域知识需要提前进行学习,这也是行业的基本门槛之所在。

音乐理论

音乐理论是我们在进行业务开发时候的重要知识,只有具备了这些知识我们才具备开发一个音乐软件的前提条件,这些理论知识包括:

  1. 音乐基本乐理。
  2. 音乐心理学。
  3. 和声学。
  4. 配器法。
  5. 作曲法。

掌握这些基本的理论知识以及至少熟悉1到2门器乐的演奏是必要的,否则我们连基本的测试都难以实施,更别提一些功能的开发了,不深入了解和声如何开发和弦助手功能呢?

除了开发者,产品经理对于上述知识更是重中之重,产品经理需要非常熟悉电子音乐制作的流程,通常需要由行业专家参与软件的产品设计。

不一定要求你是一个音乐家,但是至少是一个音乐理论家。

音频理论

音乐理论知识只是为我们建立起音乐科学的心智模型,而具体的在计算机中处理音乐则需要用到音频处理的理论知识。 在计算机中,音频是通过由采样定理收集的数字信号,因此,音频也可以说是电子信号处理(DSP)的子领域。所以进行基本的DSP知识学习是必要的,比如我们在实现均衡器(EQ)插件的时候就需要运用到DSP中的滤波器(高通,低通,带通),在做音频变速的实现则涉及到重采样技术等。

编程技术

前端技术

对于大型生产力工具(比如Adobe PhotoShop)而言,目前业界的主流方案都是采用QT或者等效于QT的自研框架。而我们基于我们的考量,采用了Flutter作为我们的前端技术栈实现用户交互界面,更多的选择原因可以参考我们的文章【小声团队】 - 我们为什么选择了Flutter Desktop

在Flutter的的Windows正式版的博文中,我们也有幸被收录为其官方示例案例, juejin.cn/post/706068…

在做前端技术选型的时候,我们至少要从以下几个方面进行思考:

  1. 和原生代码的可交互性。因为音频引擎往往需要采用更高性能的原生语言编程(C++、Rust等)。
  2. 渲染性能。与互联网不一样,生产力工具的处理大部分都是在本地进行,因此能够支撑高频刷新的复杂渲染是非重要的事情。

音频技术

根据自己的需求,我们可以采用不同的音频引擎构建方案,比如采用商业许可的JUCE框架,从Chroinum项目中分离的LabSound框架,或者完全自研。 对于音频引擎来讲,至少需要包含:

  1. 音频设备管理。
  2. MIDI协议支持。
  3. 高效DSP算法支持。
  4. 文件管理系统支持。
  5. 基于有向图计算的音频处理单元路由。

在具体的实现中,音频会被按照组织逻辑切割从不同的处理单元,而不同的处理单元之间可以进行自由的路由。假设我们需要开发一个支持效果器处理的音频播放器,那么往往我们会由类似的逻辑进行设计。

class AudioProcessor {
 //传入input数据与output数据,在处理单元内部修改output数据则代表处理。
 void process(float **input,float **output);
 //基于有向图的处理单元的连接
 void connect(AudioProcessor* source,AudioProcessor dest);
}

那么,就可以用如下类似的代码进行路由编排,从而实现复杂的音频处理任务。

auto source = AudioFileSourceProcessor("xxx.wav");
auto eq = EQProcessor();
eq.low.gain = 1.0;

auto reverb = ReverbProcessor();
reverb.roomSize = 20.0;

auto graph = Graph(); 

graph.connect(eq,source);  //把均衡处理单元与源文件读取单元连接
graph.connect(eq,reverb); //把混响处理单元与eq处理单元连接
graph.connect(reverb,device); //将混响处理单元与设备驱动连接

深入的理解有向图计算单元框架的构建方法是开发一个音频引擎的架构核心,除了在音频领域,机器学习领域的框架们也同样是由有向图为计算调度模型进行设计的。

人工智能技术

在2022年的今天,人工智能在音乐领域中的科研也发展的热火朝天,当前具体的人工智能任务包括:

任务代表研究成果
歌声合成(SVS)Microsoft - XiaoiceSing: A High-Quality and Integrated Singing Voice Synthesis System

ByteDance - ByteSing: A Chinese Singing Voice Synthesis System Using Duration Allocated Encoder-Decoder Acoustic Models and WaveRNN Vocoders
乐谱转录(AMT)Google - MT3: Multi-Task Multitrack Music Transcription

ByteDance - High-resolution Piano Transcription with Pedals by Regressing Onset and Offset Times

教材推荐

开源项目

项目名称项目地址描述
JUCE Frameworkgithub.com/juce-framew…商业授权的完善跨平台音频解决方案,目前最为流行的框架,众多音频厂商都采用了该框架。
LabSoundgithub.com/LabSound/La…从Chromium WebAudio API中分离的跨平台框架。
Essentiagithub.com/Noise-Labs/…适用于科研&实验的音频任务框架,同样也是基于图运算的,拥有python绑定,适合快速进行算法验证。
FluidSynthgithub.com/FluidSynth/…Fluidsynth 是一款支持SoundFont v2格式的MIDI播放器,原始设计用于游戏音乐。
Chowdspgithub.com/Noise-Labs/…当前积极开发状态的DSP处理库
MuseScoregithub.com/musescore/M…MuseScore是一款开源的跨平台乐谱制作软件

总结

这样短短一篇概览性的文章没有办法详细的描述更多的细节,仅仅作为有志参与音频技术研发的朋友一个参考,当然也欢迎大家做更多的补充。

内测参与 & 商业合作

小声团队在音乐&音频处理领域中已经积累了大量的实践经验,我们也乐意于向所有在这个垂直领域有需求的企业客户提供技术咨询&商业解决方案业务,或者与《律Stduio》产品建立合作关系。

联系方式,微信: miskolee, 备注 掘金