我们正在对Dialogflow进行一些试验,目前已经完全停止。我们正在尝试建立一个浏览器客户端,该客户端将通过dialogflow npm软件包的节点v2beta1版本将音频块流式传输到Dialogflow。我们遵循了该示例以使其运行,并且当我们使用节点服务器通过额外的软件(sox)拾取声音时,它可以正常工作,但是我们希望从浏览器中进行流式传输。因此,我们建立了一个小的代码段,以从麦克风中拾取MediaStream。
当数据事件触发结束时,我们得到一个块(一个数组缓冲区),我们以块的形式传递给我们的节点服务器。
在服务器上,我们遵循以下示例:https://cloud.google.com/dialogflow-enterprise/docs/detect-intent-stream#detect-intent-text-nodejs。唯一不同的是,我们无需使用泵来链接流,而只是将自己的块写入sessionClient。
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 });
}
});