我们正在对 Dialogflow 进行一些试验,目前我们已经完全停止了。我们正在尝试设置一个浏览器客户端,通过 dialogflow npm 包的 node v2beta1 版本将音频分块流式传输到 Dialogflow。我们按照示例运行它,当我们使用节点服务器通过额外的软件 (sox) 接收声音时它工作正常,但我们想从浏览器流式传输。因此,我们设置了一个小代码片段,用于从麦克风中获取 MediaStream。
当数据事件触发时,我们得到一个块(一个数组缓冲区),我们以块的形式将其传递给我们的节点服务器。
在服务器上,我们遵循了以下示例:https ://cloud.google.com/dialogflow-enterprise/docs/detect-intent-stream#detect-intent-text-nodejs 。我们唯一不同的是,我们没有使用泵来链接流,而是将我们的块写入会话客户端。
streamingDetectIntent().write({ inputAudio: [chunk] })
在实验过程中,我们收到了几个我们解决的错误。但是在这一点上,我们通过我们的块并在期间和结束时收到空响应。
这是将音频传递给对话流的有效方式,还是我们真的需要设置流?我们不想使用节点服务器作为入口,它需要是浏览器。我们将拥有完全的控制权。
客户
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 });
}
});