Talking App como hablar, la grabación de audio no funcionó en todos los dispositivos

Estoy desarrollando una aplicación como hablar tom, todo está funcionando bien sólo la grabación de audio haciendo problemas en algunos dispositivos, Audio también está funcionando bien en mi dispositivo hdpi, pero siempre que lo ejecute en samsung tab 7 o ficha 10 o cualquier otro teléfono, En algunos dispositivos su escuchar continuamente el audio y en algunos dispositivos no escuchan en absoluto, estoy usando código siguiente para la grabación audio.

private int RECORDER_CHANNELS = AudioFormat.CHANNEL_CONFIGURATION_MONO; private int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT; private int RECORDER_SAMPLERATE = 44100; private byte RECORDER_BPP = (byte) 16; private AudioRecord audioRecorder; private int detectVoice= 350; public class analyzeAudio extends AsyncTask<Void, Void, Void> { @Override protected void onPreExecute() { Log.e("Play", "on Pre"); } @Override protected Void doInBackground(Void... voids) { try { // Get the minimum buffer size required for the successful creation of an AudioRecord object. int bufferSizeInBytes = AudioRecord.getMinBufferSize(RECORDER_SAMPLERATE, RECORDER_CHANNELS, RECORDER_AUDIO_ENCODING); bufferSizeInBytes = AudioRecord.getMinBufferSize(RECORDER_SAMPLERATE, AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_PCM_16BIT); // Initialize Audio Recorder. audioRecorder = new AudioRecord(MediaRecorder.AudioSource.MIC, RECORDER_SAMPLERATE, RECORDER_CHANNELS, RECORDER_AUDIO_ENCODING, bufferSizeInBytes); // Start Recording. audioRecorder.startRecording(); int numberOfReadBytes = 0; byte audioBuffer[] = new byte[bufferSizeInBytes]; boolean recording = false; float tempFloatBuffer[] = new float[3]; int tempIndex = 0; int totalReadBytes = 0; byte totalByteBuffer[] = new byte[60 * 44100 * 2]; // While data come from microphone. boolean isListening = true; while (true) { float totalAbsValue = 0.0f; short sample = 0; numberOfReadBytes = audioRecorder.read(audioBuffer, 0, bufferSizeInBytes); // Analyze Sound. for (int i = 0; i < bufferSizeInBytes; i += 2) { sample = (short) ((audioBuffer[i]) | audioBuffer[i + 1] << 8); totalAbsValue += Math.abs(sample) / (numberOfReadBytes / 2); } // Analyze temp buffer. tempFloatBuffer[tempIndex % 3] = totalAbsValue; float temp = 0.0f; for (int i = 0; i < 3; ++i) temp += tempFloatBuffer[i]; if ((temp >= 0 && temp <= detectVoice) && recording == false) { Log.i("TAG", "1"); tempIndex++; continue; } if (temp > detectVoice && recording == false) { Log.i("TAG", "2"); if (isPlaying) { audioRecorder.release(); break; } recording = true; if (isListening) { finishIdleAnimation(); isListening = false; isPlaying = true; currentAnimationId = Constants.animHearout; _index = 0; if (_timer != null) { _timer.cancel(); } _timer = new Timer(); _timer.schedule(new TickClass(), 7, dealyTime(7, 1)); } else { Log.e("Caceling", "Yes + isPlaying" + isPlaying); new analyzeAudio().cancel(true); } } if ((temp >= 0 && temp <= detectVoice) && recording == true) { Log.i("TAG", "Save audio to file."); // Save audio to file. String filepath = Environment.getExternalStorageDirectory().getPath(); File file = new File(filepath, "AudioRecorder"); if (!file.exists()) file.mkdirs(); String fn = file.getAbsolutePath() + "/" + "temp" + ".wav"; long totalAudioLen = 0; long totalDataLen = totalAudioLen + 36; long longSampleRate = RECORDER_SAMPLERATE; int channels = 1; long byteRate = RECORDER_BPP * RECORDER_SAMPLERATE * channels / 8; totalAudioLen = totalReadBytes; totalDataLen = totalAudioLen + 36; byte finalBuffer[] = new byte[totalReadBytes + 44]; finalBuffer[0] = 'R'; // RIFF/WAVE header finalBuffer[1] = 'I'; finalBuffer[2] = 'F'; finalBuffer[3] = 'F'; finalBuffer[4] = (byte) (totalDataLen & 0xff); finalBuffer[5] = (byte) ((totalDataLen >> 8) & 0xff); finalBuffer[6] = (byte) ((totalDataLen >> 16) & 0xff); finalBuffer[7] = (byte) ((totalDataLen >> 24) & 0xff); finalBuffer[8] = 'W'; finalBuffer[9] = 'A'; finalBuffer[10] = 'V'; finalBuffer[11] = 'E'; finalBuffer[12] = 'f'; // 'fmt ' chunk finalBuffer[13] = 'm'; finalBuffer[14] = 't'; finalBuffer[15] = ' '; finalBuffer[16] = 16; // 4 bytes: size of 'fmt ' chunk finalBuffer[17] = 0; finalBuffer[18] = 0; finalBuffer[19] = 0; finalBuffer[20] = 1; // format = 1 finalBuffer[21] = 0; finalBuffer[22] = (byte) channels; finalBuffer[23] = 0; finalBuffer[24] = (byte) (longSampleRate & 0xff); finalBuffer[25] = (byte) ((longSampleRate >> 8) & 0xff); finalBuffer[26] = (byte) ((longSampleRate >> 16) & 0xff); finalBuffer[27] = (byte) ((longSampleRate >> 24) & 0xff); finalBuffer[28] = (byte) (byteRate & 0xff); finalBuffer[29] = (byte) ((byteRate >> 8) & 0xff); finalBuffer[30] = (byte) ((byteRate >> 16) & 0xff); finalBuffer[31] = (byte) ((byteRate >> 24) & 0xff); finalBuffer[32] = (byte) (2 * 16 / 8); // block align finalBuffer[33] = 0; finalBuffer[34] = RECORDER_BPP; // bits per sample finalBuffer[35] = 0; finalBuffer[36] = 'd'; finalBuffer[37] = 'a'; finalBuffer[38] = 't'; finalBuffer[39] = 'a'; finalBuffer[40] = (byte) (totalAudioLen & 0xff); finalBuffer[41] = (byte) ((totalAudioLen >> 8) & 0xff); finalBuffer[42] = (byte) ((totalAudioLen >> 16) & 0xff); finalBuffer[43] = (byte) ((totalAudioLen >> 24) & 0xff); for (int i = 0; i < totalReadBytes; ++i) finalBuffer[44 + i] = totalByteBuffer[i]; FileOutputStream out; try { out = new FileOutputStream(fn); try { out.write(finalBuffer); out.close(); isRecorded = true; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (FileNotFoundException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } tempIndex++; break; } // -> Recording sound here. Log.i("TAG", "Recording Sound."); for (int i = 0; i < numberOfReadBytes; i++) totalByteBuffer[totalReadBytes + i] = audioBuffer[i]; totalReadBytes += numberOfReadBytes; tempIndex++; } }catch (Exception e){ e.printStackTrace(); } return null; } @Override protected void onPostExecute(Void aVoid) { Log.e("Play", "on POst"); if (isRecorded) { currentAnimationId = Constants.animHearoutend; _index = 8; if (_timer != null) { _timer.cancel(); } _timer = new Timer(); _timer.schedule(new TickClass(), 4, dealyTime(4, 1)); playFromSdCard(); } } } 

Si fuerza una tasa de muestreo arbitraria en un dispositivo que no lo soporta, va a tener problemas.

Le sugiero que compruebe y establezca una tasa de muestreo válida para el dispositivo en ejecución (en lugar de codificarlo de forma fija a 44.1Khz).

Echa un vistazo aquí para algunos consejos sobre cómo comprobar las tasas de muestra disponibles .

Ponga este código para comprobar si el samplerate y el formato de audio son compatibles en su dispositivo. Compruebe la combinación y vea cuál está funcionando para usted

 private static int[] mSampleRates = new int[] { 8000, 11025, 22050, 44100 }; for (int rate : mSampleRates) { for (short audioFormat : new short[] { AudioFormat.ENCODING_PCM_8BIT,AudioFormat.ENCODING_PCM_16BIT }) { for (short channelConfig : new short[] { AudioFormat.CHANNEL_IN_MONO, AudioFormat.CHANNEL_IN_STEREO }) { try { Log.d(TAG, "Attempting rate " + rate + "Hz, bits: " + audioFormat + ", channel: " + channelConfig); int bufferSize = AudioRecord.getMinBufferSize(rate, channelConfig, audioFormat); if (bufferSize != AudioRecord.ERROR_BAD_VALUE) { Log.d(TAG, "Found rate " + rate + "Hz, bits: " + audioFormat + ", channel: " + channelConfig); Log.d(TAG, "Attempting rate " + rate + "Hz, bits: " + audioFormat + ", channel: " + channelConfig +" supported"); } } catch (Exception e) { Log.e(TAG, rate + "Exception, keep trying.",e); } } } } 

El código no comprueba realmente los casos de error lo que hace mucho más difícil averiguar qué está pasando mal en esos dispositivos. Haga lo siguiente:

  1. No está relacionado con la grabación (pero la reproducción), pero es mejor si usted cuida de la AudioFocus .. puede ser perdido y etc Todo lo que necesita saber es aquí http://developer.android.com/training/managing- Audio / audio-focus.html
  2. Agregue llamadas a AudioRecord.getState () para verificar el estado
  3. Agregar llamadas a AudioRecord.getRecordingState () para verificar el estado de grabación
  4. En getMinBufferSize debes comprobar contra ERROR_BAD_VALUE
  5. En las llamadas de lectura debe comprobar contra ERROR_INVALID_OPERATION y ERROR_BAD_VALUE
  6. Puede usar setRecordPositionUpdateListener para indicar si la grabación ha progresado.

Estos pasos + observar el logcat del sistema le pondrá en un lugar mucho mejor para señalar el problema o nos proporcionará la información para resolver el problema

  • El reconocimiento de voz no funciona cuando la voz está bajo grabación
  • ¿Es posible interceptar datos de voz durante la llamada?
  • Google Glass: Iniciar una actividad con "Ok Glass, Command"
  • Cómo desarrollar aplicaciones de reconocimiento de voz como tom de conversación
  • Birmana discurso a la conversión de texto en android?
  • Reconocimiento de voz en Android con clip de sonido grabado?
  • Reconocimiento de voz fuera de línea
  • Limitación del diccionario de reconocimiento de voz para una mejor coincidencia y buena precisión
  • Cómo construir BufferReceived () para capturar la voz usando RecognizerIntent?
  • ¿Reconoce RecognitionListener.onError () automáticamente SpeechRecognizer.cancel ()?
  • Android SpeechRecognizer: stopListening () contra cancelar ()
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.