如何在Debian 9上的Perl中生成声音?
自己的研究完成,没有太多发现。例如。 Audio::NoiseGen,它存在依赖性问题(即Audio::PortAudio,而后者在我的Debian 9上已经过时并且不接受portaudio-2.0
。
我的意思是声音合成,而不是播放文件。最接近我正在寻找的是使用system
命令来调用sox
程序。但这已经超出了Perl,所以不是一个很好的集成。而且我需要一个像Perl模块一样好的。
答案 0 :(得分:3)
音频只是一条曲线,所以代码使得一个点上下摆动并以某个时间间隔进行采样将合成音频(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,这实际上只是为PCM音频添加了一个wav格式的标题...然后将wav文件用管道输入到tee中,输出一个wav文件,同时输出一个呈现音频的播放...其他人的好处就是安装了所需的debian(ubuntu)软件包
sudo apt-get install sox alsa-utils
现在只需将上面的代码保存到文件中并将其源代码... vi somefile-with-above-code
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文件...文件 - &gt;导入原始数据
-> Encoding -> 32 bit float
-> Byte order -> Little-endian
-> Channels -> 1 Channel (Mono)
并点击Import