gpt4 book ai didi

java - 如何使用 TarsosDSP 从文件中提取 MFCC 数据?

转载 作者:行者123 更新时间:2023-12-02 02:43:31 48 4
gpt4 key购买 nike

我根据此 example 创建了代码的 MFCC 提取部分在 Stack Overflow 上,它创建了两个 AudioProcessor 实例。然而,在Android studio上使用调试器时,我发现代码很快进入了processingFinished函数,同时跳过了两者的process函数。在第二个 AudioProcessor 函数的 processingFinished 函数中,实例中的 mfcc 变量保留为 null。为什么数据从不被处理?这是获得 MFCC 的正确方法吗?

我的源代码:(我将AudioDispatcher更改为从文件进行管道传输)

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

任何帮助将不胜感激。非常感谢!

编辑:我尝试通过将此行添加到方法的末尾来独立调用流程函数:

mfcc.process(new AudioEvent(new TarsosDSPAudioFormat(sampleRate, bufferSize, 1, true, true)));

但是,这给了我一个 NullPointerException。

  • 我还使用两个不同的音频文件比较了 mfcc 实例,但我发现它们具有完全相同的数据,因此它们没有处理结果。当我将调度程序改回麦克风时,mfcc 就有了值,程序执行了 process 函数!为什么调度员访问音频文件不起作用?

最佳答案

我解决了这个问题,因为我意识到调度程序 fromPipe 无法工作,因此我更换了调度程序:

InputStream inStream = new FileInputStream(path);
AudioDispatcher dispatcher = new AudioDispatcher(new UniversalAudioInputStream(inStream, new TarsosDSPAudioFormat(sampleRate, bufferSize, 1, true, true)), bufferSize, bufferOverlap);

关于java - 如何使用 TarsosDSP 从文件中提取 MFCC 数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45043466/

48 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com