2015-07-05 12 views
5

Sto lavorando a un programma che analizza il tono di un file audio. Mi sono imbattuto in un'ottima API chiamata "TarsosDSP" che offre varie analisi del passo. Tuttavia sto riscontrando un sacco di problemi nel configurarlo. Qualcuno può mostrarmi alcuni suggerimenti rapidi su come usare questa API (in particolare la classe PitchProcessor) per favore? Alcuni frammenti di codice sarebbero estremamente apprezzati perché sono davvero nuovo nell'analisi del suono.TarsosDSP Pitch Analysis for Dummies

Grazie

EDIT: Ho trovato qualche documento a http://husk.eecs.berkeley.edu/courses/cs160-sp14/index.php/Sound_Programming dove ci sono un certo codice di esempio che mostra come impostare il PitchProcessor, ...

int bufferReadResult = mRecorder.read(mBuffer, 0, mBufferSize); 
// (note: this is NOT android.media.AudioFormat) 
be.hogent.tarsos.dsp.AudioFormat mTarsosFormat = new be.hogent.tarsos.dsp.AudioFormat(SAMPLE_RATE, 16, 1, true, false); 
AudioEvent audioEvent = new AudioEvent(mTarsosFormat, bufferReadResult); 
audioEvent.setFloatBufferWithByteBuffer(mBuffer); 
pitchProcessor.process(audioEvent); 

... Sto abbastanza perso, che cosa sono esattamente mBuffer e mBufferSize? Come trovo questi valori? E dove inserisco i miei file audio?

risposta

7

Il flusso di base dell'audio nel framework TarsosDSP è il seguente: il flusso audio in ingresso proveniente da un file audio o un microfono viene letto e tagliato in fotogrammi, ad es. 1024 campioni. Ogni fotogramma viaggia attraverso una pipeline che modifica o analizza (ad esempio l'analisi del passo).

In TarsosDSP il AudioDispatcher è responsabile di tagliare l'audio nei frame. Inoltre avvolge un frame audio in un oggetto AudioEvent. Questo oggetto AudioEvent viene inviato attraverso una catena di AudioProcessors.

Quindi nel codice che hai citato mBuffer è il frame audio, mBufferSize è la dimensione del buffer in campioni. Puoi scegliere tu stesso la dimensione del buffer, ma per il rilevamento del passo 2048 campioni sono ragionevoli.

Per il rilevamento passo si potrebbe fare qualcosa di simile con la libreria TarsosDSP:

PitchDetectionHandler handler = new PitchDetectionHandler() { 
     @Override 
     public void handlePitch(PitchDetectionResult pitchDetectionResult, 
       AudioEvent audioEvent) { 
      System.out.println(audioEvent.getTimeStamp() + " " pitchDetectionResult.getPitch()); 
     } 
    }; 
    AudioDispatcher adp = AudioDispatcherFactory.fromDefaultMicrophone(2048, 0); 
    adp.addAudioProcessor(new PitchProcessor(PitchEstimationAlgorithm.YIN, 44100, 2048, handler)); 
    adp.run(); 

In questo codice viene creato per primo un gestore che stampa semplicemente il campo rilevato. Lo AudioDispatcher è collegato al microfono predefinito e ha un buffer di 2048. Un processore audio che rileva il tono viene aggiunto allo AudioDispatcher. Il gestore viene utilizzato anche lì.

L'ultima riga avvia il processo.

+0

Grazie mille signore! – STELLARWIND

+0

Grazie a @Joren apprezzo molto il lavoro che hai fatto su Tarsos. Come testa agli altri, a System.out.println() manca un "+" e avevo bisogno di aggiungere una frequenza di campionamento come primo argomento a .fromDefaultMicrophone() – Sam