Я пытаюсь получить высоту входа микрофона с помощью диспетчера звука TarsosDSP, и он работает, но высоту тона не удается найти примерно через полсекунды после его ввода в микрофон. Что я могу сделать, чтобы попытаться ускорить это? Мне не нужно, чтобы звук был хорошего качества или был записан в любом месте, просто нужна высота звука.
Я попытался использовать диспетчер звука точно так, как показано в примере кода TarsosDSP, и я также попытался определить высоту тона немного вручную, используя AudioRecord и класс Yin в TarsosDSP. Оба имеют довольно значительную задержку.
Метод 1:
AudioDispatcher dispatcher = AudioDispatcherFactory.fromDefaultMicrophone(22050, 1024, 0);
PitchDetectionHandler pdh = new PitchDetectionHandler() {
@Override
public void handlePitch(PitchDetectionResult result, AudioEvent e) {
final float pitchInHz = result.getPitch();
if (pitchInHz > 0) {
System.out.println(pitchInHz);
}
}
};
AudioProcessor p = new PitchProcessor(PitchProcessor.PitchEstimationAlgorithm.FFT_YIN, 22050, 1024, pdh);
dispatcher.addAudioProcessor(p);
new Thread(dispatcher, "Audio Dispatcher").start()
Метод 2:
new Thread(new Runnable() {
@Override
public void run() {
int sampleRate = 22050;
int channelConfig = AudioFormat.CHANNEL_IN_MONO;
int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
int bufferSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioFormat);
AudioRecord recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, sampleRate, channelConfig, audioFormat, 2048);
recorder.startRecording();
short[] audioData = new short[1024];
float[] fAudioData = new float[1024];
Yin yin = new Yin(sampleRate, 1024);
while(true) {
recorder.read(audioData, 0, 1024);
for (int i = 0; i < audioData.length; i++) {
fAudioData[i] = (float) audioData[i];
}
float pitch = yin.getPitch(fAudioData).getPitch();
if (pitch > 0) {
System.out.println(pitch);
}
}
}
}).start();
Я пытался изменить некоторые числа вокруг, но так и не удалось заставить его отображать высоту тона раньше.
Оба они НЕ работают в потоке пользовательского интерфейса.