事の発端
Javaのプロジェクトで作業をしているときに音と声を分けたい処理が出てきた。
調べてみるとSpleeterがいいらしく、言語はPythonだった。
今更JavaからPythonに書き換えるのは辛いため、どうにかならないか?
そうだ、無理やり呼びだしてみよう。
環境
Amazon Corretto 17.0.2
conda 4.11.0 (Python 3.7)
Windows 10 Home 64bit
Anaconda + Spleeterの構築ファイル
こちらの記事を参考に作成。
Qiita: 一番簡単なWindowsによるSpleeter使用環境構築
spleeter-cpu.yaml
name: spleeter-cpu
channels:
- conda-forge
- anaconda
dependencies:
- python=3.7
- tensorflow=1.14.0
- ffmpeg
- pandas==0.25.1
- requests
- pip
- pip:
- museval==0.3.0
- musdb==0.3.1
- norbert==0.2.1
- spleeter==2.1.1
Javaから呼び出し
プロジェクトが割とハードコードでも問題無い場所だったため無理やり実装をする。
手順としてはProcessBuilder
でProcess
を作成した後、condaのバッチファイルを読み込みProcess
を無理やりconda環境で動かす。
ProcessBuilder builder = null;
Process process = null;
// 以下パスは各自置き換えてください
File path = new File(System.getProperty("user.dir") + File.separator + "spleeter");
File audioFile = new File(path, "audio.wav");
// ここのconda.batも
builder = new ProcessBuilder("D:\\conda\\conda.bat", "activate", "spleeter-cpu", "&&", "spleeter", "separate", audioFile, "-o", "./", "-p", "spleeter:2stems");
builder.directory(path);
builder.redirectErrorStream(true);
try {
process = builder.start();
InputStreamReader isr = new InputStreamReader(process.getInputStream(), "UTF-8");
BufferedReader r = new BufferedReader(isr);
while (true) {
Thread.sleep(100);
String line = r.readLine();
if (line != null) {
// Spleeterログ出力
System.out.println(line);
}
}
if (!process.isAlive()) {
break;
}
process.waitFor();
process.destroy();
} catch (Exception e) {
e.printStackTrace();
}
まとめ
無理やり動かすことはできる。
現状プロジェクトでは特に問題は発生していないがProcess
を使ってる以上別の問題が発生してくると思う。
そこが怖い為、別の方法を模索してみようと思う。