我正在学习编程,但事实是我没有太多想法。我正在编写一个由音频传感器组成的应用程序,当在房屋中听到噪音时,它就会被激活。我目前有此代码。
活动检测噪声
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;
}
活动一
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秒时才激活它。
有谁能够帮助我?非常感谢你的一切
问题来源:Stack Overflow
start init时间戳为空,您可以从第一个振幅获取记录的时间戳,如果声音在检测过程中消失,则可以将时间戳重置为空,如果声音持续存在,则将保留第一个记录的时间戳您只需要确定时间戳和时间戳记录即可获得减法判断声音持续时间
回答来源:Stack Overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。