2013-02-21 52 views
-2

如何从用户语音中检测振幅? 只需检测用户是否说话。 AudioRecorder,MediaRecorder,Audio Capture有什么区别? 请给我一个充分的解释和代码,请从用户语音中获取振幅

我试图从这个教程类,但它的主要错误在“mRecorder.prepare():”

import android.media.MediaRecorder; 

public class SoundMeter { 
    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.prepare(); 
       mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
       mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
       mRecorder.setOutputFile("/dev/null"); 

       mRecorder.start(); 
       mEMA = 0.0; 
      } 
    } 

    public void stop() { 
      if (mRecorder != null) { 
        mRecorder.stop();  
        mRecorder.release(); 
        mRecorder = null; 
      } 
    } 

    public double getAmplitude() { 
      if (mRecorder != null) 
        return (mRecorder.getMaxAmplitude()/2700.0); 
      else 
        return 0; 

    } 

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

}

更新我的第二次尝试

 public class MainActivity extends Activity { 


static final private double EMA_FILTER = 0.6; 
private MediaRecorder mRecorder = null; 
private double mEMA = 0.0; 
TextView tv; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 


     mRecorder = new MediaRecorder(); 
     mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 

     mRecorder.start(); 
     mEMA = 0.0; 


    tv = (TextView) findViewById(R.id.textView1); 
    double a = getAmplitude(); 
    tv.setText(String.valueOf(a)); 
    new Timer().schedule(new TimerTask() { 

     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      down(); 
     } 
    }, 500, 10); 

} 
public void down() { 
    this.runOnUiThread(Update); 
} 
private Runnable Update=new Runnable() { 

    @Override 
    public void run() { 
     // TODO Auto-generated method stub 
     double a = getAmplitude(); 
     tv.setText(String.valueOf(a)); 
    } 
}; 


@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.activity_main, menu); 
    return true; 
} 
public double getAmplitude() { 
     if (mRecorder != null) 
       return (mRecorder.getMaxAmplitude()); 
     else 
       return 0; 

}}

+0

这就是我的代码,但它不工作 – 2013-02-21 05:52:47

回答

1

几件事情:

  1. 需要的准备()语句之前设置输出格式。从documentation准备():抛出IllegalStateException如果start()后或之前setOutputFormat()

  2. MediaRecorder.prepare(所谓的)也抛出IOException异常。你可能想用try/catch结构来包围prepare()。

尝试:

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

     mRecorder.prepare(); 
     mRecorder.start(); 
     mEMA = 0.0; 
    } 
    catch (IOException e) { 
     //do something with e 
    } 
} 
+0

我有一个错误,而调试此,“未找到源”,为什么呢? – 2013-02-21 09:21:05

+0

不确定。哪一行? (愚蠢的问题)你有麦克风吗? – mcalex 2013-02-21 09:24:11

+0

麦克风?我在Android设备上进行调试。 我只需要检测用户的说话与否,仍然需要设置音频导航,格式,编码器? – 2013-02-21 09:28:28