MediaRecorder записывает аудио в цикле - PullRequest
0 голосов
/ 03 мая 2019

Я разрабатываю систему распознавания звука.Я использую модель тензорного потока, разработанную на python, для преобразования значений MFCC в метки.Я использую класс MediaRecorder для записи аудио, и я делаю это в цикле, чтобы я мог постоянно получать звук с микрофона, а затем получать метку от модели.Вот цикл записи:

temp = 0;
    while (true) {
        audioPath = getApplicationContext().getFilesDir().getAbsolutePath();
        audioPath += "/Recording" + temp + ".3gp";

        audioFile = new File(audioPath);
        mediaRecorder = new MediaRecorder();
        mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
        mediaRecorder.setOutputFile(audioPath);
        try {
            mediaRecorder.prepare();
        } catch (IOException e) {
            e.printStackTrace();
        }
        mediaRecorder.start();
        sleep(2000);
        if (!isRunning) {
            mediaRecorder.stop();
            return;
        }
        try {
            int amplitude = mediaRecorder.getMaxAmplitude();
            Log.d("volume", Integer.toString(amplitude));
            //finished = false;
            avgVolumeTask task = new avgVolumeTask();
            task.execute(amplitude);
        } catch (Exception e) {
            Log.d("Exception in startMediaRecorder()", e.toString());
        }
        mediaRecorder.stop();
        mediaRecorder.release();

        soundRecognition task2 = new soundRecognition();
        task2.execute();
        audioFile.delete();
        temp++;
    }

Это метод soundRecognition:

private class soundRecognition extends AsyncTask<Integer, Integer, Long> {
    @Override
    protected Long doInBackground(Integer... level) {
        float[] mfccValues = null;
        Interpreter tflite = null;
        float[][] labelProbArray = null;
        try {
            mfccValues = computeMFCC();
            labelList = loadLabelList();
            labelProbArray = new float[1][labelList.size()];
            tflite = new Interpreter(loadModel());
        } catch (IOException e) {
            e.printStackTrace();
        } catch (UnsupportedAudioFileException e) {
            e.printStackTrace();
        }
        tflite.run(mfccValues, labelProbArray);

        for (int i = 0; i < labelProbArray[0].length; i++) {
            float value = labelProbArray[0][i];
            //if (i == 1f){
                //Log.d("Output at " + Integer.toString(i) + ": ", Float.toString(value));
                //doAlert(i);
            //}
        }

        return null;
    }
}

Метод computeMFCC таков:

public float[] computeMFCC() throws IOException, UnsupportedAudioFileException {

    FileInputStream in2 = new FileInputStream(audioPath);
    int i;
    // InputStream to byte array
    byte[] buf = IOUtils.toByteArray(in2);
    in2.close();
    i = Integer.MAX_VALUE;

    // byte array to short array
    short[] shortArr = new short[buf.length / 2];
    ByteBuffer.wrap(buf).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().get(shortArr);

    int count = 0;
    while (count <= shortArr.length) {                    // Still have data to process.
        for (int n = 0; n < nSubframePerBuf; n++) {            // Process audio signal in ArrayList and shift by one subframe each time
            int k = 0;
            for (i = (n * frameShift); i < (n + 1) * frameShift; i++) {
                subx[k] = shortArr[i];
                k++;
            }
            subframeList.add(subx);                            // Add the current subframe to the subframe list. Later, a number of
        }
        count++;
    }
    // Need at least nSubframePerMfccFrame to get one analysis frame
    x = extractOneFrameFromList(nSubframePerMfccFrame);

    MFCC mfcc = new MFCC(samplePerFrm, 16000, numMfcc);
    double[] mfccVals = mfcc.doMFCC(x);
    float[] floatArray = new float[mfccVals.length];
    for (i = 0 ; i < mfccVals.length; i++)
    {
        floatArray[i] = (float) mfccVals[i];
    }
    return floatArray;
}

И метод doMFCCиз загруженного файла Java здесь:

https://github.com/enmwmak/ScreamDetector/blob/master/src/edu/polyu/mfcc/MFCC.java

У меня проблема в том, что после нескольких итераций я сталкиваюсь с проблемой, что файл не создается, а затем получаюнулевая ошибка при передаче результатов из входного потока в модель тензорного потока.

Возможные проблемы

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

Другая причина может заключаться в том, что я не вызываю распознавание звука в нужном месте.Я дождался воли после остановки mediaRecorder, чтобы убедиться, что файл записан с микрофонным звуком, но когда я просматриваю содержимое fileInputStream, кажется, что он не работает, и в каждом цикле файл всегда одинаков.

Любая помощь будет высоко ценится.

1 Ответ

0 голосов
/ 04 мая 2019

Может быть сложно поспать (2000) внутри цикла while.Может быть лучше проверить миллис и сломаться, пока 2000 мс не истекли.

...