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(); } } }
- Tono DTMF en RecognitionListener.onReadyForSpeech () confundido con el discurso
- API de reconocimiento de voz sin conexión en Android 4.2
- ¿Hay alguna manera de detectar si un teléfono Android es compatible con la integración de Voicemail en el registro de llamadas?
- ¿Inicia Google Now o la búsqueda por voz por defecto del teléfono?
- ¿Cómo puede hacer que el reconocimiento de voz del soporte para el emulador android
- Android mediaRecorder.setAudioSource ha fallado
- ¿Puede alguien dar código para la grabadora de voz como una aplicación en el teléfono Android?
- Aplicación para Android con direcciones de voz GPS
- Cómo manejar ERROR_RECOGNIZER_BUSY
- ¿Cómo convertir el habla al texto durante la llamada con diferentes colores de texto para el llamante y el receptor de llamadas?
- Guardar la entrada de audio del motor de reconocimiento de voz de Android Stock
- Biometría de voz para Android
- Comparar voz wav en android o etiqueta de voz (comandos de voz) API
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:
- 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
- Agregue llamadas a AudioRecord.getState () para verificar el estado
- Agregar llamadas a AudioRecord.getRecordingState () para verificar el estado de grabación
- En getMinBufferSize debes comprobar contra ERROR_BAD_VALUE
- En las llamadas de lectura debe comprobar contra ERROR_INVALID_OPERATION y ERROR_BAD_VALUE
- 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
- Actualizar la actividad de la fuente antes de la transición de salida
- Android USSD que sim recibe un mensaje ussd o que sim slot recibe un mensaje ussd (teléfono dual sim)