2017-08-04 5 views
1

以下のプログラムでは、音声ファイルをスピードアップし、あたかも「ヘリウム音声」のように発音させます。これは、インデックス値を変更することによって行われ、ファイルを増やすと、ファイルのピッチが上がり、速くなります。逆を行い、音声の再生を遅くし、より深い声を出す方法があるのか​​どうか疑問に思っていました。音声速度を遅くする

public void helium(String sourceFile, String targetFile) 
{ 
    Sound sourceObj = new Sound(sourceFile);        
    Sound target = new Sound(targetFile); 
    int sampleValue = 0;            
    int targetIndex = 0;             

    for(int index = 0; index < sourceObj.getLength(); index+=2) 
    { 
     sampleValue = sourceObj.getSampleValueAt(index);      
     target.setSampleValueAt(targetIndex,sampleValue);     
     targetIndex++;              
    } 
    target.play(); 

} 
+0

負の値を使用しますか? – Tavo

+0

インデックスに負の値を指定すると、エラーが発生します –

+0

1だけインクリメントして 'index/2'を使用するとどうなりますか? – shmosel

答えて

1

サンプルのサイズを半分に減らす代わりに、サンプルのサイズを2倍にして、各値を2回使用します。もっと先進的なアプローチがあると確信していますが、これにより波形の進行が2倍遅くなり、結果として低音が発生します。

私が慣れていない非標準のSound APIを使用しているため、いくつかの前提が必要です。サウンドがあなたのターゲットサンプル長すぎないことを確実にするために、私は今あなたの標的サンプルの半分の最大サイズに元のインデックスを制限しています(index < target.getLength()/2

int sampleValue = 0;            
int targetIndex = 0;             

for(int index = 0; index < target.getLength()/2; index++) 
{ 
    sampleValue = sourceObj.getSampleValueAt(index);      
    target.setSampleValueAt(targetIndex, sampleValue); 
    target.setSampleValueAt(targetIndex + 1, sampleValue);     
    targetIndex += 2;              
} 
+0

申し訳ありませんが、Javaの新機能ですが、コードを書いたものに変更すると、「そのインデックス443904は存在しません。最後の有効なインデックスは443903です」というエラーが発生しました。申し訳ありませんが、コードを変更したり、それを解釈したりすることができたらどういう意味か分かりません。 –

+0

@DannyM答えを更新しました。 "あなたのサウンドがあなたのターゲットサンプルで長すぎないようにするには、ソースのインデックスをターゲットサンプルの最大サイズの半分に制限します(' index

+0

そのトリックをしてくれてありがとう。あなたが私に尋ねる気にならないなら、なぜ私が上記のエラーが起きているのか知っていますか? (申し訳ありません、私はプログラミングに慣れていません) –

0

素朴なアプローチが倍増するだろうすべてのサンプルをアップ。

あまり単純ではないアプローチは、サンプル間の差を分割することです(線形補間)。

正しい方法は、各サンプルの間にゼロを挿入し、サンプルレートの半分を超える信号を拒否するローパスフィルタを適用することです。 https://en.wikipedia.org/wiki/Upsampling

関連する問題