Node.js 从浏览器将音频流到带有块的Dialogflow
我们正在对Dialogflow进行一些实验,目前我们已经完全停止了。我们正在尝试设置一个浏览器客户端,该客户端通过Dialogflow npm包的节点v2beta1版本将音频分块流式传输到Dialogflow。我们按照这个示例来运行它,当我们使用节点服务器通过额外软件(sox)拾取声音时,它可以正常工作,但我们希望从浏览器中进行流式传输。因此,我们设置了一个小代码段,用于从麦克风中提取媒体流 当数据事件触发End时,我们会得到一个区块(arraybuffer),我们会将其以区块的形式传递给节点服务器 在服务器上,我们遵循以下示例:。唯一不同的是,我们不使用泵来链接流,而是将块写入SessionClientNode.js 从浏览器将音频流到带有块的Dialogflow,node.js,socket.io,dialogflow-es,mediastream,Node.js,Socket.io,Dialogflow Es,Mediastream,我们正在对Dialogflow进行一些实验,目前我们已经完全停止了。我们正在尝试设置一个浏览器客户端,该客户端通过Dialogflow npm包的节点v2beta1版本将音频分块流式传输到Dialogflow。我们按照这个示例来运行它,当我们使用节点服务器通过额外软件(sox)拾取声音时,它可以正常工作,但我们希望从浏览器中进行流式传输。因此,我们设置了一个小代码段,用于从麦克风中提取媒体流 当数据事件触发End时,我们会得到一个区块(arraybuffer),我们会将其以区块的形式传递给节点服
streamingDetectIntent().write({ inputAudio: [chunk] })
在实验过程中,我们收到了几个我们解决的错误。但在这一点上,我们传递了我们的块,并在过程中和最后收到了空的响应
这是向dialogflow传递音频的有效方法,还是我们真的需要设置流?我们不希望将节点服务器用作条目,它需要是浏览器。我们将拥有完全的控制权
客户
import getUserMedia from 'get-user-media-promise';
import MicrophoneStream from 'microphone-stream';
export const startVoiceStream = () => {
const microphoneStream = new MicrophoneStream();
getUserMedia({ video: false, audio: true })
.then(function(micStream) {
microphoneStream.setStream(micStream);
socket.emit('startMicStream');
state.streamingMic = true;
setTimeout(() => {
// Just closing the stream on a timer for now
socket.emit('endMicStream');
}, 5000);
})
.catch(function(error) {
console.log(error);
});
microphoneStream.on('data', function(chunk) {
if (state.streamingMic) {
socket.emit('micStreamData', chunk);
}
});
};
服务器代码要长得多,所以我想我将省略细节,但这些是主要部分
const initialStreamRequest = {
session: sessions.sessionPath,
queryParams: {
session: sessions.sessionPath, //TODO: try to delete
},
queryInput: {
audioConfig: {
audioEncoding: 'AUDIO_ENCODING_LINEAR_16',
sampleRateHertz: '16000',
languageCode: 'en-US',
},
singleUtterance: false
},
};
const startRecognitionStream = socketClient => {
streamIntent = sessions.sessionClient
.streamingDetectIntent()
.on('error', error => {
console.error({ error });
socketClient.emit('streamError', error);
})
.on('data', data => {
socketClient.emit('debug', { message: 'STREAM "ON DATA"', data });
if (data.recognitionResult) {
socketClient.emit(
'playerTranscript',
data.recognitionResult.transcript,
);
console.log(
`#Intermediate transcript : ${data.recognitionResult.transcript}`,
);
} else {
socketClient.emit('streamAudioResponse', data);
}
});
streamIntent.write(initialStreamRequest);
};
socket.on('micStreamData', data => {
if (streamIntent !== null) {
stop = true;
streamIntent.write({ inputAudio: data });
}
});