2016-07-30 106 views
6

一般来说,我想使用亚马逊的avs sdk来解析音频文件,而不仅仅是麦克风录音。使用亚马逊的Alexa AVS SDK解析音频文件

使用OSX 10.11.6。

所以首先我下载了​​Alexa Voice Service Sample Apphttps://developer.amazon.com/public/solutions/alexa/alexa-voice-service/docs/java-client-sample

然后我配置和执行companionService(的NodeJS),然后Java客户端和它的作品..我说麦克风的东西和Alexa响应。现在我想添加一个加载声音的功能,并从电脑而不是麦克风播放它。

所以首先我创建了一个函数来添加一个按钮到用户界面。 所以我编辑samples/javaclient/src/main/java/com/amazon/alexa/avs/AVSApp.java。我复制,增加了“开始监听”按钮的功能,并修改了它:

private void addBrowseField() { 
    final RecordingRMSListener rmsListener = this; 
    browseButton = new JButton(BROWSE_LABEL); 
    browseButton.setEnabled(true); 
    browseButton.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      controller.onUserActivity(); 
      if (browseButton.getText().equals(BROWSE_LABEL)) { // if in idle mode 
       browseButton.setText(BROWSE_STOP_LABEL); 
       RequestListener requestListener = new RequestListener() { 

        @Override 
        public void onRequestSuccess() { 
         finishProcessing(); 
        } 

        @Override 
        public void onRequestError(Throwable e) { 
         log.error("An error occured creating speech request", e); 
         JOptionPane.showMessageDialog(getContentPane(), e.getMessage(), "Error", 
           JOptionPane.ERROR_MESSAGE); 
         browseButton.doClick(); 
         finishProcessing(); 
        } 
       }; 

       controller.startFileLoading("/Users/ufk/Desktop/eli3.raw", requestListener); 
       // controller.stopRecording(); /// stop the recording so the request can complete 
      } else { 
       browseButton.setText(BROWSE_LABEL); 
       controller.stopRecording(); 
      } 
     } 
    }); 
    getContentPane().add(browseButton); 
} 

然后我说这个功能在私人AVSApp函数的执行:

private AVSApp(DeviceConfig config) throws Exception { 
... 
     addBrowseField(); 
... 
} 

确定现在在...我的新addBrowseField()函数我打电话给我在控制器中创建的一个新函数,称为startFileRecording。 所以我修改 samples/javaclient/src/main/java/com/amazon/alexa/avs/AVSController.java

通过复制startRecording功能startFileLoading并修改它:

public void startFileLoading(String path,RequestListener requestListener) { 

    try { 
     InputStream in = (InputStream)new BufferedInputStream(new FileInputStream(new File(path))); 
     String dialogRequestId = dialogRequestIdAuthority.createNewDialogRequestId(); 

     RequestBody body = RequestFactory.createSpeechRegonizerRecognizeRequest(dialogRequestId, 
       PROFILE, FORMAT, player.getPlaybackState(), player.getSpeechState(), 
       alertManager.getState(), player.getVolumeState()); 

     dependentQueue.clear(); 

     avsClient.sendEvent(body, in, requestListener, AUDIO_TYPE); 

     speechRequestAudioPlayerPauseController.startSpeechRequest(); 

    } catch (Exception e) { 
     player.playMp3FromResource(ERROR_SOUND); 
     requestListener.onRequestError(e); 
    } 
} 

现在你可以看到,我使用的文件eli3.raw。我记录自己说的命令(仅音频),并把它转换与ffmpeg -i eli.m4a -f s16le -ac 1 -acodec pcm_s16le eli3.raw

以LPCM所以我点击,实际上加载eli3.raw音频文件新建Browse按钮,几秒钟我点击Stop Browse按钮,并没有真正发生。

我得到没有Java错误,没有警告没有什么。

我对所有的avs sdk都很陌生,所以我可能做错了什么。只是不知道是什么。

回答

0

ok ..所以音频文件的格式是错误的。对这些标志使用ffmpeg:ffmpeg -i eli.m4a -acodec pcm_s16le -ac 1 -ar 16000 eli.wav解决了这个问题。