Я хочу активировать свой датчик, когда звучит непрерывный шум (Android Studio) - PullRequest
0 голосов
/ 16 марта 2020

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

Activity DetectNoise

public class DetectNoise {




   // This file is used to record voice
   static final private double EMA_FILTER = 0.6;

   private MediaRecorder mRecorder = null;
   private double mEMA = 0.0;

   public void start() {



       if (mRecorder == null) {


           mRecorder = new MediaRecorder();
           mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
           mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
           mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
           mRecorder.setOutputFile("/dev/null");

           try {
               mRecorder.prepare();
               mRecorder.start();
               mEMA = 0.0;
           } catch (IllegalStateException e) {
               Log.e("Error",e.toString());
               e.printStackTrace();
           } catch (IOException e) {
               // TODO Auto-generated catch block
               Log.e("Error",e.toString());
               e.printStackTrace();
           }

       }
   }



public double getAmplitude() {



       if (mRecorder != null)
           //return  (mRecorder.getMaxAmplitude()/1100.0);


           return   20 * Math.log10(mRecorder.getMaxAmplitude() / 2000);
       else
           return 0;

   }

public double getAmplitudeEMA() {
       double amp = getAmplitude();
       mEMA = EMA_FILTER * amp + (1.0 - EMA_FILTER) * mEMA;
       return mEMA;
   }

Activity One

private int mThreshold;
private static final int POLL_INTERVAL = 300;
mSensor = new DetectNoise();
private Handler mHandler = new Handler();

private Runnable mPollTask = new Runnable() {
       public void run() {

               double amp = mSensor.getAmplitude();
               //Log.i("Noise", "runnable mPollTask");
               updateDisplay("Monitoring Voice...", amp);

               if ((amp > mThreshold)) {
                   callForHelp(amp);
                   //Log.i("Noise", "==== onCreate ===");
               }// Runnable(mPollTask) will again execute after POLL_INTERVAL
               mHandler.postDelayed(mPollTask, POLL_INTERVAL); }


Проблема в том, что при любом звуке он активируется. Я хочу, чтобы он активировался только тогда, когда звук длится около 5 или 7 секунд.

Кто-нибудь может мне помочь? Большое спасибо за все

Ответы [ 2 ]

0 голосов
/ 16 марта 2020

        
/**
 *  Sorry for my poor english
 */
import java.util.Random;
public class Test implements Runnable {
    //You can try start
    public static void main(String[] args) {
        new Thread(new Test()).start();
    }
    private static Long lastTime = null;
    @Override
    public void run() {
//      This is a cycle monitor the recording volume
        while (true) {
            char temp = getAmplitude();
            System.out.print(temp);//test output
            try {
//              Sound is detected for the first time
                if (lastTime == null && temp!='_')
                    lastTime = System.currentTimeMillis();

//              Stopped sound detected
                if (temp=='_')
                    lastTime=null;

//              Sound keeps coming
//              Judgment time interval
                if(lastTime != null && System.currentTimeMillis()-lastTime>=2*1000){
//                  Speak more than two seconds
                    System.out.println("---|>Speak more than two seconds");
                    lastTime=null;
                }
//              A sampling rate of 100 ms
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
//--------------------------------------------------------------
    // Analog recording volume
    private static char getAmplitude() {
        // If there is sound output 'A'  , No sound output '_'
        // You can determine whether there is sound by the sound level
        // This is an example
        if (new Random().nextInt(100) <=7)
            return '_';//无声音
        return 'A';//有声音
    }
//--------------------------------------------------------------
}
0 голосов
/ 16 марта 2020

начальная отметка времени инициализации равна нулю, вы можете получить от первой амплитуды до записи отметку времени, если они исчезают в процессе обнаружения звука, вы можете сбросить отметку времени на ноль, если звук сохраняется, то первая записанная отметка времени будет сохранено. Вам нужно только определить отметку времени, а записи отметок времени получаются вычитанием, судите о продолжительности звука

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