# #node.js #google-cloud-platform #grpc #audio-streaming #dialogflow-cx
Вопрос:
Детали окружающей среды
- ОС: Windows 10, 11. Debian 9 (stretch)
- Node.js версия: 12.18.3, 12.22.1
- версия npm: 7.19.0, 7.15.0
@google-cloud/dialogflow-cx
версия: 2.13.0
Вопрос
StreamingDetectIntent
не обрабатывает звук после сопоставления с первым намерением. Я могу видеть транскрипцию, и она может соответствовать первому намерению, но после сопоставления с первым намерением звук продолжает передаваться, но я не получаю транскрипции, и on('data')
обратный вызов также не запускается. Короче говоря, после сопоставления с первым намерением ничего не происходит
Одна вещь, которая помогла обойти это, заключалась в том, что я должен закончить detectStream
, а затем повторно инициализировать его. Затем все сработало, как и ожидалось.
Шаги по воспроизведению
Я пробовал с const {SessionsClient} = require("@google-cloud/dialogflow-cx");
и const {SessionsClient} = require("@google-cloud/dialogflow-cx").v3;
// Create a stream for the streaming request.
const detectStream = client
.streamingDetectIntent()
.on('error', console.error)
.on('end', (data)=>{
console.log(`streamingDetectIntent: -----End-----: ${JSON.stringify(data)}`);
})
.on('data', data => {
console.log(`streamingDetectIntent: Data: ----------`);
if (data.recognitionResult) {
console.log(`Intermediate Transcript: ${data.recognitionResult.transcript}`);
} else {
console.log('Detected Intent:');
if(!data.detectIntentResponse) return
const result = data.detectIntentResponse.queryResu<
console.log(`User Query: ${result.transcript}`);
for (const message of result.responseMessages) {
if (message.text) {
console.log(`Agent Response: ${message.text.text}`);
}
}
if (result.match.intent) {
console.log(`Matched Intent: ${result.match.intent.displayName}`);
}
console.log(`Current Page: ${result.currentPage.displayName}`);
}
});
const initialStreamRequest = {
session: sessionPath,
queryInput: {
audio: {
config: {
audioEncoding: encoding,
sampleRateHertz: sampleRateHertz,
singleUtterance: true,
},
},
languageCode: languageCode,
}
};
detectStream.write(initialStreamRequest);
Я пробовал передавать аудио через файлы (.wav) и использовать микрофон, но в результате получилось то же самое поведение.
await pump(
recordingStream, // microphone stream <OR> fs.createReadStream(audioFileName),
// Format the audio stream into the request format.
new Transform({
objectMode: true,
transform: (obj, _, next) => {
next(null, {queryInput: {audio: {audio: obj}}});
},
}),
detectStream
);
Я также ссылался на эту реализацию и этот документ на основе rpc, но не смог найти никаких причин, почему это не должно работать.
Спасибо!
Ответ №1:
Это, по-видимому, правильное поведение в соответствии с документацией:
Когда Dialogflow обнаруживает, что голос аудио остановился или приостановлен, он прекращает распознавание речи и отправляет вашему клиенту ответ StreamingDetectIntentResponse с результатом распознавания END_OF_SINGLE_UTTERANCE. Любой звук, отправленный в Dialogflow в потоке после получения END_OF_SINGLE_UTTERANCE, игнорируется Dialogflow.
Так что, похоже, именно поэтому звук StreamingDetectIntent
не обрабатывается после сопоставления с первым намерением. Согласно той же документации:
После закрытия потока ваш клиент должен запустить новый запрос с новым потоком по мере необходимости
Вам следует начать другой поток. Вы также можете проверить другие проблемы github в той же теме.