2011-08-23 19 views
5

Sto cercando di imparare lo sviluppo di Android e mi chiedevo come posso acquisire l'audio da un microfono e poi cambiare la voce nell'audio in modo che suoni più spesso o più nitida, ecc. In breve: Come faccio a registrare e modificare i parametri di un suono? (In Java, ovviamente)Come registrare audio su Android e modificare il tono?

risposta

5

Attualmente sto lavorando su un android app that involves audio. La registrazione dell'audio è la parte più semplice e puoi principalmente copiare il mio codice per quello. Scrivere un filtro audio è un compito molto più difficile, e richiede la conoscenza di elaborazione del segnale digitale e la Fast Fourier Transform (FFT)

Si potrebbe iniziare con la lettura su audio processing in java here.

Nel frattempo, ecco il codice per registrare l'audio su Android:

public String record() { 

       // please note: the emulator only supports 8 khz sampling. 
       // so in test mode, you need to change this to 
       //int frequency = 8000; 

       int frequency = 11025; 

       int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO; 
       int audioEncoding = AudioFormat.ENCODING_PCM_16BIT; 
       File file = new File(Environment.getExternalStorageDirectory() 
           .getAbsolutePath() + "/reverseme.pcm"); 

       // Delete any previous recording. 
       if (file.exists()) 
         file.delete(); 

       // Create the new file. 
       try { 
         file.createNewFile(); 
       } catch (IOException e) { 
         throw new IllegalStateException("Failed to create " 
             + file.toString()); 
       } 

       try { 
         // Create a DataOuputStream to write the audio data into the saved 
         // file. 
         OutputStream os = new FileOutputStream(file); 
         BufferedOutputStream bos = new BufferedOutputStream(os); 
         DataOutputStream dos = new DataOutputStream(bos); 

         // Create a new AudioRecord object to record the audio. 
         int bufferSize = 2 * AudioRecord.getMinBufferSize(frequency, 
             channelConfiguration, audioEncoding); 
         AudioRecord audioRecord = new AudioRecord(
             MediaRecorder.AudioSource.MIC, frequency, 
             channelConfiguration, audioEncoding, bufferSize); 

         short[] buffer = new short[bufferSize]; 
         audioRecord.startRecording(); 

         Log.e(tag, "Recording started"); 

         long start = SystemClock.elapsedRealtime(); 
         long end = start + 15000; 
         while (SystemClock.elapsedRealtime() < end) { 
           int bufferReadResult = audioRecord.read(buffer, 0, bufferSize); 
           for (int i = 0; i < bufferReadResult; i++) 

             if (ByteOrder.nativeOrder().equals(ByteOrder.LITTLE_ENDIAN)) { 
               dos.writeShort(EndianUtils.swapShort(buffer[i]));             
             } else { 
               dos.writeShort(buffer[i]);                 
             } 
         } 

         Log.e(tag, "Recording stopped"); 

         audioRecord.stop(); 
         bos.flush(); 
         dos.close(); 
         isRecording = false; 
         return file.getAbsolutePath(); 

       } catch (Exception e) { 
         Log.e(tag, "Recording Failed:" + e.getMessage()); 
         throw new RuntimeException("Failed to create " + e.getMessage()); 

       } 
     } 
0

È possibile utilizzare Android SoundPool per ritagliare il tono del file audio per verificare le risposte della domanda THIS.

E per registrare l'audio quando qualcuno parla vicino a MIC, controllare questo LINK.

Problemi correlati