如何合成声音?

7 投票
4 回答
4031 浏览
提问于 2025-04-15 11:15

我想制作一些听起来像真实乐器发出的声音。但我对怎么做到这一点几乎没有头绪。

到目前为止,我了解到真实乐器发出的声音通常都不是很干净。那么,怎么才能制作出这种不那么干净的声音呢?

到现在为止,我做到了这一点,但发出的声音很普通,我甚至不确定这是不是在正确使用alsa。

import numpy
from numpy.fft import fft, ifft
from numpy.random import random_sample
from alsaaudio import PCM, PCM_NONBLOCK, PCM_FORMAT_FLOAT_LE

pcm = PCM()#mode=PCM_NONBLOCK)
pcm.setrate(44100)
pcm.setformat(PCM_FORMAT_FLOAT_LE)
pcm.setchannels(1)
pcm.setperiodsize(4096)

def sine_wave(x, freq=100):
    sample = numpy.arange(x*4096, (x+1)*4096, dtype=numpy.float32)
    sample *= numpy.pi * 2 / 44100
    sample *= freq
    return numpy.sin(sample)

for x in xrange(1000):
    sample = sine_wave(x, 100)
    pcm.write(sample.tostring())

4 个回答

1

我同意这件事确实不简单,也没有一个固定的“正确方法”,不过你可以考虑从一个现成的(或者自己制作一个)MIDI 音色库 开始。

16

声音合成是一个复杂的话题,需要很多年的学习才能掌握。

这个领域并不是完全解决的问题,虽然最近的一些进展(比如物理模型合成)在模仿现实乐器方面取得了一些成果。

你有很多选择。如果你确定想深入了解合成,我建议你先学习FM合成。这种方法相对简单,容易在软件中实现,至少在基础形式上能产生各种有趣的声音。此外,可以看看Curtis Roads写的《计算机音乐教程》这本书。这本书是计算机音乐领域的经典,虽然出版有些年头了,但仍然是学习基础知识的首选。

如果你想更快地制作出逼真的声音,可以考虑使用采样技术:也就是说,录制你想要重现的乐器(或者使用现成的采样库),然后直接播放这些样本。这种方法更直接(而且通常更有效)。

8

Cheery,如果你想从头开始生成一些听起来“有机”的声音,也就是像真实物体发出的声音,最好先了解一下这些声音是怎么产生的。作为一个很好的入门,你可以看看Fletcher和Rossing的书《乐器物理学》。网上也有很多相关的资料,你可以看看James Clark的入门介绍,链接在这里。

至少浏览一下这些内容,会让你对要面对的挑战有个大概的了解。准确地模拟物理乐器是非常困难的!

如果你想要的是听起来像真实物体的声音,而不是特定乐器的声音,那你的工作会简单一些。你可以很容易地组合不同的频率,加上一点噪音,这样就能得到一些听起来不那么单调的声音。

了解一些傅里叶分析的基本知识会有帮助,频率调制(FM)技术也很有用。

祝你玩得开心!

撰写回答