2

我们正在对 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 });
    }
  });
4

0 回答 0