title: How to convert or record .wav file in 16khz 16bit mono little-endian?
body: <p>I am just implementing sphinx4 speech recognition in java. What I need is how to record sound or convert any sound .wave file into 16khz 16bit mono little-endian file.</p>
  <p>had to search a lot for this..but no specific guidance I have got. hope anyone from the stack overflow family can help me out or give me proper guidance in that.
  1).
  I need to just record audio in android with the 16khz 16bit mono little-endian file format in a wave file
  or
  2).
  I need to convert the prerecorded file with any sampling rate with the 16khz 16bit mono little-endian format in java.</p>
  <p>I need to implement one of the above features..so can anyone help me out fr this...thanks in advance</p>
  <p>with the first option, I had created wav file with the above-stated configuration with the following code in android.</p>
  <pre><code>package com.varma.samples.audiorecorder;
  
  import java.io.File;
  import java.io.FileInputStream;
  import java.io.FileNotFoundException;
  import java.io.FileOutputStream;
  import java.io.IOException;
  
  import android.annotation.SuppressLint;
  import android.app.Activity;
  import android.media.AudioFormat;
  import android.media.AudioRecord;
  import android.media.MediaRecorder;
  import android.os.Bundle;
  import android.os.Environment;
  import android.view.View;
  import android.widget.Button;
  
  public class RecorderActivity extends Activity {
      private static final int RECORDER_BPP =16;
      private static final String AUDIO_RECORDER_FILE_EXT_WAV = &quot;.wav&quot;;
      private static final String AUDIO_RECORDER_FOLDER = &quot;AudioRecorder&quot;;
      private static final String AUDIO_RECORDER_TEMP_FILE = &quot;record_temp.raw&quot;;
      private static final int RECORDER_SAMPLERATE = 16000;
      private static final int RECORDER_CHANNELS = AudioFormat.CHANNEL_CONFIGURATION_MONO;
      private static final int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT;
      
      private AudioRecord recorder = null;
      private int bufferSize = 0;
      private Thread recordingThread = null;
      private boolean isRecording = false;
      
      @SuppressLint(&quot;NewApi&quot;)
      @Override
      public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.main);
          
          setButtonHandlers();
          enableButtons(false);
          
          bufferSize = AudioRecord.getMinBufferSize(RECORDER_SAMPLERATE,RECORDER_CHANNELS,RECORDER_AUDIO_ENCODING);
      }
  
      private void setButtonHandlers() {
          ((Button)findViewById(R.id.btnStart)).setOnClickListener(btnClick);
          ((Button)findViewById(R.id.btnStop)).setOnClickListener(btnClick);
      }
      
      private void enableButton(int id,boolean isEnable){
          ((Button)findViewById(id)).setEnabled(isEnable);
      }
      
      private void enableButtons(boolean isRecording) {
          enableButton(R.id.btnStart,!isRecording);
          enableButton(R.id.btnStop,isRecording);
      }
      
      private String getFilename(){
          String filepath = Environment.getExternalStorageDirectory().getPath();
          File file = new File(filepath,AUDIO_RECORDER_FOLDER);
          
          if(!file.exists()){
              file.mkdirs();
          }
          
          return (file.getAbsolutePath() + &quot;/&quot; + System.currentTimeMillis() + AUDIO_RECORDER_FILE_EXT_WAV);
      }
      
      private String getTempFilename(){
          String filepath = Environment.getExternalStorageDirectory().getPath();
          File file = new File(filepath,AUDIO_RECORDER_FOLDER);
          
          if(!file.exists()){
              file.mkdirs();
          }
          
          File tempFile = new File(filepath,AUDIO_RECORDER_TEMP_FILE);
          
          if(tempFile.exists())
              tempFile.delete();
          
          return (file.getAbsolutePath() + &quot;/&quot; + AUDIO_RECORDER_TEMP_FILE);
      }
      
      @SuppressLint({ &quot;NewApi&quot;, &quot;NewApi&quot; })
      private void startRecording(){
          recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,
                          RECORDER_SAMPLERATE, RECORDER_CHANNELS,RECORDER_AUDIO_ENCODING, bufferSize);
          
          recorder.startRecording();
          
          isRecording = true;
          
          recordingThread = new Thread(new Runnable() {
              
              @Override
              public void run() {
                  writeAudioDataToFile();
              }
          },&quot;AudioRecorder Thread&quot;);
          
          recordingThread.start();
      }
      
      @SuppressLint({ &quot;NewApi&quot;, &quot;NewApi&quot;, &quot;NewApi&quot; })
      private void writeAudioDataToFile(){
          byte data[] = new byte[bufferSize];
          String filename = getTempFilename();
          FileOutputStream os = null;
          
          try {
              os = new FileOutputStream(filename);
          } catch (FileNotFoundException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
          }
          
          int read = 0;
          
          if(null != os){
              while(isRecording){
                  read = recorder.read(data, 0, bufferSize);
                  
                  if(AudioRecord.ERROR_INVALID_OPERATION != read){
                      try {
                          os.write(data);
                      } catch (IOException e) {
                          e.printStackTrace();
                      }
                  }
              }
              
              try {
                  os.close();
              } catch (IOException e) {
                  e.printStackTrace();
              }
          }
      }
      
      @SuppressLint({ &quot;NewApi&quot;, &quot;NewApi&quot; })
      private void stopRecording(){
          if(null != recorder){
              isRecording = false;
              
              recorder.stop();
              recorder.release();
              
              recorder = null;
              recordingThread = null;
          }
          
          copyWaveFile(getTempFilename(),getFilename());
          deleteTempFile();
      }
  
      private void deleteTempFile() {
          File file = new File(getTempFilename());
          
          file.delete();
      }
      
      private void copyWaveFile(String inFilename,String outFilename){
          FileInputStream in = null;
          FileOutputStream out = null;
          long totalAudioLen = 0;
          long totalDataLen = totalAudioLen + 36;
          long longSampleRate = 16000;
          int channels = 1;
          //long byteRate = RECORDER_BPP * RECORDER_SAMPLERATE * channels/8;
          long byteRate = 256;
          
          byte[] data = new byte[bufferSize];
                  
          try {
              in = new FileInputStream(inFilename);
              out = new FileOutputStream(outFilename);
              totalAudioLen = in.getChannel().size();
              totalDataLen = totalAudioLen + 36;
              
              AppLog.logString(&quot;File size: &quot; + totalDataLen);
              
              WriteWaveFileHeader(out, totalAudioLen, totalDataLen,
                      longSampleRate, channels, byteRate);
              
              while(in.read(data) != -1){
                  out.write(data);
              }
              
              in.close();
              out.close();
          } catch (FileNotFoundException e) {
              e.printStackTrace();
          } catch (IOException e) {
              e.printStackTrace();
          }
      }
  
      private void WriteWaveFileHeader(
              FileOutputStream out, long totalAudioLen,
              long totalDataLen, long longSampleRate, int channels,
              long byteRate) throws IOException {
          
          byte[] header = new byte[44];
          
          header[0] = 'R';  // RIFF/WAVE header
          header[1] = 'I';
          header[2] = 'F';
          header[3] = 'F';
          header[4] = (byte) (totalDataLen &amp; 0xff);
          header[5] = (byte) ((totalDataLen &gt;&gt; 8) &amp; 0xff);
          header[6] = (byte) ((totalDataLen &gt;&gt; 16) &amp; 0xff);
          header[7] = (byte) ((totalDataLen &gt;&gt; 24) &amp; 0xff);
          header[8] = 'W';
          header[9] = 'A';
          header[10] = 'V';
          header[11] = 'E';
          header[12] = 'f';  // 'fmt ' chunk
          header[13] = 'm';
          header[14] = 't';
          header[15] = ' ';
          header[16] = 16;  // 4 bytes: size of 'fmt ' chunk
          header[17] = 0;
          header[18] = 0;
          header[19] = 0;
          header[20] = 1;  // format = 1
          header[21] = 0;
          header[22] = (byte) channels;
          header[23] = 0;
          header[24] = (byte) (longSampleRate &amp; 0xff);
          header[25] = (byte) ((longSampleRate &gt;&gt; 8) &amp; 0xff);
          header[26] = (byte) ((longSampleRate &gt;&gt; 16) &amp; 0xff);
          header[27] = (byte) ((longSampleRate &gt;&gt; 24) &amp; 0xff);
          header[28] = (byte) (byteRate &amp; 0xff);
          header[29] = (byte) ((byteRate &gt;&gt; 8) &amp; 0xff);
          header[30] = (byte) ((byteRate &gt;&gt; 16) &amp; 0xff);
          header[31] = (byte) ((byteRate &gt;&gt; 24) &amp; 0xff);
          header[32] = (byte) (2 * 16 / 8);  // block align
          header[33] = 0;
          header[34] = RECORDER_BPP;  // bits per sample
          header[35] = 0;
          header[36] = 'd';
          header[37] = 'a';
          header[38] = 't';
          header[39] = 'a';
          header[40] = (byte) (totalAudioLen &amp; 0xff);
          header[41] = (byte) ((totalAudioLen &gt;&gt; 8) &amp; 0xff);
          header[42] = (byte) ((totalAudioLen &gt;&gt; 16) &amp; 0xff);
          header[43] = (byte) ((totalAudioLen &gt;&gt; 24) &amp; 0xff);
  
          out.write(header, 0, 44);
      }
      
      private View.OnClickListener btnClick = new View.OnClickListener() {
          @Override
          public void onClick(View v) {
              switch(v.getId()){
                  case R.id.btnStart:{
                      AppLog.logString(&quot;Start Recording&quot;);
                      
                      enableButtons(true);
                      startRecording();
                              
                      break;
                  }
                  case R.id.btnStop:{
                      AppLog.logString(&quot;Start Recording&quot;);
                      
                      enableButtons(false);
                      stopRecording();
                      
                      break;
                  }
              }
          }
      }; 
  }
  </code></pre>