使用浏览器中的块将音频流传输到Dialogflow

时间:2019-03-15 13:51:38

标签: node.js socket.io dialogflow mediastream

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

0 个答案:

没有答案