我正在尝试生成声音数据,将其转换并将其存储为 WAV 格式。我就快到了 - 但我想听听生成的声音尽管它正在被“记录”。
该命令只是生成数据并回放:
perl -e 'for ($c=0; $c<4*44100; $c++) {
$k=1*sin((1500+$c/16e1)*$c*22e-6); print pack "f", $k;
} ' |
aplay -t raw -c 1 -r 44100 -f FLOAT_LE
(请注意,如果在声音停止播放后按 Ctrl-C,aplay
可能会出现段错误)
使用sox
和mplayer
,我可以很好地录音 - 但我同时听不到声音:
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 |
mplayer - -cache 8092 -endpos 3 -vo null -ao pcm:waveheader:file=test.wav
请注意,play test.wav
(其中play
是来自sox
包,而不是alsa
s aplay
)将声明文件的“持续时间:00:00:03.00” test.wav
。此外,这个过程似乎比实时运行得更快,即(显然)不到 3 秒即可完成。
通过尝试使用tee
将流捕获到磁盘来进行欺骗,
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
显然,我在这里听到了生成的声音 - 并且test.wav
也可以播放,但是,play test.wav
会报告“持续时间:未知”。
所以我想问 - 是否可以执行类似于上面的“one-liner”命令的操作来生成、播放和录制声音同时- 然而,没有需要安装jack
吗?
PS:一些相关链接:
答案1
您可以使用 tee(1) 来复用流,例如
perl -e 'for ($c=0; $c<4*44100; $c++) {
$k=1*sin((1500+$c/16e1)*$c*22e-6); print pack "f", $k;
}' | tee >(sox -c1 -r44100 -t f32 - test.wav) \
>(sox -c1 -r44100 -t f32 - -d) > /dev/null
您可能还对红袜队的合成效果感兴趣,它可以产生大多数音调和扫频,例如
sox -n -r 44100 test.wav synth 4 sine 100:1000