2016-07-09 26 views
1

,我會說我是一個新手,總當涉及到音頻處理及合成,如果我在做一些愚蠢的假設或誤解核心概念前言本請指正。合成可變長度的多音調音頻SOX法案,同時避免削波

我與SOX試驗,以數字數據的陣列轉換成單一的音頻文件。到目前爲止,我有兩種「工作」方法產生了一些非常可怕的結果,並且都有嚴重的侷限性。

我通過PHP在使用64位WIN SOX 8.1箱。

方法1輸出各個音調然後串聯

$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個文件將失敗,不輸出。人們可能想要連接幾個文件,然後連接這些連接的文件,但這會加劇第一個限制。當創建多個< = 100音調中介文件的最終混音時,它會在組件完成渲染之前處理混音,從而產生空的最終混音。
  • 廢棄的「混合」,並能成功地串聯任意數量的使用更新的方法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

理想的答案將解決以下問題:

  • 合成多個音調並將它們組合成一個單一的凝聚力 片「音樂「
  • 避免限幅在最後的輸出的源數據集不確定長度的工作

回答

0

經過多次實驗後,我決定採用滿足我要求的方法。我確信可以使用管道來提高過程的效率,但是這種方法已經在不到一分鐘的時間內在所需大小(〜2,000)的數據集上產生了所需的結果。

//Generate individual tones 
$tones=array(); 
for($i=0;$i<count($sourceData)-1;$i++){ 
    $name='tones\\'.$dataTitle.'_'.$i.'.au'; 
    $soxCommand=$soxFolder.'sox -n '.$name.' synth 0.2 sin '.($sourceData[$i]).' fade q 0.05 0 '; 
    shell_exec($soxCommand); 
    $tones[]=$name; 
} 
//Break into manageable chunks to avoid exec character limit 
$chunks=array_chunk($tones,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.' splice 0.2'; 
    shell_exec($soxCommand); 
    $chunkFiles[]=$name; 
} 
//Render chunks into final track 
$soxCommand=$soxFolder.'sox '; 
for($i=0;$i<count($chunkFiles);$i++){ 
    $soxCommand.=' '.$chunkFiles[$i]; 
} 
$soxCommand.=' '.$dataTitle.'.au splice 20'; 
shell_exec($soxCommand); 
//Clean component files 
for($i=0;$i<count($tones);$i++){ 
    unlink($tones[$i]); 
} 
for($i=0;$i<count($chunkFiles);$i++){ 
    unlink($chunkFiles[$i]); 
} 

SOX的消歧命令

產生樂音: 「硫化物-n [OUTFILE]合成器0.2 [頻率]褪色q 0.05 0」

此命令生成一個0.2第二音調在軌道的自然結束之前0.05秒四分之一正弦淡入和四分之一正弦淡出。

結合音/塊: 「SOX [TONE1] [tone2] [音...] [OUTFILE]拼接0.2」

這個祕密武器就是它會自動嘗試刪除接頭由啞連接引起的點擊。最後的命令只是用大塊信息代替音調信息,並將接合點從0.2秒增加到20秒。