Talking App wie reden Tom, Audio Recording nicht auf allen Geräten arbeiten

Ich entwickle eine Anwendung wie reden Tom, alles ist gut funktioniert nur die Audio-Aufnahme macht Probleme auf einigen Geräten, Audio funktioniert auch gut auf meinem hdpi Gerät aber wann immer ich es auf samsung tab 7 oder tab 10 oder ein anderes Telefon, Auf einigen Geräten, die es ständig hört das Audio und auf einigen Geräten nicht zu hören, ich bin mit folgenden Code für Audio-Aufnahme.

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(); } } } 

  • Wie kann ich Stimme und Aufzeichnung aufrufen?
  • Android erkennt Stimme von 2 Personen anders
  • Die Spracherkennung funktioniert nicht, wenn die Stimme aufgenommen wird
  • 3 Solutions collect form web for “Talking App wie reden Tom, Audio Recording nicht auf allen Geräten arbeiten”

    Wenn du eine beliebige Sample-Rate auf ein Gerät zwibst, das es nicht unterstützt, wirst du Schwierigkeiten haben.

    Ich schlage vor, dass Sie eine gültige Sample-Rate für das laufende Gerät überprüfen und anstatt hartcodieren es auf 44.1Khz).

    Schauen Sie sich hier einige Hinweise an, wie Sie die verfügbaren Sample-Raten überprüfen können .

    Setzen Sie diesen Code, um zu überprüfen, ob das Samplerat und das Audioformat in Ihrem Gerät unterstützt werden. Überprüfen Sie die Kombination und sehen Sie, welche für Sie arbeitet

     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); } } } } 

    Der Code überprüft nicht wirklich auf Fehlerfälle, die es viel schwieriger machen, herauszufinden, was auf diesen Geräten falsch läuft. Bitte folgendes tun:

    1. Nicht im Zusammenhang mit der Aufnahme (aber die Wiedergabe), aber es ist besser, wenn man sich um den AudioFocus kümmert .. es könnte verloren gehen und etc. Alles, was Sie wissen müssen, ist hier http://developer.android.com/training/managing- Audio / audio-focus.html
    2. Hinzufügen von Anrufen zu AudioRecord.getState (), um den Status zu überprüfen
    3. Hinzufügen von Anrufen zu AudioRecord.getRecordingState (), um den Aufzeichnungsstatus zu überprüfen
    4. In getMinBufferSize müssen Sie gegen ERROR_BAD_VALUE überprüfen
    5. In den gelesenen Anrufen müssen Sie sich gegen ERROR_INVALID_OPERATION und ERROR_BAD_VALUE überprüfen
    6. Sie können setRecordPositionUpdateListener verwenden, um zu ermitteln, ob die Aufnahme fortgeschritten ist.

    Diese Schritte + Beobachtung der System-Logcat wird Sie in einen viel besseren Ort, um das Problem zu ermitteln oder geben Sie uns mit der Info, um das Problem zu lösen

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.