TarsosDSP音高分析入门

8

我正在开发一个分析声音文件音高的程序。我找到了一个非常好的API叫做"TarsosDSP",它提供了各种音高分析功能。然而,我在设置它时遇到了很多麻烦。能否有人向我展示如何使用这个API(特别是PitchProcessor类)的快速指针?因为我在声音分析方面还很新手,所以一些代码片段将非常感激。

谢谢

编辑:我在http://husk.eecs.berkeley.edu/courses/cs160-sp14/index.php/Sound_Programming上找到了一些文档,其中有一些示例代码显示如何设置PitchProcessor,...

int bufferReadResult = mRecorder.read(mBuffer, 0, mBufferSize);
// (note: this is NOT android.media.AudioFormat)
be.hogent.tarsos.dsp.AudioFormat mTarsosFormat = new be.hogent.tarsos.dsp.AudioFormat(SAMPLE_RATE, 16, 1, true, false);
AudioEvent audioEvent = new AudioEvent(mTarsosFormat, bufferReadResult);
audioEvent.setFloatBufferWithByteBuffer(mBuffer);
pitchProcessor.process(audioEvent);

我感到有些迷茫,mBuffer和mBufferSize具体是什么意思?我该如何找到这些值?音频文件应该放在哪里?


那个伯克利链接已经失效。 - jim
https://biblio.ugent.be/publication/4260455/file/4260477 - jim
1个回答

10
TarsosDSP框架中音频的基本流程如下:来自音频文件或麦克风的输入音频流被读取并切成例如1024个采样的帧。每个帧通过一个管道,进行修改或分析(例如音高分析)。
在TarsosDSP中,AudioDispatcher负责将音频分割成帧,并将音频帧封装到AudioEvent对象中。这个AudioEvent对象会通过一系列的AudioProcessors
所以,在你引用的代码中mBuffer是音频帧,mBufferSize是采样缓冲区的大小。您可以自己选择缓冲区大小,但对于音高检测,2048个采样是合理的。
使用TarsosDSP库进行音高检测,您可以像这样做:
   PitchDetectionHandler handler = new PitchDetectionHandler() {
        @Override
        public void handlePitch(PitchDetectionResult pitchDetectionResult,
                AudioEvent audioEvent) {
            System.out.println(audioEvent.getTimeStamp() + " " pitchDetectionResult.getPitch());
        }
    };
    AudioDispatcher adp = AudioDispatcherFactory.fromDefaultMicrophone(2048, 0);
    adp.addAudioProcessor(new PitchProcessor(PitchEstimationAlgorithm.YIN, 44100, 2048, handler));
    adp.run();

在这段代码中,首先创建了一个处理程序,它简单地打印出检测到的音高。 AudioDispatcher 附加到默认麦克风并具有缓冲区大小为 2048。一个检测音高的音频处理器被添加到 AudioDispatcher 中,并在那里使用该处理程序。

最后一行启动了该过程。


感谢@Joren,我非常感激您在Tarsos上所做的工作。提醒其他人,System.out.println()缺少一个“+”,我需要将采样率作为.fromDefaultMicrophone()的第一个参数添加进去。 - Sam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接