api.ai进程开始监听时录制音频

时间:2019-05-28 06:25:23

标签: android google-cloud-platform dialogflow

我正在使用api.ai(Google对话流)服务来检测聊天应用程序中的意图。我还想记录音频文件并将其发送到后端服务器。

我可以使用以下代码段执行此操作,但是问题是我的应用程序可以在vivo v9(sdk 27​​),poco f1(sdk 28)上正常运行, 但是当我在模拟器上运行它时会崩溃。

我调试了代码,发现如果我注释了records.startListening()方法,那么我的应用程序就可以在所有设备上正常工作,但是在这种情况下,我无法记录音频文件。

这是我的代码段:

public class ChatActivity extends AppCompatActivity implements View.OnClickListener, AIListener{
    private AIService aiService;
    private static final int REQUEST_INTERNET = 200;
    AudioRecord recorder;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_chat);
    //GCP STRAMING INITIALIZATION
    final AIConfiguration config = new AIConfiguration("******************",
            AIConfiguration.SupportedLanguages.English,
            AIConfiguration.RecognitionEngine.System);

    aiService = AIService.getService(this, config);
    aiService.setListener(this);
    }

  //GCP STREAMING CODE
  public void createFile() {
    //Creating file
    File dir = Environment.getExternalStorageDirectory();
    try {
        audiofile = File.createTempFile("sound", ".wav", dir);
    } catch (IOException e) {
        Log.e("I", "external storage access error");

        }
    }

   @Override
   public void onResult(AIResponse response) {

    Result result = response.getResult();

    Log.d("I", "Query: " + result.getResolvedQuery() +
            "\nAction: " + result.getAction() +
            "\nParameters: " + parameterString);


}


@Override
public void onError(AIError error) {
    Log.d("Error", error + "");
    aiService.cancel();


}

@Override
public void onAudioLevel(float level) {

}

@Override
public void onListeningStarted() {



    try {

        recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,
                RECORDER_SAMPLERATE, RECORDER_CHANNELS, RECORDER_AUDIO_ENCODING, bufferSize);

        int i = recorder.getState();
        if (i == 1)
            Thread.sleep(1000);
        recorder.startRecording();
        isRecording = true;

        recordingThread = new Thread(new Runnable() {

            @Override
            public void run() {

                writeAudioDataToFile();
            }
        }, "AudioRecorder Thread");

        recordingThread.start();

    } catch (Exception e) {
        e.printStackTrace();
    }


}

@Override
public void onListeningCanceled() {
    try {
        aiService.cancel();

    } catch (Exception e) {
        e.printStackTrace();
    }
}

@Override
public void onListeningFinished() {

    if (null != recorder) {
        isRecording = false;

        int i = recorder.getState();
        if (i == 1) {
            recorder.stop();
        }
        recorder.release();

        recorder = null;
        recordingThread = null;
    }

    copyWaveFile(getTempFilename(), getFilename());
    deleteTempFile();


    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    try {
        File initialFile = new File(audioPath);
        //   File initialFile = new File("/storage/sdcard1/download/01 - Baarish (128 Kbps) - DownloadMing.SE.mp3");
        InputStream targetStream = new FileInputStream(initialFile);
        byte[] buffer = new byte[targetStream.available()];
        int bytesRead;
        while ((bytesRead = targetStream.read(buffer)) > 0) {
            baos.write(buffer, 0, bytesRead);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

    //upload to server
    uploadRecording(baos.toByteArray());



    }
} 

我想使用api.ai服务,也想同时录制音频文件(.wav格式)。

0 个答案:

没有答案