私はこのexampleに基づいて自分のコードのMFCC抽出部分を作成しました。これは2つのAudioProcessor
インスタンスを作成しました。しかし、Androidスタジオでデバッガを使用して、私はコードがすぐにprocessingFinished
関数に入り、両方の処理関数をスキップしていることがわかりました。インスタンス内のmfcc
変数は、2番目のAudioProcessor関数のprocessingFinished
関数中にnullのままになりました。なぜデータは決して処理されませんか?これはMFCCを取得する正しい方法ですか?TarsosDSPを使用してファイルからMFCCデータを抽出するにはどうすればよいですか?
私のソースコード:(私はファイルからパイプにtheAudioDispatcherを変更)
private void onMFCC() {
int sampleRate = 44100;
int bufferSize = 1024;
int bufferOverlap = 128;
//final AudioDispatcher dispatcher = AudioDispatcherFactory.fromDefaultMicrophone(22050,1024,512);
String path = getExternalCacheDir().getAbsolutePath() + "/saytest.mp4";
new AndroidFFMPEGLocator(this);
final AudioDispatcher dispatcher = AudioDispatcherFactory.fromPipe(path, sampleRate, bufferSize, bufferOverlap);
final MFCC mfcc = new MFCC(bufferSize, sampleRate, 40, 50, 300, 3000);
dispatcher.addAudioProcessor(mfcc);
dispatcher.addAudioProcessor(new AudioProcessor() {
@Override
public void processingFinished() {
//vvv error b/c mfcc instance variable is null
//float[] mfccArr = mfcc.getMFCC();
System.out.println("DONE");
}
@Override
public boolean process(AudioEvent audioEvent) {
// breakpoint or logging to console doesn't enter function
return true;
}
});
dispatcher.run();
}
があるため、パイプAudioDispatcherの誤差はこれをしなければならなかったという可能性がありますか?
Starting piped decoding process for /storage/emulated/0/Android/data/com.example.audiorecorder/cache/saytest.mp4
I/PipeDecoder: with command: "/data/user/0/com.example.audiorecorder/cache/ffmpeg" -ss 0.0 -i "/storage/emulated/0/Android/data/com.example.audiorecorder/cache/saytest.mp4" -vn -ar 44100 -ac 1 -sample_fmt s16 -f s16le pipe:1
I/PipeDecoder: CANNOT LINK EXECUTABLE "/data/user/0/com.example.audiorecorder/cache/ffmpeg": /data/data/com.example.audiorecorder/cache/ffmpeg: has text relocations
I/PipeDecoder: Aborted
I/PipeDecoder: Finished piped decoding process
助けてください。どうもありがとうございます!
EDIT: 私は、メソッドの最後に次の行を追加することにより、独立したプロセス関数を呼び出してみました:
mfcc.process(new AudioEvent(new TarsosDSPAudioFormat(sampleRate, bufferSize, 1, true, true)));
はしかし、これは私にはNullPointerExceptionを与えました。
- また、2つの異なるオーディオファイルを使用してmfccインスタンスを比較しましたが、データが完全に同じであることがわかりました。処理の結果はありませんでした。ディスパッチャをマイクに戻したとき、mfccには値があり、プログラムはプロセス関数を実行しました!ディスパッチャがオーディオファイルにアクセスするのはなぜですか?