Google Dialogflow CX | StreamingDetectIntent не обрабатывает аудио после сопоставления с первым намерением

# #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 в той же теме.