Debian 9 上的 Perl 声音合成



如何在 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

最新更新