Как увеличить скорость определения высоты звука с помощью TarsosDSP? - PullRequest
0 голосов
/ 06 июня 2019

Я пытаюсь получить высоту входа микрофона с помощью диспетчера звука 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();

Я пытался изменить некоторые числа вокруг, но так и не удалось заставить его отображать высоту тона раньше.

Оба они НЕ работают в потоке пользовательского интерфейса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...