播放 dialogflowAPI 音频响应的网络应用程序
web application which plays dialogflowAPI's audio response
我想在我的网络应用程序中集成一个 HTML5 麦克风,录制音频并将其发送到 (Node.js) 后端,使用 Dialogflow API 获取音频, 和 return 音频结果给客户端在浏览器中播放。
(我为 Linux、Debian 10.3 和 Google Chrome 浏览器使用 Windows 10、Windows 子系统。
)
我找到了一个 github 项目,这正是我想要做的。 https://github.com/dialogflow/selfservicekiosk-audio-streaming
这是 Lee Boonstra 女士的 Medium 博客。 (https://medium.com/google-cloud/building-your-own-conversational-voice-ai-with-dialogflow-speech-to-text-in-web-apps-part-i-b92770bd8b47) 她开发了这个项目。 (非常感谢您,Boonstra 女士!)她非常准确地解释了这个项目。
此项目包含自助服务亭应用程序和 6 个简单示例。
我尝试了所有这些。
selfservicekiosk 应用程序和简单示例 1、2、4、5、6 运行良好,但示例 3 无效。
不幸的是,example3 是我想要做的。
https://github.com/dialogflow/selfservicekiosk-audio-streaming/tree/master/examples
这些是我尝试示例 3 时的结果。
这是终端。
这是 Chrome 的控制台。
我关注这条消息。
(index):59
ArrayBuffer(0)
[[Int8Array]]: Int8Array []
[[Int16Array]]: Int16Array []
[[Int32Array]]: Int32Array []
[[Uint8Array]]: Uint8Array []
我认为浏览器可以获取音频结果,但无法播放。
首先,我检查了计算机的麦克风设置和浏览器的 Web App Activity & Voice/Audio(https://myaccount.google.com/activitycontrols)。
两者都已启用。
接下来,我检查 example3.html 文件并找到似乎在我的环境中不起作用的代码。但是,我不知道怎么改。
/*
* When working with Dialogflow and Dialogflow matched an intent,
* and returned an audio buffer. Play this output.
*/
function playOutput(arrayBuffer){
let audioContext = new AudioContext();
let outputSource;
try {
if(arrayBuffer.byteLength > 0){
audioContext.decodeAudioData(arrayBuffer,
function(buffer){
audioContext.resume();
outputSource = audioContext.createBufferSource();
outputSource.connect(audioContext.destination);
outputSource.buffer = buffer;
outputSource.start(0);
},
function(){
console.log(arguments);
});
}
} catch(e) {
console.log(e);
}
}
你能给我什么建议吗?提前谢谢你。
我想检查音频结果,所以我打开了 simpleserver.js 文件并更改了
async function detectIntent(audio){}
https://github.com/dialogflow/selfservicekiosk-audio-streaming/blob/master/examples/simpleserver.js
async function detectIntent(audio){
request.inputAudio = audio;
console.log(request);
const responses = await sessionClient.detectIntent(request);
const audioFile = responses[0].outputAudio;
util.promisify(fs.writeFile)('test.wav', audioFile, 'binary');
console.log('completed');
}
我打开 test.wav 文件并确保 dialogflow 给我音频结果。
嗯,这很奇怪,因为我确实在我的 Windows 10 机器上克隆了一个新的 repo(没有更改代码),并使用 Chrome (79.0.3945.130) 对其进行了测试,它只是工作了。您的问题确实是播放部分,因为您的浏览器确实收到了音频缓冲区。
由于您提到 SelfServiceKiosk 应用程序有效,而示例 3 无效;也许您可以将 playOutput 函数替换为 SelfServiceKiosk 应用程序使用的函数?您可以在此处找到它,但请注意代码是用 TypeScript 编写的。
https://github.com/dialogflow/selfservicekiosk-audio-streaming/blob/master/client/src/app/dialogflow/dialogflow.component.ts
我知道这段代码有点不同,我想我是按照恢复和开始的方式编写的,否则 IOS 似乎会阻止自动播放。希望对您有所帮助?
我在 simpleserver.js 文件的 setupDialogflow()
函数中添加了这一行。
outputAudioConfig: {
audioEncoding: 'OUTPUT_AUDIO_ENCODING_LINEAR_16'
},
现在我可以从浏览器获取语音了。
我想在我的网络应用程序中集成一个 HTML5 麦克风,录制音频并将其发送到 (Node.js) 后端,使用 Dialogflow API 获取音频, 和 return 音频结果给客户端在浏览器中播放。
(我为 Linux、Debian 10.3 和 Google Chrome 浏览器使用 Windows 10、Windows 子系统。 )
我找到了一个 github 项目,这正是我想要做的。 https://github.com/dialogflow/selfservicekiosk-audio-streaming
这是 Lee Boonstra 女士的 Medium 博客。 (https://medium.com/google-cloud/building-your-own-conversational-voice-ai-with-dialogflow-speech-to-text-in-web-apps-part-i-b92770bd8b47) 她开发了这个项目。 (非常感谢您,Boonstra 女士!)她非常准确地解释了这个项目。
此项目包含自助服务亭应用程序和 6 个简单示例。 我尝试了所有这些。 selfservicekiosk 应用程序和简单示例 1、2、4、5、6 运行良好,但示例 3 无效。 不幸的是,example3 是我想要做的。 https://github.com/dialogflow/selfservicekiosk-audio-streaming/tree/master/examples
这些是我尝试示例 3 时的结果。
这是终端。
我关注这条消息。
(index):59
ArrayBuffer(0)
[[Int8Array]]: Int8Array []
[[Int16Array]]: Int16Array []
[[Int32Array]]: Int32Array []
[[Uint8Array]]: Uint8Array []
我认为浏览器可以获取音频结果,但无法播放。
首先,我检查了计算机的麦克风设置和浏览器的 Web App Activity & Voice/Audio(https://myaccount.google.com/activitycontrols)。
两者都已启用。
接下来,我检查 example3.html 文件并找到似乎在我的环境中不起作用的代码。但是,我不知道怎么改。
/*
* When working with Dialogflow and Dialogflow matched an intent,
* and returned an audio buffer. Play this output.
*/
function playOutput(arrayBuffer){
let audioContext = new AudioContext();
let outputSource;
try {
if(arrayBuffer.byteLength > 0){
audioContext.decodeAudioData(arrayBuffer,
function(buffer){
audioContext.resume();
outputSource = audioContext.createBufferSource();
outputSource.connect(audioContext.destination);
outputSource.buffer = buffer;
outputSource.start(0);
},
function(){
console.log(arguments);
});
}
} catch(e) {
console.log(e);
}
}
你能给我什么建议吗?提前谢谢你。
我想检查音频结果,所以我打开了 simpleserver.js 文件并更改了
async function detectIntent(audio){}
https://github.com/dialogflow/selfservicekiosk-audio-streaming/blob/master/examples/simpleserver.js
async function detectIntent(audio){
request.inputAudio = audio;
console.log(request);
const responses = await sessionClient.detectIntent(request);
const audioFile = responses[0].outputAudio;
util.promisify(fs.writeFile)('test.wav', audioFile, 'binary');
console.log('completed');
}
我打开 test.wav 文件并确保 dialogflow 给我音频结果。
嗯,这很奇怪,因为我确实在我的 Windows 10 机器上克隆了一个新的 repo(没有更改代码),并使用 Chrome (79.0.3945.130) 对其进行了测试,它只是工作了。您的问题确实是播放部分,因为您的浏览器确实收到了音频缓冲区。
由于您提到 SelfServiceKiosk 应用程序有效,而示例 3 无效;也许您可以将 playOutput 函数替换为 SelfServiceKiosk 应用程序使用的函数?您可以在此处找到它,但请注意代码是用 TypeScript 编写的。
https://github.com/dialogflow/selfservicekiosk-audio-streaming/blob/master/client/src/app/dialogflow/dialogflow.component.ts
我知道这段代码有点不同,我想我是按照恢复和开始的方式编写的,否则 IOS 似乎会阻止自动播放。希望对您有所帮助?
我在 simpleserver.js 文件的 setupDialogflow()
函数中添加了这一行。
outputAudioConfig: {
audioEncoding: 'OUTPUT_AUDIO_ENCODING_LINEAR_16'
},
现在我可以从浏览器获取语音了。