3

RPi3에서 안드로이드에 대한 SDK의 미리보기 2에서 작업 중입니다. 시도한 오디오 레코더는 물론 미디어 레코더에서도 여전히 오디오를 캡처 할 수 없습니다. 나는 연설을 텍스트로 변환하려고 노력하고있다. 일반 SpeechRecognition은 지원되지 않습니다. USB 마이크를 RPi3에 직접 연결하고 헤드폰 MIC를 USB 사운드 카드를 통해 RPi3에 연결했습니다.안드로이드에 음성을 녹음하는 방법

MediaRecorder 코드 :

private void startRecording() { 
    Log.d(TAG, "startRecording...."); 
    mRecorder = new MediaRecorder(); 
    Log.d(TAG, "startRecording: Audio Source"+MediaRecorder.getAudioSourceMax()); 
    mRecorder.setAudioSource(MediaRecorder.AudioSource.UNPROCESSED); 
    mRecorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR); 
    mRecorder.setOutputFile(mFileName); 
    mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); 

    try { 
     mRecorder.prepare(); 
    } catch (IOException e) { 
     Log.e(TAG, "prepare() failed"); 
    } 

    mRecorder.start(); 
} 

private void stopRecording() { 
    // stops the recording activity 
    if (mRecorder != null) { 
     mRecorder.stop(); 
     mRecorder.release(); 
     mRecorder = null; 
    } 
} 

매니페스트 권한 :

<uses-permission android:name="android.permission.RECORD_AUDIO" /> 

오류 : 당신이 방법을 만들어야합니다 그래서 각 장치가 ,, 다른 초기화 설정이있을 수 있습니다

03-09 17:17:38.662 3970 3970 D MainActivity: onCreate 
03-09 17:17:38.668 3970 3970 D MainActivity: startRecording.... 
03-09 17:17:38.672 3970 3970 D MainActivity: startRecording: Audio Source9 
03-09 17:17:38.678 161 161 E AudioSystem: AudioSystem::getInputBufferSize failed sampleRate 8000 format 0x1 channelMask 10 
03-09 17:17:38.678 161 161 E AudioRecord: AudioSystem could not query the input buffer size for sampleRate 8000, format 0x1, channelMask 0x10; status -22 
03-09 17:17:38.678 161 161 E StagefrightRecorder: audio source is not initialized 
03-09 17:17:38.678 3970 3970 E MediaRecorder: start failed: -2147483648 
03-09 17:17:38.680 3970 3970 D AndroidRuntime: Shutting down VM 
03-09 17:17:38.683 3970 3970 E AndroidRuntime: FATAL EXCEPTION: main 
03-09 17:17:38.683 3970 3970 E AndroidRuntime: Process: com.example.androidthings.myproject, PID: 3970 
03-09 17:17:38.683 3970 3970 E AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.androidthings.myproject/com.example.androidthings.myproject.MainActivity}: java.lang.RuntimeException: start failed. 
03-09 17:17:38.683 3970 3970 E AndroidRuntime:  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646) 
03-09 17:17:38.683 3970 3970 E AndroidRuntime:  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) 
03-09 17:17:38.683 3970 3970 E AndroidRuntime:  at android.app.ActivityThread.-wrap12(ActivityThread.java) 
03-09 17:17:38.683 3970 3970 E AndroidRuntime:  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) 
03-09 17:17:38.683 3970 3970 E AndroidRuntime:  at android.os.Handler.dispatchMessage(Handler.java:102) 
03-09 17:17:38.683 3970 3970 E AndroidRuntime:  at android.os.Looper.loop(Looper.java:154) 
03-09 17:17:38.683 3970 3970 E AndroidRuntime:  at android.app.ActivityThread.main(ActivityThread.java:6077) 
03-09 17:17:38.683 3970 3970 E AndroidRuntime:  at java.lang.reflect.Method.invoke(Native Method) 
03-09 17:17:38.683 3970 3970 E AndroidRuntime:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 
03-09 17:17:38.683 3970 3970 E AndroidRuntime:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 
03-09 17:17:38.683 3970 3970 E AndroidRuntime: Caused by: java.lang.RuntimeException: start failed. 
03-09 17:17:38.683 3970 3970 E AndroidRuntime:  at android.media.MediaRecorder.start(Native Method) 
03-09 17:17:38.683 3970 3970 E AndroidRuntime:  at com.example.androidthings.myproject.MainActivity.startRecording(MainActivity.java:181) 
03-09 17:17:38.683 3970 3970 E AndroidRuntime:  at com.example.androidthings.myproject.MainActivity.onCreate(MainActivity.java:63) 
03-09 17:17:38.683 3970 3970 E AndroidRuntime:  at android.app.Activity.performCreate(Activity.java:6662) 
03-09 17:17:38.683 3970 3970 E AndroidRuntime:  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) 
03-09 17:17:38.683 3970 3970 E AndroidRuntime:  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599) 
03-09 17:17:38.683 3970 3970 E AndroidRuntime:  ... 9 more 

