原文地址:https://dylanmeeus.github.io/posts/audio-from-scratch-pt3/
在上一篇文章中我们编写了用于读取和写入WAVE文件的代码。因此,现在该开始使用此功能来实际处理一些声音了。这篇文章的目标很简单,我们要更改给定.wave文件的振幅。
为此,我将导入在第2部分中编写的库。
这篇文章的代码也在 Github中。
改变幅度
更改幅度需要三个输入:
- 输入文件:.wave输入
- 输出文件:.wave输出
- ampfac:缩放幅度的因子
为了解析这些参数,我们将使用内置flags
包。
var (
input = flag.String("i", "", "input file")
output = flag.String("o", "", "output file")
amp = flag.Float64("a", 1.0, "amp mod factor")
)
接下来,我们要解析这些值,并从输入文件中读取音频数据。
func main() {
flag.Parse()
infile := *input
outfile := *output
scale := *amp
wave, err := pkg.ReadWaveFile(infile)
if err != nil {
panic("Could not parse wave file")
}
...
}
因此,现在我们该如何实际改变刚刚读取的音频文件的幅度?
在音频文件中,我们有原始音频数据(类型为Sample = float64
)。这些float64样本值表示不同时间点的幅度。因此,为了操纵振幅,我们必须操纵这些值。
我们可以像下面这样:
scaledSamples := changeAmplitude(wave.Samples, scale)
if err := pkg.WriteSamples(scaledSamples, wave.WaveFmt, outfile); err != nil {
panic(err)
}
fmt.Println("done")
在这里,我们刚刚将函数命名为“ changeAmplitude”,该函数要求我们传递Samples和一个比例因子,然后返回新的Samples。
如前文所述,我们可以改变样本本身来改变幅度。
func changeAmplitude(samples []pkg.Sample, scalefactor float64) []pkg.Sample {
for i, s := range samples {
samples[i] = pkg.Sample(float64(s) * scalefactor)
}
return samples
}
这就是全部。给定用户传递的比例因子,我们将每个样本乘以该因子以获得一个新样本。最后,我们返回我们的新样本并将其写入输出文件。我们的GoAudio库再次处理了将这些样本实际写入wave文件的工作 。
运行代码
现在我们可以运行代码了,我们可以传递一个输入文件,命名一个输出文件以及一个比例因子来更改音频,例如,将声音文件的振幅加倍,我们可以使用以下命令:
go run main.go -i sound.wav -o out.wav -a 2
结果如下:
这种更改效果是非常微弱的,因此下面是原始来源乘以5的效果:
失真也开始在这里出现了。:-)
网友评论