ファイルを読み込んで.wav
ピッチをシフトし、Android で新しいファイルに書き込もうとしています。これを行うために TarsosDSP を使用していますが、新しいファイルに奇妙なアーティファクトが発生し続けました。単一の正弦波を試してみましたが、ファイルの最初のいくつかのサンプルを比較すると次のようになります。
オレンジ色が元のファイル、青色が tarsos によって生成されたファイルです。私の知る限り、github のピッチ シフトの例と比較して、処理の違いはありません。これは私のコードです:
File directory = getDir("audio", Context.MODE_PRIVATE);
String source = directory.toString() + "/" + "in.wav";
String target = directory.toString() + "/" + "out.wav";
RandomAccessFile outputFile = null;
try {
outputFile = new RandomAccessFile(target, "rw");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
int bitsPerSample = 16;
int channels = 1;
TarsosDSPAudioFormat format = new TarsosDSPAudioFormat(SAMPLE_RATE, bitsPerSample, channels, true, false);
double cents = 0;
double factor = centToFactor(cents);
RateTransposer rateTransposer = new RateTransposer(factor);
WaveformSimilarityBasedOverlapAdd wsola = new WaveformSimilarityBasedOverlapAdd(WaveformSimilarityBasedOverlapAdd.Parameters.musicDefaults(factor, SAMPLE_RATE));
WriterProcessor writer = new WriterProcessor(format, outputFile);
try {
InputStream inputStream = new FileInputStream(source);
UniversalAudioInputStream uStream = new UniversalAudioInputStream(inputStream, format);
print(wsola.getInputBufferSize());
print(wsola.getOverlap());
AudioDispatcher audioDispatcher = new AudioDispatcher(uStream, wsola.getInputBufferSize(), wsola.getOverlap());
wsola.setDispatcher(audioDispatcher);
audioDispatcher.addAudioProcessor(wsola);
audioDispatcher.addAudioProcessor(rateTransposer);
audioDispatcher.addAudioProcessor(writer);
audioDispatcher.run();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
と:
public static double centToFactor(double cents) {
return 1 / Math.pow(Math.E, cents * Math.log(2) / 1200 / Math.log(Math.E));
}
実際に音を変えてみましたcents != 0
が( )、結果は良くなりませんでした。実際の録音ではアーティファクトが常に目立たなくなることを期待する必要がありますか、またはこれを修正する方法はありますか? 私はオーディオ処理に非常に慣れていません。