如何在 Debian 9 的 Perl 中生成声音?
自己做了研究,发现不多。例如。Audio::NoiseGen,它有依赖问题(即 Audio::P ortAudio,它又很旧,在我的 Debian 9 上不接受portaudio-2.0
)。
我的意思是声音合成,而不是播放文件。最接近我正在寻找的是使用system
命令调用sox
程序。但这是在 Perl 之外,所以不是一个很好的集成。我需要一个像Perl模块这样的好模块。
音频只是一条曲线,因此使点上下摆动并在某个时间间隔采样的代码将合成音频(PCM 格式的原始音频)......这里 perl 生成了这样一条曲线
perl -e 'for ($c=0; $c<4*44100; $c++) {
$k=1*sin((1500+$c/16e1)*$c*22e-6); print pack "f", $k;
} ' |
sox -V -r 44100 -c 1 -b 32 -e floating-point -t raw -
-c 2 -b 16 -t wav - trim 0 3 gain -1 dither |
tee test.wav |
aplay
Perl 的输出通过管道传输到 SOX 中,这实际上只是将 WAV 格式标头添加到 PCM 音频中......然后将 WAV 文件通过管道传输到 T 中,该 T 输出一个 WAV 文件,同时管道播放以渲染音频......为了其他人的利益,这安装了所需的 Debian (Ubuntu) 软件包
sudo apt-get install sox alsa-utils
现在只需将上面的代码保存到一个文件中并获取它......vi 带有上述代码的某个文件
source somefile-with-above-code
将音频合成过程与其声音渲染分开很方便,因此上述分工通常是合理的
或者,您可以使用perl合成原始音频并将其直接转储到文件中...只需将以下 Perl 代码片段保存到文件中vi my-audio-perl-file
perl -e 'for ($c=0; $c<4*44100; $c++) {
$k=1*sin((1500+$c/16e1)*$c*22e-6); print pack "f", $k;
} '
然后执行它,
使用source ./my-audio-perl-file > synth_audio.pcm
然后使用 Audacity 可视化和渲染 PCM 文件...文件 -> 导入原始数据
-> Encoding -> 32 bit float
-> Byte order -> Little-endian
-> Channels -> 1 Channel (Mono)
并点击Import