Android中的声音识别
Posted
技术标签:
【中文标题】Android中的声音识别【英文标题】:Sound recognition in Android 【发布时间】:2011-12-15 17:29:03 【问题描述】:我希望我的 android 应用能够识别声音。例如,我想知道麦克风发出的声音是拍手声还是敲门声或其他声音。
我是否需要使用数学,或者我可以只使用一些库吗?
如果有任何用于声音分析的库,请告诉我。谢谢。
【问题讨论】:
查看这篇文章:***.com/questions/2257075/… 是的,我读过 AudioRecord 类。此类的方法 Read() 返回原始数据,需要使用数学进行分析。但我想问是否有一些第三方 API 可以在没有数学的情况下分析声音? 【参考方案1】:Musicg 库对于哨声检测很有用。关于拍手,我不建议使用它,因为它会对每一个响亮的声音(甚至是语音)做出反应。
对于拍手和其他敲击声检测,我推荐TarsosDSP。它有一个简单的 API,具有丰富的功能(音高检测等)。对于拍手检测,您可以使用类似的东西(如果您使用 TarsosDSPAndroid-v3):
MicrophoneAudioDispatcher mDispatcher = new MicrophoneAudioDispatcher((int) SAMPLE_RATE, BUFFER_SIZE, BUFFER_OVERLAP);
double threshold = 8;
double sensitivity = 20;
mPercussionDetector = new PercussionOnsetDetector(22050, 1024,
new OnsetHandler()
@Override
public void handleOnset(double time, double salience)
Log.d(TAG, "Clap detected!");
, sensitivity, threshold);
mDispatcher.addAudioProcessor(mPercussionDetector);
new Thread(mDispatcher).start();
您可以通过调整灵敏度 (0-100) 和阈值 (0-20) 来调整检测器。
祝你好运!
【讨论】:
我无法使用这个来检测拍手声。它只会检测到口哨声……你能帮帮我吗?我想检测拍手声、口哨声以及弹指声。 @ArpitPatel 您是否成功检测到musicg api中的哨声?我收到错误。请支持我***.com/questions/37925382/… 我可以得到满足以下要求的库android.stackexchange.com/questions/237271/…【参考方案2】:在我看来,有一个 Api 可以很好地满足您的需求。
http://code.google.com/p/musicg/
祝你好运!!!
【讨论】:
【参考方案3】:您不需要数学,也不需要 AudioRecord。只需每 1000 毫秒检查一次 MediaRecorder.getMaxAmplitude()。
this code 和 this code 可能会有所帮助。
这是您需要的一些代码。
public class Clapper
private static final String TAG = "Clapper";
private static final long DEFAULT_CLIP_TIME = 1000;
private long clipTime = DEFAULT_CLIP_TIME;
private AmplitudeClipListener clipListener;
private boolean continueRecording;
/**
* how much louder is required to hear a clap 10000, 18000, 25000 are good
* values
*/
private int amplitudeThreshold;
/**
* requires a little of noise by the user to trigger, background noise may
* trigger it
*/
public static final int AMPLITUDE_DIFF_LOW = 10000;
public static final int AMPLITUDE_DIFF_MED = 18000;
/**
* requires a lot of noise by the user to trigger. background noise isn't
* likely to be this loud
*/
public static final int AMPLITUDE_DIFF_HIGH = 25000;
private static final int DEFAULT_AMPLITUDE_DIFF = AMPLITUDE_DIFF_MED;
private MediaRecorder recorder;
private String tmpAudioFile;
public Clapper() throws IOException
this(DEFAULT_CLIP_TIME, "/tmp.3gp", DEFAULT_AMPLITUDE_DIFF, null, null);
public Clapper(long snipTime, String tmpAudioFile,
int amplitudeDifference, Context context, AmplitudeClipListener clipListener)
throws IOException
this.clipTime = snipTime;
this.clipListener = clipListener;
this.amplitudeThreshold = amplitudeDifference;
this.tmpAudioFile = tmpAudioFile;
public boolean recordClap()
Log.d(TAG, "record clap");
boolean clapDetected = false;
try
recorder = AudioUtil.prepareRecorder(tmpAudioFile);
catch (IOException io)
Log.d(TAG, "failed to prepare recorder ", io);
throw new RecordingFailedException("failed to create recorder", io);
recorder.start();
int startAmplitude = recorder.getMaxAmplitude();
Log.d(TAG, "starting amplitude: " + startAmplitude);
do
Log.d(TAG, "waiting while recording...");
waitSome();
int finishAmplitude = recorder.getMaxAmplitude();
if (clipListener != null)
clipListener.heard(finishAmplitude);
int ampDifference = finishAmplitude - startAmplitude;
if (ampDifference >= amplitudeThreshold)
Log.d(TAG, "heard a clap!");
clapDetected = true;
Log.d(TAG, "finishing amplitude: " + finishAmplitude + " diff: "
+ ampDifference);
while (continueRecording || !clapDetected);
Log.d(TAG, "stopped recording");
done();
return clapDetected;
private void waitSome()
try
// wait a while
Thread.sleep(clipTime);
catch (InterruptedException e)
Log.d(TAG, "interrupted");
/**
* need to call this when completely done with recording
*/
public void done()
Log.d(TAG, "stop recording");
if (recorder != null)
if (isRecording())
stopRecording();
//now stop the media player
recorder.stop();
recorder.release();
public boolean isRecording()
return continueRecording;
public void stopRecording()
continueRecording = false;
【讨论】:
您示例中的代码将对任何响亮的声音(不仅是鼓掌声)做出反应。它无法识别声音的本质。我说的对吗? Correct 此代码将仅根据阈值识别响亮与非响亮的噪音。它非常简单,但对许多应用程序都很有用【参考方案4】:我意识到这是一岁了,但我偶然发现了它。我很确定一般的开放域声音识别不是一个已解决的问题。所以,不,你不会在 Android 上找到任何类型的库来做你想做的事,因为这样的代码在任何地方都不存在。如果你选择一些受限领域,你可以训练一个分类器来识别你感兴趣的声音种类,但这需要大量的数学运算,以及每种潜在声音的大量示例。如果你想要的库存在,那就太酷了,但据我所知,技术还不存在。
【讨论】:
以上是关于Android中的声音识别的主要内容,如果未能解决你的问题,请参考以下文章