【发布时间】:2016-07-09 10:15:25
【问题描述】:
我先说我在音频处理和合成方面完全是新手,如果我做出一些愚蠢的假设或误解了核心概念,请纠正我。
我正在尝试使用 SoX 将数字数据数组转换为单个音频文件。到目前为止,我有两种“有效”的方法,它们产生了一些非常可怕的结果,并且都有严重的局限性。
我在 64 位 WIN 8.1 机器上通过 PHP 使用 SoX。
方法一输出单个音调然后连接
$toneLinks=array();
for($i=0;$i<count($sourceData);$i++){
$filename='tones\\'.$dataTitle.'_'.$i.'.au';
$soxCommand=$soxFolder.'sox -n '.$filename.' synth .5 sin '.($sourceData[$i]).' vol 0.5 ';
shell_exec($soxCommand);
$toneLinks[]=$filename;
}
$chunks=array_chunk($toneLinks,100);
$chunkFiles=array();
for($ch=0;$ch<count($chunks);$ch++){
$name='tones\\'.$dataTitle.'_chunk_'.$ch.'.au';
$soxCommand=$soxFolder.'sox ';
for($i=0;$i<count($chunks[$ch]);$i++){
$soxCommand.=' '.$chunks[$ch][$i];
}
$soxCommand.=' '.$name;
$result=shell_exec($soxCommand);
$chunkFiles[]=$name;
}
$soxCommand=$soxFolder.'sox ';
for($i=0;$i<count($chunkFiles);$i++){
$soxCommand.=' '.$chunkFiles[$i];
}
$soxCommand.=' '.$dataTitle.'.au';
shell_exec($soxCommand);
限制:
- 缓慢,需要多次单独执行
混合似乎受到限制,即尝试加入 100 或 200 个文件将产生一个包含部分但不是全部音调的文件。尝试加入 1000 个文件将失败且没有输出。大概可以连接几个文件,然后连接那些连接的文件,但这会加剧第一个限制。在创建多个- 放弃了“混音”,并且能够使用更新的方法 1 成功连接任意数量的音调,因为这种方法显示出最大的希望,随着最终限制的进展,我将继续试验和更新。
- 虽然不重要,但最终输出没有“流”,听起来就是这样,许多单独的音调粘在一起。
方法2在单个命令中生成“和弦”
$soxCommand=$soxFolder.'sox -n '.$dataTitle.'.au synth ';
for($i=1;$i<count($sourceData);$i++){
$soxCommand.='.25 sin '.($sourceData[$i]).' ';
}
$soxCommand.='delay ';
for($i=1;$i<count($sourceData);$i++){
$soxCommand.=($i*.2).' ';
}
$soxCommand.='remix - fade 0 '.(count($sourceData)*.2+.5).' .1 norm -1';
shell_exec($soxCommand);
限制:
- 尝试创建具有 300 多个音调的“和弦”时会遇到 与最后一种方法类似的问题,但连接更小 使用这种方法的文件听起来很奇怪,因为 连接处有声音中断的组件。可以重叠文件,但这仍然不理想。
- 虽然使用此方法的音符重叠会产生“流动”的音频 它还引入了裁剪,大概是由于两个分层 音量为 1 的音调。我无法按照方法 1 确定如何指定音量
理想的答案将解决以下问题:
- 合成多个音调并将它们组合成一个单一的内聚 一段“音乐”
- 使用不确定长度的源数据集
- 避免在最终输出中剪裁
【问题讨论】: