2016-07-30 175 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解決了這個問題。