답변

0

인코딩 할 수있는 모든 비트 전송률 조합을 반복합니다 ... :

private static int[] mSampleRates = new int[] { 8000, 11025, 22050, 44100 }; 
public AudioRecord findAudioRecord() { 
    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(C.TAG, "Attempting rate " + rate + "Hz, bits: " + audioFormat + ", channel: " 
          + channelConfig); 
        int bufferSize = AudioRecord.getMinBufferSize(rate, channelConfig, audioFormat); 

        if (bufferSize != AudioRecord.ERROR_BAD_VALUE) { 
         // check if we can instantiate and have a success 
         AudioRecord recorder = new AudioRecord(AudioSource.DEFAULT, rate, channelConfig, audioFormat, bufferSize); 

         if (recorder.getState() == AudioRecord.STATE_INITIALIZED) 
          return recorder; 
        } 
       } catch (Exception e) { 
        Log.e(C.TAG, rate + "Exception, keep trying.",e); 
       } 
      } 
     } 
    } 
    return null; 
} 

AudioRecord recorder = findAudioRecord(); 
recorder.release(); 
+0

이렇게하면 NULL이되는 모든 조합에 대해 잘못된 버퍼 크기가됩니다. AudioRecorder –

2

쉬운 부분부터 시작하겠습니다. 현재 미리보기에서는 음성 인식 서비스를 사용할 수 없으므로 앱에서 텍스트를 음성으로 처리하는 다른 방법을 살펴볼 수 있습니다. 몇 가지 옵션을 알려줄 수있는 blog post입니다.

오디오 레코드는 다음과 같습니다. 대신 코드에서 AudioSource.MIC을 사용하면 더 나은 행운을 누릴 수 있습니다. MediaRecorder을 직접 테스트하지는 않았지만 다른 제안은 AudioRecord을 직접 사용하는 것입니다. 특히 오디오 데이터를 처리하기 위해 다른 서비스로 전달하는 것이 목표이기 때문에 (그리고 아마도 파일에 저장하는 것이 아니라). 이렇게하면 샘플링 된 각 오디오 버퍼로 작업 할 수 있습니다. 내가 RPI 3 작업 음성 인식을 늘어 놓던

// Audio recording parameters 
private static final int SAMPLE_RATE = 44100; 
private static final int ENCODING_FORMAT = AudioFormat.ENCODING_PCM_16BIT; 
private static final int CHANNEL_FORMAT = AudioFormat.CHANNEL_IN_MONO; 

private AudioRecord mRecorder; 
private final int mBufferSize = AudioRecord 
     .getMinBufferSize(SAMPLE_RATE, CHANNEL_FORMAT, ENCODING_FORMAT); 

public void initAudioRecorder() { 
    if (mRecorder == null) { 
     try { 
      mRecorder = new AudioRecord.Builder() 
        .setAudioSource(MediaRecorder.AudioSource.MIC) 
        .setAudioFormat(new AudioFormat.Builder() 
          .setEncoding(ENCODING_FORMAT) 
          .setSampleRate(SAMPLE_RATE) 
          .setChannelMask(CHANNEL_FORMAT) 
          .build()) 
        .setBufferSizeInBytes(2*mBufferSize) 
        .build(); 
      mRecorder.startRecording(); 
     } catch (UnsupportedOperationException e) { 
      Log.w(TAG, "Unable to initialize recording", e); 
     } 
    } 
} 
+0

위 코드는 이전에 시도했지만 작동하지 않았습니다. 그러나 블로그는 내가 원하는 것입니다. 그러나 inbuilt 음성 API (사례 # 1) 또는 Google 클라우드 음성 API (사례 # 2) 중 하나를 사용하십시오. 사례 # 1 이전에 시도했지만 내 APk 기본 장치가 누락되었습니다. 케이스 # 2에서 내가 붙어있는 오디오를 먼저 캡처해야합니다! –

0

/것들 미리보기 2/USB 마이크/Kõnele (https://github.com/Kaljurand/K6nele)에서 : 다음은 오디오 녹음을 초기화 안드로이드 것들 장치에서 작동해야 무언가의 예입니다 다른 단어 : Things Preview 2는 오디오 녹음 및 SpeechRecognition을 지원합니다 (나는 SpeechRecognizer을 의미한다고 가정 함).

Kõnele은 상자 밖으로 에스토니아어를 인식합니다. 다른 언어를 원할 경우 Kõnele 환경 설정에서 서버 URL을 변경하거나 "ee.ioc.phon.android.extra.SERVER_URL"EXTRA로 대체하고이 URL에 인식 서버를 설정해야합니다. 서버를 시작하는 가장 쉬운 방법은 여기에 설명되어 있습니다. https://github.com/jcsilva/docker-kaldi-gstreamer-server

관련 문제