首页 > 解决方案 > api.ai 进程开始监听时录制音频

问题描述

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

我可以用下面的代码片段来做这件事,但问题是我的应用程序在 vivo v9 (sdk 27​​)、poco f1 (sdk 28) 上正常工作,但是当我在模拟器上运行它时崩溃。

我调试代码并发现如果我评论 recorder.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 格式)。

标签: androidgoogle-cloud-platformdialogflow-es

解决方案


推荐阅读