使用亚马逊的 avs SDK for Alexa 解析音频文件
Using Amazon's avs SDK for Alexa to parse Audio files
总的来说,我想使用亚马逊的 avs sdk for Alexa 来解析音频文件,而不仅仅是麦克风录音。
使用 OSX 10.11.6.
所以我首先从 https://developer.amazon.com/public/solutions/alexa/alexa-voice-service/docs/java-client-sample
下载了 Alexa Voice Service Sample App
然后我配置并执行了 companionService (nodejs),然后是 java 客户端,它工作了。我对着麦克风说了些什么,Alexa 做出了回应。现在我想添加一个功能来加载声音并从计算机播放它,而不仅仅是麦克风。
所以首先我创建了一个函数来向 UI 添加一个按钮。
所以我编辑了 samples/javaclient/src/main/java/com/amazon/alexa/avs/AVSApp.java
。我复制了添加 "Start Listening" 按钮的函数并修改了它:
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
所以我点击了新创建的 Browse
按钮,它实际加载了 eli3.raw
音频文件,几秒钟后我点击了 Stop Browse
按钮,但没有任何反应。
我没有收到 java 错误,没有警告什么都没有。
我是 all avs sdk 的新手,所以我可能做错了什么..只是不知道是什么。
ok..所以音频文件的格式是错误的。使用带有这些标志的 ffmpeg:ffmpeg -i eli.m4a -acodec pcm_s16le -ac 1 -ar 16000 eli.wav
解决了这个问题。
总的来说,我想使用亚马逊的 avs sdk for Alexa 来解析音频文件,而不仅仅是麦克风录音。
使用 OSX 10.11.6.
所以我首先从 https://developer.amazon.com/public/solutions/alexa/alexa-voice-service/docs/java-client-sample
下载了Alexa Voice Service Sample App
然后我配置并执行了 companionService (nodejs),然后是 java 客户端,它工作了。我对着麦克风说了些什么,Alexa 做出了回应。现在我想添加一个功能来加载声音并从计算机播放它,而不仅仅是麦克风。
所以首先我创建了一个函数来向 UI 添加一个按钮。
所以我编辑了 samples/javaclient/src/main/java/com/amazon/alexa/avs/AVSApp.java
。我复制了添加 "Start Listening" 按钮的函数并修改了它:
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
所以我点击了新创建的 Browse
按钮,它实际加载了 eli3.raw
音频文件,几秒钟后我点击了 Stop Browse
按钮,但没有任何反应。
我没有收到 java 错误,没有警告什么都没有。
我是 all avs sdk 的新手,所以我可能做错了什么..只是不知道是什么。
ok..所以音频文件的格式是错误的。使用带有这些标志的 ffmpeg:ffmpeg -i eli.m4a -acodec pcm_s16le -ac 1 -ar 16000 eli.wav
解决了这个问题。