Reconnaissance sonore en Android

je veux que mon application Android reconnaisse le son. Par exemple, je veux savoir si le son du microphone est un claquement ou un coup ou quelque chose d'autre.

dois-je utiliser les mathématiques, ou Puis-je utiliser une bibliothèque pour cela?

S'il y a des bibliothèques pour l'analyse du son, faites-le moi savoir. Grâce.

9
demandé sur Elephant 2011-12-15 21:29:03

4 réponses

Musicg Bibliothèque est utile pour la détection de sifflet. En ce qui concerne les claps, Je ne recommande pas de l'utiliser, car il réagit à chaque son fort (même la parole).

Pour applaudir et d'autres sons de percussion de détection je vous recommande TarsosDSP . Il a une API simple avec une fonctionnalité riche (détection de pitch et ainsi de suite). Pour la détection clap, vous pouvez utiliser quelque chose comme (si vous utilisez 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();

vous pouvez régler votre détecteur en ajustant la sensibilité (0-100) et le seuil (0-20).

bonne chance!

11
répondu Andrei Buneyeu 2015-06-24 10:07:49

Il ya une Api qui fonctionne très bien pour vos besoins à mon avis.

http://code.google.com/p/musicg /

Bonne Chance!!!

4
répondu Ana Llera 2012-12-25 15:01:13

vous n'avez pas besoin de maths et vous n'avez pas besoin D'AudioRecord. Il suffit de vérifier MediaRecorder.getMaxAmplitude () toutes les 1000 millisecondes.

ce code et ce code pourrait être utile.

voici quelques codes dont vous aurez besoin.

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;
    }
}
2
répondu gregm 2012-11-01 09:54:19

je me rends compte que c'est un an, mais je suis tombé dessus. Je suis à peu près sûr que la reconnaissance sonore de domaine ouvert n'est pas un problème résolu. Donc, non, vous n'allez pas trouver toute sorte de bibliothèque pour faire ce que vous voulez sur Android, parce que ce code n'existe pas partout. Si vous choisissez un domaine restreint, vous pourriez former un classificateur pour reconnaître les types de sons qui vous intéressent, mais cela nécessiterait beaucoup de mathématiques, et beaucoup d'exemples de chacun des sons potentiels. Il serait vraiment cool si la bibliothèque vous vouliez existé, mais autant que je sache, la technologie n'est pas encore là.

1
répondu mattg 2012-12-03 00:24:19